
声明:
data为数组名。
size为数组中最后一个元素的下一个位置。
实现动态数组的原因:
因为java中的数组是静态的,在new数组时就需要指定数组的大小,如果需要存储的元素为未知的个数,设置空间过大会造成浪费,设置空间过小会无法存入全部数据,我们利用自己写的resize()方法,便可以实现自动扩容,不再担心数组容量的问题。
立即学习“Java免费学习笔记(深入)”;
需要自动扩容或自动缩容的时候一般是数组满了或数组空余空间过多的时候,多发生在添加和删除操作中。
当size == data.length的时候表示数组已满,调用resize(int newCapacity)方法,参数传入2*data.length,意为新创建的数组长度为原数组的二倍。
相关视频教程推荐:java课程
当size == data.length /4 并且data.length/2 != 0的时候,调用resize方法进行缩容。
专为中小型企业定制的网络办公软件,富有竞争力的十大特性: 1、独创 web服务器、数据库和应用程序全部自动傻瓜安装,建立企业信息中枢 只需3分钟。 2、客户机无需安装专用软件,使用浏览器即可实现全球办公。 3、集成Internet邮件管理组件,提供web方式的远程邮件服务。 4、集成语音会议组件,节省长途话费开支。 5、集成手机短信组件,重要信息可直接发送到员工手机。 6、集成网络硬
0
在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{ 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中动态数组的具体实现的详细内容,更多请关注php中文网其它相关文章!
java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号