ホームページ  >  記事  >  Java  >  Java での動的配列の具体的な実装

Java での動的配列の具体的な実装

王林
王林転載
2019-11-30 16:10:022451ブラウズ

Java での動的配列の具体的な実装

ステートメント:

data は配列名です。

size は、配列内の最後の要素の次の位置です。

動的配列を実装する理由:

Java の配列は静的であるため、新しい配列を作成するときに配列のサイズを指定する必要があります。格納する必要があるのは、未知の数値の場合、スペースを大きすぎると無駄が発生します。スペースを小さすぎると、すべてのデータが格納されません。これを実現するために作成したsize()メソッドを使用できます。自動拡張により、アレイの容量を心配する必要がなくなります。

自動拡張または自動縮小が必要になるのは、通常、配列がいっぱいであるか、配列内の空き領域が多すぎる場合であり、主に追加操作や削除操作中に発生します。

size == data.length の場合、配列がいっぱいであることを意味し、resize(int newCapacity) メソッドを呼び出し、2* を渡します。 data をパラメータとして指定します。length は、新しく作成された配列の長さが元の配列の長さの 2 倍であることを意味します。

関連ビデオチュートリアルの推奨事項:

java コース

When

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++;
	}

メソッド実装の削除

//删除元素,并返回被删除的元素
	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;
	}

メソッド実装のサイズ変更

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

メイン テスト:


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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はcsdn.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。