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月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
69 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
Java Maven
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
该博客文章介绍了如何使用Java Swing中的JFrame创建一个窗体来收集用户输入的内容,并提供了详细的实现步骤和完整代码示例。
使用java语言制作一个窗体(弹窗),用来收集用户输入的内容
|
10天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
23 4
|
4月前
|
Oracle 安全 Java
Java语言简介及发展
Java语言简介及发展
|
1月前
|
Java 程序员 编译器
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。
在Java编程中,保留字(如class、int、for等)是具有特定语法意义的预定义词汇,被语言本身占用,不能用作变量名、方法名或类名。本文通过示例详细解析了保留字的定义、作用及与自定义标识符的区别,帮助开发者避免因误用保留字而导致的编译错误,确保代码的正确性和可读性。
42 3
|
1月前
|
移动开发 Java 大数据
深入探索Java语言的核心优势与现代应用实践
【10月更文挑战第10天】深入探索Java语言的核心优势与现代应用实践
51 4
|
1月前
|
存储 Java
Java“(array) <X> Not Initialized” (数组未初始化)错误解决
在Java中,遇到“(array) &lt;X&gt; Not Initialized”(数组未初始化)错误时,表示数组变量已被声明但尚未初始化。解决方法是在使用数组之前,通过指定数组的大小和类型来初始化数组,例如:`int[] arr = new int[5];` 或 `String[] strArr = new String[10];`。
|
1月前
|
存储 Java 数据安全/隐私保护
Java中的域,什么是域?计算机语言中的域是什么?(有代码实例)
文章解释了Java中域的概念,包括实例域、静态域、常量域和局部域,以及它们的特点和使用场景。
54 2
|
1月前
|
Java 数据安全/隐私保护 C++
Java语言关键字
Java语言关键字
22 2
|
1月前
|
分布式计算 安全 Java
Java语言的特点?
Java语言的特点?