集合结构如图
1.集合主要是两组(单列集合,双列集合)
2.Collection接口又两个重要的子接口List、Set,他们实现的子类都是单列集合
3.Map 接口的实现子类 是双列集合 存放的是K-V
Collection接口
add 添加单个元素,添加基本数据类型会有一个自动装箱的过程
remove 删除指定元素(指定索引或者元素,删除索引返回元素,删除元素返回Boolean值)
contains 查找元素是否存在
size 获取元素个数
isEmpty 判断元素是否为空
clear 清空集合
addAll 添加多个元素
removeAll 删除多个元素
List c = new ArrayList();
Set s = new HashSet();
c.add(1);
c.add(2);
s.add(1);
s.add(3);
s.addAll(c);
// c.remove(1);
System.out.println(s); //[1, 2, 3]
Iterator迭代器
iterator()是Iterable接口的方法,所以 所有实现Collection的集合都有Iterator迭代器。且Iterator迭代器对象本身不存放对象,只用来遍历集合。
ArrayList、LinkedList和Vector的异同
ArrayList 是List接口的主要实现类,线程不安全,效率高
LinkedList底层使用双向链表,对频繁的插入,删除操作效率比ArrayList高
Vector是List接口的古老实现类,1.0实现,1.2才出现List接口。线程安全,效率低
相同:都是List接口的实现类,存储有序的,可重复对象数据
List 历代版本
list 1.7之前创建数组类似于单例的饿汉模式,在new List对象时就创建长度为10的Object数组。
1.8之后采用类似懒汉模式,在add方法调用时才创建数组对象
Set
set是Collection的子接口,没有提供新的方法
set集合不允许包含相同的元素,使用equals判断是否相同。
实现类:HashSet、TreeSet、LinkedHashSet
HashSet:线程不安全,可以有null,不可重复
LinkedSet:是HashSet的子类,遍历时会是添加元素
TreeSet:放入属性必须同一个类,可以排序
无序性:不等于随机性,而是内存中数据存放的位置不按照数组下标存储,而是按照hash值存储。
不可重复性:使用equals判断元素是否相同。
HashSet 的add方法
向添加元素时,调用元素所在类的HashCode()方法,计算元素的哈希值,此哈希值接着通过某种算法计算出元素在HashSet底层数组中的存放位置(索引位置)。
之后判断此位置上是否有元素,若是有则比较此位置上有元素a(或以链表形式存在多个元素),则比较添加元素和元素a的Hash值,若是不同则存储;若是相同则调用存储元素所在类的equals方法。若是返回true,则添加失败
若是返回false,则将元素添加到链表的尾部,原链表尾部指向新添加元素(1.7之前添加到链表的头部,新添加元素放入数组,作为链表头指向原链表)
LInkedHashSet
是HashSet的子类,在添加数据同时,还维护了两个引用,链表记录了前一个数据和后一个数据。
TreeSet
添加数据要求是相同对象
两种排序方式:自然排序和定制排序
存放对象实现Compareble接口或者new TreeSet时传入Compareble匿名内部类
自然排序:比较两个对象,排序方法为compareTo,比较是否相同不在使用equals
定制排序