#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总结
今天学习了,集合的源码实现。通过源码的学习能够让你更加了解为什么这么做。