旗下导航:搜·么
当前位置:网站首页 > JAVA教程 > 正文

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动态数组实现


欢迎 发表评论: