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);


目录
相关文章
|
17天前
|
数据可视化 Java
Java语言使用DL4J实现图片分类
【6月更文挑战第14天】Java语言使用DL4J实现图片分类
29 3
|
2月前
|
IDE Java Unix
Java语言开发环境配置详解
Java语言开发环境配置详解
100 1
|
2月前
|
安全 Java Unix
Java语言中的日期与时间处理技术
Java语言中的日期与时间处理技术
|
2月前
|
XML JSON 监控
Java语言中的正则表达式技术详解
Java语言中的正则表达式技术详解
|
25天前
|
Java 容器
双指针(JAVA语言)
双指针(JAVA语言)
双指针(JAVA语言)
|
7天前
|
算法 Java
垃圾回收机制(Garbage Collection,GC)是Java语言的一个重要特性,它自动管理程序运行过程中不再使用的内存空间。
【6月更文挑战第24天】Java的GC自动回收不再使用的内存,关注堆中的对象。通过标记-清除、复制、压缩和分代等算法识别无用对象。GC分为Minor、Major和Full类型,针对年轻代、老年代或整个堆进行回收。性能优化涉及算法选择和参数调整。
18 3
|
13天前
|
Java 数据安全/隐私保护 开发者
Java是一种完全支持面向对象编程的语言,其面向对象特性包括封装、继承、多态和抽象等
【6月更文挑战第18天】**面向对象编程(OOP)通过对象封装状态和行为,实现问题域的抽象。Java全面支持OOP,核心特性包括**: - **封装**:保护数据安全,隐藏内部细节。 - **继承**:子类继承父类属性和行为,促进代码重用。 - **多态**:一个接口多种实现,增强灵活性和扩展性。 - **抽象**:通过接口和抽象类抽离共性,简化复杂性。 **Java的OOP便于理解和解决复杂系统问题。**
27 3
|
19天前
|
安全 Java API
Java一分钟之-GraphQL:查询语言与API设计
【6月更文挑战第11天】GraphQL,一种革命性的查询语言,正在改变Web开发中的API构建和使用方式。它允许客户端按需请求数据,减少冗余,提升性能。本文概述了GraphQL的核心理念,如声明式查询、强类型和统一入口,并讨论了Java开发者常遇问题:过度查询、Schema设计和安全性。解决方案包括使用Dataloader、优化Schema和实现授权机制。通过理解原理、关注性能、重视安全和持续实践,开发者能更好地利用GraphQL构建高效API。
25 2
|
22天前
|
机器学习/深度学习 Java 开发者
Python vs. Java:语言之争的终结
【6月更文挑战第8天】Python与Java,两种影响力巨大的编程语言,各有千秋。Python以简洁语法和强大库支持在数据科学、机器学习领域大放异彩,适合快速原型设计;而Java以其稳定性能、跨平台兼容性在大型系统、企业应用中占据一席之地。语言之争实为互补,开发者应根据项目需求选择合适工具,两者和谐共存,共同推动编程技术进步。
|
24天前
|
存储 设计模式 Java
Java语言中反射动态代理接口的解释与演示
Java语言中反射动态代理接口的解释与演示
16 1