Array的实现——java语言

简介: Array的实现——java语言

1.只能存放int的自定义数组类

publicclassArray {

   privateint[] data;

   privateintsize;//data[size]指向数组中第一个没有数据的位置

   //传入数组的容量capacity构造Array

   publicArray(intcapacity){

       data=newint[capacity];

       size=0;

   }

   //无参构造,默认数组capacity为10

   publicArray(){

       data=newint[10];

       size=0;

   }

   //获取数组已有长度

   publicintgetSize(){

       returnsize;

   }

   //获取数组容量

   publicintgetCapacity(){

       returndata.length;

   }

   //判断数组是否为空

   publicbooleanisEmpty(){

       returnsize==0;

   }

   //向数组尾部添加数据

   publicvoidaddLast(inte){

       add(size,e);

   }

   //向数组头添加数据

   publicvoidaddFirst(inte){

       add(0,e);

   }

   //向数组中任意一个位置添加数据

   publicvoidadd(intindex,inte){

       if(data.length==size)

           thrownewIllegalArgumentException("array is full");

       if(index<0||index>size)

           thrownewIllegalArgumentException("array is full");

       for(inti=size-1;i>=index;i--){

           data[i+1]=data[i];

       }

       data[index]=e;

       size++;

   }

   //获取某个索引元素

   publicintget(intindex,inte){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       returndata[index];

   }

   //设置某个索引位置元素

   publicvoidset(intindex,inte){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       data[index]=e;

   }

   //判断数组是否包含某个元素

   publicbooleancontains(inte){

       for(inti=0;i<size;i++){

           if(data[i]==e)

               returntrue;

       }

       returnfalse;

   }

   //查找某个元素并返回索引,不存在则返回-1

   publicintfind(inte){

       for(inti=0;i<size;i++){

           if(data[i]==e)

               returni;

       }

       return-1;

   }

   //删除索引位置元素并返回被删元素值

   publicintremove(intindex){

       inttem=data[index];

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       for(inti=index+1;i<size;i++)

           data[i-1]=data[i];

       size--;

       returntem;

   }

   //删除指定数值的元素

   publicvoidremoveElement(inte){

       intindex=find(e);

       if(index!=-1)

           remove(index);

   }

   @Override

   publicStringtoString(){

       StringBuildersb=newStringBuilder();

       sb.append(String.format("Array: size=%d capacity=%d\n", size,data.length));

       sb.append("[");

       for(inti=0;i<size;i++){

           sb.append(data[i]);

           if(i!=size-1)

               sb.append(", ");

       }

       sb.append("]");

       returnsb.toString();

   }

}

2.泛型化数组

publicclassArray<E> {

   privateE[] data;

   privateintsize;//data[size]指向数组中第一个没有数据的位置

   //传入数组的容量capacity构造Array

   publicArray(intcapacity){

       //data=new E[capacity];这样子new不对

       data=(E[]) newObject[capacity];

       size=0;

   }

   //无参构造,默认数组capacity为10

   publicArray(){

       //data=new E[10];

       data= (E[]) newObject[10];

       size=0;

   }

   //获取数组已有长度

   publicintgetSize(){

       returnsize;

   }

   //获取数组容量

   publicintgetCapacity(){

       returndata.length;

   }

   //判断数组是否为空

   publicbooleanisEmpty(){

       returnsize==0;

   }

   //向数组尾部添加数据

   publicvoidaddLast(Ee){

       add(size,e);

   }

   //向数组头添加数据

   publicvoidaddFirst(Ee){

       add(0,e);

   }

   //向数组中任意一个位置添加数据

   publicvoidadd(intindex,Ee){

       if(data.length==size)

           thrownewIllegalArgumentException("array is full");

       if(index<0||index>size)

           thrownewIllegalArgumentException("array is full");

       for(inti=size-1;i>=index;i--){

           data[i+1]=data[i];

       }

       data[index]=e;

       size++;

   }

   //获取某个索引元素

   publicEget(intindex,Ee){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       returndata[index];

   }

   //设置某个索引位置元素

   publicvoidset(intindex,Ee){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       data[index]=e;

   }

   //判断数组是否包含某个元素

   publicbooleancontains(Ee){

       for(inti=0;i<size;i++){

           //if(data[i]==e)

           //==为引用比较

           //equals为值比较,对于对象来说,进行值比较

           if (data[i].equals(e))

               returntrue;

       }

       returnfalse;

   }

   //查找某个元素并返回索引,不存在则返回-1

   publicintfind(Ee){

       for(inti=0;i<size;i++){

           //if(data[i]==e)

           if (data[i].equals(e))

               returni;

       }

       return-1;

   }

   //删除索引位置元素并返回被删元素值

   publicEremove(intindex){

       Etem=data[index];

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       for(inti=index+1;i<size;i++)

           data[i-1]=data[i];

       size--;

       returntem;

   }

   //删除指定数值的元素

   publicvoidremoveElement(Ee){

       intindex=find(e);

       if(index!=-1)

           remove(index);

   }

   @Override

   publicStringtoString(){

       StringBuildersb=newStringBuilder();

       sb.append(String.format("Array: size=%d capacity=%d\n", size,data.length));

       sb.append("[");

       for(inti=0;i<size;i++){

           sb.append(data[i]);

           if(i!=size-1)

               sb.append(", ");

       }

       sb.append("]");

       returnsb.toString();

   }

}

3.动态数组

  //当数组满时进行扩容

   privatevoidresize(intnewCapacity){

       E[] newData=(E[])newObject[newCapacity];

       for (inti=0;i<size;i++)

           newData[i]=data[i];

       data=newData;

   }

       //当元素减少到一半时,进行缩容

       if (size==data.length/2)

           resize(data.length/2);

       //当数组满了,进行扩容

       if(data.length==size)

           resize(2*data.length);

       

publicclassArray<E> {

   privateE[] data;

   privateintsize;//data[size]指向数组中第一个没有数据的位置

   //传入数组的容量capacity构造Array

   publicArray(intcapacity){

       //data=new E[capacity];这样子new不对

       data=(E[]) newObject[capacity];

       size=0;

   }

   //无参构造,默认数组capacity为10

   publicArray(){

       //data=new E[10];

       data= (E[]) newObject[10];

       size=0;

   }

   //获取数组已有长度

   publicintgetSize(){

       returnsize;

   }

   //获取数组容量

   publicintgetCapacity(){

       returndata.length;

   }

   //判断数组是否为空

   publicbooleanisEmpty(){

       returnsize==0;

   }

   //向数组尾部添加数据

   publicvoidaddLast(Ee){

       add(size,e);

   }

   //向数组头添加数据

   publicvoidaddFirst(Ee){

       add(0,e);

   }

   //向数组中任意一个位置添加数据

   publicvoidadd(intindex,Ee){

       if(index<0||index>size)

           thrownewIllegalArgumentException("error");

       //当数组满了,进行扩容

       if(data.length==size)

           resize(2*data.length);

       for(inti=size-1;i>=index;i--){

           data[i+1]=data[i];

       }

       data[index]=e;

       size++;

   }

   //获取某个索引元素

   publicEget(intindex,Ee){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       returndata[index];

   }

   //设置某个索引位置元素

   publicvoidset(intindex,Ee){

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       data[index]=e;

   }

   //判断数组是否包含某个元素

   publicbooleancontains(Ee){

       for(inti=0;i<size;i++){

           //if(data[i]==e)

           //==为引用比较

           //equals为值比较,对于对象来说,进行值比较

           if (data[i].equals(e))

               returntrue;

       }

       returnfalse;

   }

   //查找某个元素并返回索引,不存在则返回-1

   publicintfind(Ee){

       for(inti=0;i<size;i++){

           //if(data[i]==e)

           if (data[i].equals(e))

               returni;

       }

       return-1;

   }

   //删除索引位置元素并返回被删元素值

   publicEremove(intindex){

       Etem=data[index];

       if(index<0||index>=size)

           thrownewIllegalArgumentException("index error");

       for(inti=index+1;i<size;i++)

           data[i-1]=data[i];

       size--;

       //当元素减少到一半时,进行缩容

       if (size==data.length/2)

           resize(data.length/2);

       returntem;

   }

   //删除指定数值的元素

   publicvoidremoveElement(Ee){

       intindex=find(e);

       if(index!=-1)

           remove(index);

   }

   @Override

   publicStringtoString(){

       StringBuildersb=newStringBuilder();

       sb.append(String.format("Array: size=%d capacity=%d\n", size,data.length));

       sb.append("[");

       for(inti=0;i<size;i++){

           sb.append(data[i]);

           if(i!=size-1)

               sb.append(", ");

       }

       sb.append("]");

       returnsb.toString();

   }

  //当数组满时进行扩容

   privatevoidresize(intnewCapacity){

       E[] newData=(E[])newObject[newCapacity];

       for (inti=0;i<size;i++)

           newData[i]=data[i];

       data=newData;

   }

}

均摊复杂度

resize()并不是每次add都会触发,可以将其均摊到add步骤上

复杂度震荡

       //当元素减少到一半时,进行缩容

       if (size==data.length/2)

           resize(data.length/2);

       //当数组满了,进行扩容

       if(data.length==size)

           resize(2*data.length);

当数组中的数据一直在data.length/2附近波动,会产生复杂度震荡,操作过于激进,可以使用相对lazy的策略

       //当元素减少到1/4时,进行缩容

       if (size==data.length/4&&data.length/2!=0)

           resize(data.length/2);


目录
相关文章
|
1月前
|
Java Maven
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
该博客文章介绍了如何使用Java Swing中的JFrame创建一个窗体来收集用户输入的内容,并提供了详细的实现步骤和完整代码示例。
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
|
2月前
|
Oracle 安全 Java
Java语言简介及发展
Java语言简介及发展
|
3月前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
81 3
|
2月前
|
算法 Java
Java语言实现最短路径算法(Shortest Path)
Java语言实现最短路径算法(Shortest Path)
42 3
|
1月前
|
Rust JavaScript Java
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
简单对比Java、Python、Go、Rust等常见语言计算斐波拉契数的性能
|
2月前
|
算法 Java 编译器
透视Java语言的究极优化:探索性能的深度
在Java程序员的日常工作中,优化代码性能是一项至关重要的任务。然而,除了传统的性能调优方法外,本文将探讨一些更为深奥的技术,如JIT编译器的内部工作机制、GC算法的进阶应用以及多线程并发模型的优化策略。通过深入了解这些技术背后的原理和实现,我们可以更好地理解如何在Java平台上实现最高效的代码运行。 【7月更文挑战第11天】
64 4
|
3月前
|
Java 容器
双指针(JAVA语言)
双指针(JAVA语言)
双指针(JAVA语言)
|
3月前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
50 3
|
3月前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
45 3
|
2月前
|
Java 大数据 API
Java语言的核心知识点与特性
Java 是一种广泛使用的编程语言,自 1995 年发布以来,它已经成为了企业级应用开发、移动应用开发、大数据处理和云计算等领域的主流技术。
34 0