之前我学Java容器的时候,以为容器是这样的
而实际上,是这样的
经过了很多版本的跌代,java的容器家族越来越大了,容器总共四大类:array set list map 让我们都来看看吧
一、List 、Set 和 Map |
综述
Set 接口 类似集合,没有顺序,不可以重复
List 接口有顺序,可以重复,所谓重复是指两个对象equals
Map接口定义了存储键值对的方法,键不能重复
二、Iterator接口 |
iterator是为了实现对Java容器(collection)进行遍历功能的一个接口。
具体为
public interface Iterator<E> {}
三个方法
- Boolean hasNext();
判断 iterator 内是否存在下1个元素,如果存在,返回true,否则返回false。(注意,这时上面的那个指针位置不变) - Object next();
返回 iterator 内下1个元素,同时上面的指针向后移动一位。如果不断地循环执行next()方法,就可以遍历容器内所有的元素了。 - void remove();
删除 iterator 内指针的前1个元素,前提是至少执行过1次next();不建议使用。
注:Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。
意义
可以用来遍历Set容器
三、ArrayList和LinkedList |
ArrayList
分析底层
说到ArrayList就不得不说到数组了
先在IDEA里写一个
List list=new ArrayList();
点到底层发现
class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
首先ArrayList是一个普通类,它继承了AbstractList,同时实现了ist, RandomAccess, Cloneable, java.io.Serializable,
然后发现一个常量
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
然后发现一个构造函数
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
然后综合其他代码,ArrayList底层确实是一个数组,而且是object类型
特点(jdk 1.8)
- ArrayList构造出来的时候是空引用,在引用的时候初始化容量是10(jdk1.710,初始化容量10)
- 实例化ArrayList时,如果初始化容量不够,是扩容1.5倍,使用copy方法
- ArrayList线程不安全
LinkedList
LinkedList底层是链表
ArrayList和 LinkedList区别
读写方面
- ArrayList 查询快,底层是数组,因为有序号所以查询方便,但是每次增删都需要遍历
- LinkedList 增删快,底层是链表,增加,只要画出一块内存链接即可,删除也是去除链接。但是查询就要一个一个找。