ArrayList的底层实现(04)

#ArrayList的简介

  • 通过学习本文档后能够掌握到的知识点
  • 1 ArrayList是个什么东西!
  • 2 ArrayList有什么特点!
  • 3 ArrayList的底层大致是如何实现的?
  • 4 ArrayList与LinkList的区别

子曰:“学而不思则罔,思而不学则殆。”
###1. ArrayList是个什么鬼?
如果你想去学习JAVA的基础知识的话,我认为学习北京尚学堂的视频是个非常不错的选择。今天要讲的内容就是我最近再他们的视频上学的!带着学生们看源码非常的NICE对容器的理解有很大的帮助。现在先聊聊什么是ArrayList吧!
再JAVA的类库中有一个包叫JAVA.UTIL包,util包中有平时开发用到的许多常用的接口,类等东西。其中Collection集合类便是我们要讲的主题。
这里写图片描述
Collection接口下面了,又有两个接口分别是SET,和LIST接口。再List接口下面又分
ArrayList,LinkList,Vector.三个实现类。
因此我们可以知道ArrayList是实现了LIST接口的一个子类。它就是一个关于集合的类!

2.ArrayList的有什么特点了?

ArrayList最大的几个特点就是:有序、元素能重复、线程不安全。其次,实际上ArrayList就是一个数组。没有想象中那么牛逼。直接看源代码可以得知但你NEW ArrayList 时候创建的就是个10个大小的数组,只不过这个数组是Object数组罢了。!这里写图片描述
所以当我们仿造的时候创建一个OBJECT[]数组也能行 !哈哈。

3 ArrayList的简单实现。

正如我们看到的ArrayList的源码,以及其表现形式我们可以知道。ArrayList是一个可以随便add()任何类型,并且永远塞不满的集合。因此我们只要创建一个永远塞不满的能保存任何对象的数组就行。其私有属性就主要两个!1、Object[]数组。2、Size.再新建的时候用给两个构造方法,一个有参,一个无参。有参就按参数来设置数组大小,无参数则用10作为默认值来设置大小。看代码!

package Collection;
//自己实现ArrayList to help understand unearneath

public class TestList {
	//核心就是数组 
	private Object[] elementData;
	//数组的长度
	private int size;
	
	//空构造类
	public TestList() {
		this(10);
	}
	//带参数的构造类.
    public TestList(int initialCapacity) {
    	//容量不能小于零
	       if(initialCapacity<0) {
	    	  try {
	    		throw new Exception();
	    	  }catch(Exception e) {
	    		  e.printStackTrace();
	    	  }
	       }
	       elementData = new Object[initialCapacity];
	    }
    
    //主要的方法ADD方法 。
    public boolean add(Object o) {
    	//数组扩容当这个size超过数组的长度就扩容
    	if(size+1>elementData.length) {
    		//你以为事将数组扩大,实际事换一个地方存放
    		Object[] newArray = new Object[size*2+1];
    		//将数据拷贝到新数组
    		for(int i =0;i<elementData.length;i++) {
    			newArray[i] = elementData[i];
    		}
    		elementData = newArray;
    	}
    	//此时size进行了扩张
    	elementData[size++]=o;
    	
    	return true;
    }
    //。size方法.
    public int size() {
        return elementData.length;
    }
    //是否为空
    public boolean isEmpty() {
    	boolean f=false;
    	if(size==0)f=true;
    	return f;
    }
    
    //获取对象
    public Object get(int index) {
    	//下标要进行判断
    	if(index<0||index>=size) {
    		try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	Object o = elementData[index];
		return o;
    }
    
    //
    public void remove(int index) {
    	//下标要进行判断
    	if(index<0||index>=size) {
    		try {
				throw new Exception();
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
    	}
    	//进行判断。删除以后要将后面的迁移 。
    	//这个是后面有的多少个元素个数
    	int numMoved = size - index - 1;
    	//将后面的元素往前一个覆盖。都不用删除。
    	if(numMoved > 0)
    		System.arraycopy(elementData, index+1, elementData, index, numMoved);
    	//删除指定对象
    	elementData[--size]=null;
    }
    
    //删除一个指定对象的
    public void remove(Object index) {
    	for(int i=0;i<size;i++) {
    	//循环进行比较用EQUALSE判断.
    	}
    }
    
    
    
    
    
	public static void main(String args[]) {
		//first ,depends arrylist.we need to create a number 
		//of array
		//
		TestList list = new TestList();
		list.add("3");
		list.add("3");
		list.remove(1);
		
		
		
		System.out.println("数组有多少元素:"+list.size);
		System.out.println("数组有多少大:"+list.size());
		System.out.println("数组是否为空:"+list.isEmpty());
		//System.out.println("数组是否为空:"+list.get(1));
	}

}

这是我写的测试类,核心关键点就在于如何将数组扩充,并且将以前的数组再赋值到新数组。因为数组的大小是固定的所以需要一个新的容器来承载。这是关键的思想。
##4总结
今天学习了,集合的源码实现。通过源码的学习能够让你更加了解为什么这么做。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值