> Java > java지도 시간 > Java에서 동적 배열의 특정 구현

Java에서 동적 배열의 특정 구현

王林
풀어 주다: 2019-11-30 16:10:02
앞으로
2483명이 탐색했습니다.

Java에서 동적 배열의 특정 구현

선언:

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

추천 관련 비디오 튜토리얼: java Course

size == data인 경우. length /4data.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 메소드 구현

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;
	}
}
로그인 후 복사
🎜주요 테스트:🎜🎜
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:csdn.net
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿