容器_JDK源码分析_自己简单实现ArrayList容器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了容器_JDK源码分析_自己简单实现ArrayList容器相关的知识,希望对你有一定的参考价值。
这几天仔细研究下关于ArrayList容器的jdk源码,感觉收获颇多,以前自己只知道用它,但它里面具体是怎样实现的就完全不清楚了。于是自己尝试模拟写下java的ArrayList容器,简单了实现的ArrayList类中几个方法,当然这仅仅只是加深对容器的理解,因此希望我的分享也能够给大家带来帮助。
一、AyyayList到底是什么?
其实ArrayList就是一个java中的一个类而已,说起来没什么复杂的,好,既然是类,是不是就有成员属性和成员方法。点击查看ArrayList的outline,来看看他有哪些属性和方法。
注意看下我着重标记的那一块,是不是明白了什么。其实ArrayList的底层实现是一个Object数组,也就是elementData数组,它用来存储ArrayList添加的元素,这也就是为什么ArrayList为什么能够存储任何一切对象,因为它本身就是一个object数组。而size属性只是用来保存存储元素的个数,因为是私有的,所以只能通过size方法返回size的值,下面三个就是ArrayList的三个构造方法了。
二、自己简单编码实现ArrayList类
有了上面的知识铺垫,现在可以开始编写我们自己ArrayList类了。首先创建一个MyArrayList类,因为我现在只是简单的实现ArrayList类,所以在MyArrayList类中就只有两个核心的成员属性,Object【】 elementData ;int size.在定义完属性以后,然后编写构造方法。
public class MyArrayList { //ArrayList的底层实现是根据数组实现,定义一个存储元素的数组,类型为object,可以存取任意类型的元素 private Object[] elementData; //表示存储元素的个数 private int size; //初始化elementData数组空间 public MyArrayList(int initialCapacity){ elementData = new Object[initialCapacity]; } //重载构造方法,默认存储个数为3; public MyArrayList(){ this(3); } }
这里我实现了两个构造方法,构造方法主要是初始化elementData数组的大小,默认为3个,接下来在继续实现add方法。
public void add(Object o){ //如果容器已满,则进行扩容,扩容为以前的两倍 if(size==elementData.length){ Object[] newArray =new Object[elementData.length*2]; System.arraycopy(elementData,0, newArray, 0,size); elementData = newArray; } elementData[size] = o; size++; }
这里的话主要是有个需要扩容的地方,我这里默认扩展为原来的两倍,其实扩容的本质就是重新建立一个数组,开辟另外一片空间。相信大家看到这里基本明白了剩下的方法怎么写了,这里我就不细说了,我这里就 附上自己写的PS:我也只是简单的写了下,读者有兴趣可以自己研究,嘿嘿。
/* * 自己简单的实现ArrayList容器 */ import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class MyArrayList { //ArrayList的底层实现是根据数组实现,定义一个存储元素的数组,类型为object,可以存取任意类型的元素 private Object[] elementData; //表示存储元素的个数 private int size; //初始化elementData数组空间 public MyArrayList(int initialCapacity){ elementData = new Object[initialCapacity]; } //重载构造方法,默认存储个数为10; public MyArrayList(){ this(3); } //添加元素的方法 public void add(Object o){ //如果容器已满,则进行扩容,扩容为以前的两倍 if(size==elementData.length){ Object[] newArray =new Object[elementData.length*2]; System.arraycopy(elementData,0, newArray, 0,size); elementData = newArray; } elementData[size] = o; size++; } //返回元素的个数 public int size(){ return size; } //通过索引获取元素的值 public Object get(int i){ if(i<0||i>size-1){ return null; } return this.elementData[i]; } //判断是否为空 public boolean empty(){ return size==0; } //把ArrayList转换为数组 public Object[] toArray(){ return Arrays.copyOf(this.elementData,size); } public static void main(String[] args) { //创建myarraylist的一个容器对象 MyArrayList myarray = new MyArrayList(); //为容器对象添加元素 myarray.add("fsdf"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); myarray.add("21343"); //遍历输出 for(int i=0;i<myarray.size();i++){ System.out.println(myarray.get(i)); } System.out.println(myarray.size()); Object[] o1 = myarray.toArray(); for(int i=0;i<o1.length;i++){ System.out.println(o1[i]); } } }
以上是关于容器_JDK源码分析_自己简单实现ArrayList容器的主要内容,如果未能解决你的问题,请参考以下文章
ConcurrentHashMap源码分析_JDK1.8版本