单列集合
双列集合(键值对形式)
Collection接口常用方法
此处使用继承了Collection接口的List接口来演示
List list = new ArrayList();
list.add("jack");
list.add(10);
list.add(true);
System.out.println(list);
Integer d = (Integer) list.get(1);
//删除指定元素
list.remove(d);
System.out.println(list);
//contains:查找元素是否存在
System.out.println(list.contains("jack"));
//获取元素格式
System.out.println(list.size());
//isEmpty:判断是否为空
System.out.println(list.isEmpty());
//clear:清空
list.clear();
System.out.println(list);
//addAll:添加多个元素
ArrayList list2 = new ArrayList();
list2.add("西游记");
list2.add("西游记2");
list.addAll(list2);
System.out.println(list);
//containsAll:查找多个元素是否都存在
System.out.println(list.containsAll(list2));
//删除多个元素
list.removeAll(list2);
System.out.println(list);
List接口常用实现类
ArrayList
1.ArrayList是由数组来实现数据存储的,
2.ArrayList基本等同于Vector,除了ArrayList是线程不安全的(执行效率高),由源码分析没有关键字synchronized修饰,在多线程情况下不建议使用ArrayList ,可以考虑使用线程安全的Vector
ArrayList的底层操作机制源码分析:
1)ArrayList中维护了一个Object类型的数组elementData,ArrayList使用这个数组来存储数据,所以说ArrayList底层是一个数组
transient Object[] elementData; //transient 有瞬间,短暂的意思,该关键字表示其所修饰的属性不会被序列化
如果使用的是无参构造,则初始的elementData容量为0,第1次添加,则将其扩容为10,后面再次扩容则扩容为原来的1.5倍
3)如果使用的是指定大小的构造器,则elementData的初始容量为指定大小,后面在扩容则扩容为原来的1.5倍
ArrayList与Vector的比较
ArrayList与LinkedList的比较
这两个都是线程不安全的
关于LinkedList的说明:
LinkedList底层实现了双向链表和双端队列特点。 可以添加任意元素(元素可以重复),包括null。 线程不安全,没有实现同步。
Set接口常用实现类
Set接口基本介绍:
1)无序(添加和取出的顺序不一致),没有索引。
2)不允许重复元素,所以最多包含一个null。
Set接口的常用方法:
和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样。
Set接口的遍历方式:
同Collection的遍历方式一样,因为Set接口是Collection接口的子接口。
1.可以使用迭代器
2.增强for
3.不能使用索引的方式来获取
HashSet
1.HashSet底层是HashMap
2.添加一个元素时,先得到hash值会转成->索引值
3.找到存储数据表table,看这个索引位置是否已经存放有元素
4.如果没有,直接加入
5.如果有,调用equals比较,如果相同,就放弃添加,如果不相同,则添加到最后的位置
6.在java8中,如果一条链表的元素个数到达TREEIFY_THRESHOLD(默认是8),并且table的大小大于等于MIN_TREEIFY_CAPACITY(默认64)就会进行树化(红黑树)
Map接口
1.Map与Collection并列存在。用于保存具有映射关系的数据:key-value(双列元素) 2.Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node中 3.Map中的key不允许重复,原因和HashSet一样, 4.Map中的value可以重复