自定义ArrayList类

自定义动态数组MyArrayList,实现ArrayList的部分方法,理解ArrayList的方法原理。

一,定义MyArrayList

//初始数组名
	private  Object[] array ;
	
	//默认容量大小
	private static final int defaule_capacity = 10;
	
	//MyArrayList中包含的元素的数量
	private int size;
	
	//数组的初始长度
	private int initialCapacity;

构造函数
写了两个构造函数,第一个构造函数没有参数,实例化后默认大小为10;第二个构造函数带有大小参数,实例化为指定大小。

//构造方法1
	public MyArrayList() {
		this.initialCapacity = defaule_capacity;
		array = new Object[defaule_capacity];
	}
	
	//构造方法2
	public MyArrayList(int initialCapacity) {
		
		if(initialCapacity > 0) {
			this.initialCapacity = initialCapacity;
			array = new Object[initialCapacity];
		}
		
		else {
			throw new IllegalArgumentException("Illegal Capacity: "+
                    initialCapacity);
		}
	}

方法一:public int size()

//返回array中所含元素的个数
	public int size() {
		return size;
	}
	

方法二:public E get(int index)

//返回array下标为index的元素的值
	public E get(int index){
		//这里用的不是initialCapacity,因为size才表示存储的元素的个数,
		//initialCapacity仅仅是开辟的数组的空间大小,后面一部分多出来的内容自然是没有存数据的
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		//这里需要强制转换为E类型
		return (E)array[index];
	}

方法三:public E set(int index,E e)

//自定义更改下标为index的元素值的方法
	public E set(int index,E e) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
			
		array[index] = e;
		
		return oldvalue;
		
	}
	

方法四:public void add(E e)

//自定义添加元素的方法
	public void add(E e) {
		if(size < initialCapacity) {
			//size指的是array中元素的个数
			//这里从下标0~size-1表示的是size个元素,那么新添加进去的元素应该处于下标为size的位置上
			array[size] = e;
			size++;
		}else {
			//容量扩大一倍
			Object newArray[] = new Object[2*initialCapacity];
			
			//将array中的元素重新存入更新容量后的newArray数组中去
			for(int i = 0;i<size;i++) {
				newArray[i] = array[i];
			}
			
			newArray[size] = e;
			initialCapacity = initialCapacity*2;
			
			array = newArray;
			size++;
			
			
		}
	}
	

方法五:public E remove(int index)

//自定义移除下标为index的元素的方法
	public E remove(int index) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		
		//如果需要移除的是最后一个元素,那么直接移除,然后size--
		if(index == size-1){
			array[index] = null;
			size--;
			return oldvalue;
		}
		
		//如果移除的是第一个或者中间的元素,那么该index下标前面的元素的下标保持不变,后面的元素依次向前移一位
		for(int i = index;i<size;i++) {
			array[i] = array[i+1];
		}
		array[size-1] = null;
		size--;
		return oldvalue;
	}
	

方法六:public E add(int index,E e)

//自定义在array中添加元素的方法
	public E add(int index,E e) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		
		//这里先将array的size先增加1,原来 的下标为size的值表示的null,表示并没有添加元素,
		//现在去使用它,首先将它初始化为0
		
		int n = 0;
		
		if(size +1 < initialCapacity) {//开辟空间足够,不用增加空间
			
			//接下来需要将index以及它后边的元素,依次向后移一位
			for(int i = size-1;i>=index;i--) {
				array[size - n] = array[i];
				n++;
			}
			array[index] = e;
			size++;
			
		}else {//原来开辟的空间不够,需要另外new新的数组来保存元素
			//容量扩大一倍
			Object newArray[] = new Object[2*initialCapacity];
			
			//将array中的元素重新存入更新容量后的newArray数组中去
			for(int i = 0;i<size;i++) {
				newArray[i] = array[i];
			}
			
			newArray[size] = 0;
			initialCapacity = initialCapacity*2;
			
			array = newArray;
			//接下来需要将index以及它后边的元素,依次向后移一位
			for(int i = size-1;i>=index;i--) {
				array[size - n] = array[i];
				n++;
			}
			array[index] = e;
			size++;
			
		}
		
		
		return oldvalue;

	}
	

方法七:public void clear()

//清除array中所有的元素
	public void clear() {
		for(int i = 0;i<size;i++) {
			array[i] = null;
		}
		size = 0;
	}

测试

另外定义了一个Test类,来调用以上写的方法,结果如下:
,首先自己添加6个不同类型的对象,然后调用get()方法打印输出这6个对象。

list.add(2);
		list.add(2.3333);
		list.add(new Object());
		list.add(new MyArrayList(15));
		list.add("hello!");
		//list.add(null);
		list.add(true);

这里写图片描述
,随机添加若干个Animal对象元素(在同包下定义的一个Animal类)
结果如下:
这里写图片描述
,调用set方法,替换index下标的元素值
这里写图片描述
,调用remove方法,将下标为index的元素移除
这里写图片描述
,调用add方法,在指定的index位置上添加元素
这里写图片描述
,调用clear方法,移除array中的所有元素
这里写图片描述
方法已经验证完毕!

进行这些方法的编写是为了更好的理解动态数组ArrayList的操作原理。
当然,ArrayList还有其他一些方法,以上方法只是实际中常用的一些方法。

源代码:

package ArrayList;
//<E>表示支持泛型


/*
 * Java的ArrayList
 * 方法
 * 1.构造方法
 * 2.size()*
 * 3.get(index)*
 * 4.clear()
 * 5.add(e)*
 * 6.set(index,e)*
 * 7.remove(index)*
 * 8.add(index,e)
 */

import java.util.ArrayList;

public class MyArrayList <E>{
	
	//初始数组名
	private  Object[] array ;
	
	//默认容量大小
	private static final int defaule_capacity = 10;
	
	//MyArrayList中包含的元素的数量
	private int size;
	
	//数组的初始长度
	private int initialCapacity;
	
	//构造方法1
	public MyArrayList() {
		this.initialCapacity = defaule_capacity;
		array = new Object[defaule_capacity];
	}
	
	//构造方法2
	public MyArrayList(int initialCapacity) {
		
		if(initialCapacity > 0) {
			this.initialCapacity = initialCapacity;
			array = new Object[initialCapacity];
		}
		
		else {
			throw new IllegalArgumentException("Illegal Capacity: "+
                    initialCapacity);
		}
	}
	
	//返回array中所含元素的个数
	public int size() {
		return size;
	}
	
	//返回array下标为index的元素的值
	public E get(int index){
		//这里用的不是initialCapacity,因为size才表示存储的元素的个数,
		//initialCapacity仅仅是开辟的数组的空间大小,后面一部分多出来的内容自然是没有存数据的
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		//这里需要强制转换为E类型
		return (E)array[index];
	}
	
	//清除array中所有的元素
	public void clear() {
		for(int i = 0;i<size;i++) {
			array[i] = null;
		}
		size = 0;
	}
	
	//自定义添加元素的方法
	public void add(E e) {
		if(size < initialCapacity) {
			//size指的是array中元素的个数
			//这里从下标0~size-1表示的是size个元素,那么新添加进去的元素应该处于下标为size的位置上
			array[size] = e;
			size++;
		}else {
			//容量扩大一倍
			Object newArray[] = new Object[2*initialCapacity];
			
			//将array中的元素重新存入更新容量后的newArray数组中去
			for(int i = 0;i<size;i++) {
				newArray[i] = array[i];
			}
			
			newArray[size] = e;
			initialCapacity = initialCapacity*2;
			
			array = newArray;
			size++;
			
			
		}
	}
	
	//自定义更改下标为index的元素值的方法
	public E set(int index,E e) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
			
		array[index] = e;
		
		return oldvalue;
		
	}
	
	
	//自定义移除下标为index的元素的方法
	public E remove(int index) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		
		//如果需要移除的是最后一个元素,那么直接移除,然后size--
		if(index == size-1){
			array[index] = null;
			size--;
			return oldvalue;
		}
		
		//如果移除的是第一个或者中间的元素,那么该index下标前面的元素的下标保持不变,后面的元素依次向前移一位
		for(int i = index;i<size;i++) {
			array[i] = array[i+1];
		}
		array[size-1] = null;
		size--;
		return oldvalue;
	}
	
	//自定义在array中添加元素的方法
	public E add(int index,E e) {
		//这里需要进行强制类型转换
		E oldvalue = (E) array[index];
		
		if(index<0 || index>=size) {
			throw new IndexOutOfBoundsException();
			//否则return null
		}
		
		//这里先将array的size先增加1,原来 的下标为size的值表示的null,表示并没有添加元素,
		//现在去使用它,首先将它初始化为0
		
		int n = 0;
		
		if(size +1 < initialCapacity) {//开辟空间足够,不用增加空间
			
			//接下来需要将index以及它后边的元素,依次向后移一位
			for(int i = size-1;i>=index;i--) {
				array[size - n] = array[i];
				n++;
			}
			array[index] = e;
			size++;
			
		}else {//原来开辟的空间不够,需要另外new新的数组来保存元素
			//容量扩大一倍
			Object newArray[] = new Object[2*initialCapacity];
			
			//将array中的元素重新存入更新容量后的newArray数组中去
			for(int i = 0;i<size;i++) {
				newArray[i] = array[i];
			}
			
			newArray[size] = 0;
			initialCapacity = initialCapacity*2;
			
			array = newArray;
			//接下来需要将index以及它后边的元素,依次向后移一位
			for(int i = size-1;i>=index;i--) {
				array[size - n] = array[i];
				n++;
			}
			array[index] = e;
			size++;
			
		}
		
		
		return oldvalue;

	}
	
	
	
	
}

测试代码

用来测试的Animal类:

package ArrayList;

public class Animal {
	private String name;
	private int age;
	private int number;
	
	//定义构造函数
	public Animal(String name,int age,int number) {
		this.name = name;
		//System.out.println("name----------->"+name);
		this.age = age;
		//System.out.println("age----------->"+age);
		this.number = number;
		//System.out.println("number----------->"+number);
	}

}

测试类:

package ArrayList;

import java.util.Random;

public class Test {

	public static void main(String[] args) {
		MyArrayList list = new MyArrayList();
		
		list.add(2);
		list.add(2.3333);
		list.add(new Object());
		list.add(new MyArrayList(15));
		list.add("hello!");
		//list.add(null);
		list.add(true);
		
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("到目前加入了--"+list.size()+"--个对象");
		System.out.println();
		System.out.println();
		System.out.println("打印输出这--"+list.size()+"--个对象");
		System.out.println();
		
		for(int i = 0;i<list.size();i++) {
			System.out.println("-----"+i+"----->"+list.get(i).toString());
		}
		
		System.out.println();
		System.out.println();
		System.out.println();
		
		Random rand = new Random();
		int number = rand.nextInt(12)+4;
		
		System.out.println("现在加入--"+number+"--个Animal对象");
		for(int i = 0;i<number;i++) {
			Animal animal = new Animal("lovely-"+rand.nextInt(20),rand.nextInt(25),rand.nextInt(10010)); 
			System.out.println("-----"+i+"----->"+"***********"+animal+"************");
			list.add(animal);
		}
		
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("总共加入了--"+list.size()+"个对象");
		for(int i = 0;i<list.size();i++) {
			Object object = list.get(i);
			System.out.println("-----"+i+"----->"+object.toString());
		}
		System.out.println();
		System.out.println();
		System.out.println();
		
		
		
		//设置第1个元素的值为89,最后一个元素的值为新的Animal对象
		System.out.println("设置下标------0--个元素的值为--89-----");
		//list.set(0, 89);
		System.out.println("下标为--0--的元素--原来--的值为--"+list.set(0, 89));
		System.out.println("下标为--0--的元素--现在--的值为--"+list.get(0));
		
		//设置最后一个元素的值为新的Animal对象
		System.out.println("设置下标------"+(list.size()-1)+"--个元素的值为--新的Animal对象-----");
		Animal animal = new Animal("cat",10,100001);
		System.out.println("下标为--"+ (list.size()-1) +"--的元素--原来--的值为--"+list.set(list.size()-1, animal));
		System.out.println("下标为--"+ (list.size()-1) +"--的元素--现在--的值为--"+list.get(list.size()-1));
		//现在的list
		System.out.println("------------现在的list---------");
		for(int i = 0;i<list.size();i++) {
			Object object = list.get(i);
			System.out.println("-----"+i+"----->"+object.toString());
		}
				
		
		
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("------------移除元素---------");
		
		System.out.println();
		System.out.println();
		System.out.println("------------移除最后一个元素---------");
		
		System.out.println("下标为--"+(list.size()-1)+"--的元素--原来--的值为--"+list.remove(list.size()-1));
		
		//现在的list
		for(int i = 0;i<list.size();i++) {
			Object object = list.get(i);
			System.out.println("-----"+i+"----->"+object.toString());
		}
		
		System.out.println();
		System.out.println("------------移除第三个元素(下标为2)---------");
		System.out.println("下标为--"+2+"--的元素--原来--的值为--"+list.remove(2));
		
		//现在的list
		System.out.println("------------现在的list---------");
		for(int i = 0;i<list.size();i++) {
			Object object = list.get(i);
			System.out.println("-----"+i+"----->"+object.toString());
		}
		
		
		System.out.println();
		System.out.println();
		System.out.println();
		Animal animalmer = new Animal("dog",56,34);
		System.out.println("------------在指定位置(下标)上添加元素----"+animalmer+"-----");
		
		System.out.println("下标为--"+2+"--的元素--原来--的值为--"+list.add(2,animalmer));
		System.out.println("下标为--"+2+"--的元素--现在--的值为--"+list.get(2));
		//现在的list
		System.out.println("------------现在的list---------");
		for(int i = 0;i<list.size();i++) {
			Object object = list.get(i);
			System.out.println("-----"+i+"----->"+object);//------去掉了toString()方法
		}
		
		
		
		System.out.println();
		System.out.println();
		System.out.println();
		System.out.println("------------清除掉所有元素---------");
		
		System.out.println();
		System.out.println();
		
		
		
		
		list.clear();
		System.out.println("-----现在list中还有的元素个数是"+"------"+list.size()+"------");
		for(int i = 0;i<list.size();i++) {
			System.out.println(list.get(i).toString());
		}
		
	}

}

猜你喜欢

转载自blog.csdn.net/weixin_42882887/article/details/82081023