java中动态数组的详细完成【JAVA教程】,java,动态数组,实现
作者:搜教程发布时间:2019-12-02分类:JAVA教程浏览:33评论:0
导读:声明:data为数组名。size为数组中末了一个元素的下一个位置。完成动态数组的缘由:由于java中的数组是静态的,在new数组时就须要指定数组的大小,假如须要...
声明:
data为数组名。
size为数组中末了一个元素的下一个位置。
完成动态数组的缘由:
由于java中的数组是静态的,在new数组时就须要指定数组的大小,假如须要存储的元素为未知的个数,设置空间过大会形成糟蹋,设置空间过小会没法存入悉数数据,我们应用本身写的resize()要领,便能够完成自动扩容,不再忧郁数组容量的问题。
须要自动扩容或自动缩容的时刻平常是数组满了或数组空余空间过量的时刻,多发生在增加和删除操纵中。
当size == data.length
的时刻示意数组已满,挪用resize(int newCapacity)
要领,参数传入2*data.length
,意为新创建的数组长度为原数组的二倍。
相干视频教程引荐:java课程
当size == data.length /4
而且data.length/2 != 0
的时刻,挪用resize
要领举行缩容。
在ArrayList的自动扩容要领中参数默以为1.5*capacity
。
在resize()要领完成中new了一个新的名为newData
的数组用来吸收原数组中的元素。应用for轮回将数组中的元素举行转移。
add要领完成
//向指定位置增加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; }
remove要领完成
//删除元素,并返回被删除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; }
resize要领完成
private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; }
Array类
package array; public class Array<E> { private E[] data; private int size; @SuppressWarnings("unchecked") public Array(int capacity){ data = (E[]) new Object[capacity]; size = 0; } public Array(){ this(10); } public int getSize(){ return size; } public int getCapacity(){ return data.length; } public boolean isEmpty(){ return size == 0; } //向第一个位置增加一个元素 public void addFirst(E e){ add(0,e); } //向末了一个位置增加一个元素 public void addLast(E e){ add(size,e); } //向指定位置增加元素e public void add(int index,E e){ if(index<0||index>size){ throw new IllegalArgumentException("AddLast failed.Require index error"); } if(size == data.length){ resize(2*data.length); } for (int i = size-1; i >= index; i--) { data[i+1] = data[i]; } data[index] = e; size++; } //猎取index位置的元素e public E get(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } return data[index]; } //修正index索引位置的元素e public void set(int index, E e){ if(index<0 || index >=size){ throw new IllegalArgumentException("Get failed. Index is illegal"); } data[index] = e; } //推断元素是不是存在于数组中 public boolean contains(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return true; } } return false; } //找到元素并返回索引 public int find(E e){ for (int i = 0; i < size; i++) { if(data[i].equals(e)){ return i; } } return -1; } //删除元素,并返回被删除的元素 public E remove(int index){ if(index<0 || index >=size){ throw new IllegalArgumentException("Remove failed. Index is illegal"); } E ret = data[index]; for (int i = index+1; i < size; i++) { data[i-1] = data[i]; } size--; data[size] = null;//loitering objects != memory leak if(size == data.length /4 && data.length/2 != 0){ resize(data.length/2); } return ret; } public E removeFirst(){ return remove(0); } public E removeLast(){ return remove(size-1); } //从数组中删除元素e public void removeElement(E e){ int index = find(e); if(index != -1){ remove(index); } } @Override public String toString(){ StringBuilder res = new StringBuilder(); res.append(String.format("Array:size = %d ,capacity = %d\n",size,data.length)); res.append('['); for (int i = 0; i < size; i++) { res.append(data[i]); if(i != size-1){ res.append(","); } } res.append(']'); return res.toString(); } private void resize(int newCapacity){ E[] newData = (E[])new Object[newCapacity]; for (int i = 0; i < size; i++) { newData[i] = data[i]; } data = newData; } }
Main测试:
package array; public class Main { public static void main(String[] args){ Array<Integer> arr = new Array<>(); for (int i = 0; i < 10; i++) { arr.addLast(i); } System.out.println(arr); arr.add(1, 100); System.out.println(arr); arr.addFirst(-1); System.out.println(arr); arr.set(0, 1); System.out.println(arr); } }
更多相干文章教程请接见:java开发入门
以上就是java中动态数组的细致完成的细致内容,更多请关注ki4网别的相干文章!
相关推荐
- java经典面试题集锦(五)_JAVA教程,java,面试题
- java中的换行符是什么_JAVA教程,java,换行符
- Java中变量必须先定义后使用么_JAVA教程,java,变量
- java中怎么定义接口_JAVA教程,java,接口
- java中静态代码块有什么特点_JAVA教程,java,静态代码块
- java中return语句有什么作用_JAVA教程,java,return
- Java对文件的读写操作(图文详解)_JAVA教程,java
- java经典面试题集锦(四)_JAVA教程,java,面试题
- 八种基本数据类型分别是什么?_JAVA教程,java,基本数据类型
- java如何将字符串转为数组_JAVA教程,java,字符串,数组
你 发表评论:
欢迎- JAVA教程排行
-
- 1接口中只能定义常量和抽象方法,对么_JAVA教程,接口,常量,抽象方法
- 2java文件不能删除文件怎么办_JAVA教程,java
- 3系统提示javac:找不到文件_JAVA教程,系统,提示,javac,找不到,文件
- 4java中sleep的用法是什么?_JAVA教程,java,sleep
- 5java图片显示不出来怎么办_JAVA教程,java
- 6java后台乱码怎么办_JAVA教程,java
- 7javascript和java的区别是什么_JAVA教程,javascript,java
- 8java eclipse无法运行怎么办_JAVA教程,java
- 9Java中split()方法怎么用_JAVA教程,java,spilt,用法
- 最新文章
- 广而告之