선언:
data는 배열의 이름입니다.
size는 배열의 마지막 요소의 다음 위치입니다.
동적 배열을 구현하는 이유:
Java의 배열은 정적이므로 새 배열을 만들 때 저장해야 하는 요소의 개수를 알 수 없는 경우 배열의 크기를 지정해야 합니다. , 너무 많은 공간을 설정하면 낭비가 발생합니다. 설정 공간이 너무 작으면 모든 데이터가 저장되지 않습니다. 우리가 작성한 resize() 메소드를 사용하여 자동 확장을 달성할 수 있으며 더 이상 배열 용량에 대해 걱정할 필요가 없습니다.
자동 확장 또는 자동 축소가 필요한 경우는 일반적으로 배열이 가득 차거나 배열에 여유 공간이 너무 많은 경우이며, 이는 주로 추가 및 삭제 작업 중에 발생합니다.
size == data.length
인 경우 배열이 가득 찼음을 의미하므로 resize(int newCapacity)
메서드를 호출하고 2* 매개변수를 전달하세요. data.length 는 새로 생성된 배열의 길이가 원래 배열 길이의 두 배임을 의미합니다. <code>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
size == data인 경우. length /4
및 data.length/2 != 0
인 경우 resize
메서드를 호출하여 크기를 줄입니다.
ArrayList의 자동 확장 방식에서 매개변수의 기본값은 1.5*capacity
입니다. resize() 메소드 구현에서 원래 배열의 요소를 수신하기 위해 newData
라는 새 배열이 생성됩니다. for 루프를 사용하여 배열의 요소를 전송합니다.
추가 메소드 구현
//向指定位置添加元素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 메소드 구현
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; } }
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에서 동적 배열의 특정 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!