文章目录
一 什么是集合
- 概念: 对象的容器,存储对象的对象,可代替数组
- 特点: 容器的工具类,定义了对多个对象进行操作的常用方法
- 位置: java.util.*;
二 Collection体系集合
其中:
- 外框为虚线的表示接口,边框为实线的表示类;
- 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类。
为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍。
从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是:
- List:使用最多的有序集合,提供方便的新增、修改、删除的操作;
- Set:集合不允许有重复的元素,在许多需要保证元素唯一性的场景中使用。
Collection父接口
- 特点: 代表一组任意类型的对象,无序、无下标
- 方法:
- boolean add(Object obj) //添加一个对象
- boolean addAll(Collection c) //将一个集合中的所有对象添加到此集合
- void clear() //清空此集合中的所有对象
- boolean contains(Object o) //检查此集合中是否包含o对象
- boolean equals(Object o) //比较此集合是否与指定对象相等
- boolean idEmpty() //判断此集合是否为空
- boolean remove(Object o) //在此集合中移除o对象
- int size() //返回此集合中的元素个数
- Object[] toArray() //将此集合转换成数组
三 List接口与实现类
3.1 List子接口
- 特点: 有序、有下标、元素可以重复
- 方法:
- void add(int index, Object o) //在index位置插入对象o
- boolean addAll(int index, Collection c) //将一个集合中的元素添加到集合中的index位置
- Object get(int index) //返回集合中指定位置的元素
- List subList(int fromIndex, int toIndex) //返回fromIndex和toIndex之间的集合元素
3.2 List实现类
3.2.1 ArrayList(重点)
- 数组结构实现,查询快、增删慢
- JDK1.2版本,运行效率快、线程不安全
- ArrayList 是最常见的非线程安全的有序集合,因为内部是数组存储的,所以随机访问效率很高,但非尾部的插入和删除性能较低,如果在中间插入元素,之后的所有元素都要后移。ArrayList 的使用与 Vector 类似。
- arrayList 初始化空数组,add 初始化10长度的数组,超过10,1.5倍扩容
3.2.2 Vector
-
数组结构实现,查询快、增删慢
-
JDK1.0版本,运行效率慢、线程安全
-
Vector 是 Java 早期提供的线程安全的有序集合,如果不需要线程安全,不建议使用此集合,毕竟同步是有线程开销的。
使用示例代码:
Vector vector = new Vector(); vector.add("dog"); vector.add("cat"); vector.remove("cat"); System.out.println(vector);
程序执行结果:
[dog]
3.2.3 LinkedList
-
链表结构实现,增删快,查询慢
-
LinkedList 是使用双向链表数据结构实现的,因此增加和删除效率比较高,而随机访问效率较差。
-
通常对于栈的操作会选取此数据结构,addLast先入后出,具体了解线性表数据结构。
LinkedList 除了包含以上两个类的操作方法之外,还新增了几个操作方法,如 offer() 、peek() 等,具体详情,请参考以下代码:
LinkedList linkedList = new LinkedList(); // 添加元素 // add和addLast是尾部添加 linkedList.add("first"); linkedList.add("second"); linkedList.add("third"); linkedList.addLast("fouth"); // push和addFirst是头部添加 linkedList.addFirst("zero"); linkedList.push("temp"); // 获取第一个元素 System.out.println(linkedList.peek()); // 获取第一个元素,并删除此元素 System.out.println(linkedList.poll()); System.out.println(linkedList);
程序的执行结果:
Connected to the target VM, address: '127.0.0.1:1026', transport: 'socket' temp zero first second third fouth Disconnected from the target VM, address: '127.0.0.1:1026', transport: 'socket'
3.3 不同实现方法
四 Set接口与实现类
4.1 Set子接口
- 特点: 无序、无下标、元素不可重复
- 方法: 全部继承自Collection中的方法
4.2 Set实现类
4.2.1 HashSet(重点)
-
基于HashCode实现元素不重复
-
当存入元素的哈希码相同时,会调用equals进行确认,如结果为true,则拒绝后者存入
-
HashSet 是一个没有重复元素的集合。虽然它是 Set 集合的子类,实际却为 HashMap 的实例,相关源码如下:
public HashSet() { map = new HashMap<>(); }
因此 HashSet 是无序集合,没有办法保证元素的顺序性。
HashSet 默认容量为 16,每次扩充 0.75 倍,相关源码如下:
public HashSet(Collection<? extends E> c) { map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16)); addAll(c); }
HashSet 的使用与 Vector 类似。
4.2.2 LinkedHashSet
-
链表实现的HashSet,按照链表进行存储,即可保留元素的插入顺序
-
LinkedHashSet 是按照元素的 hashCode 值来决定元素的存储位置,但同时又使用链表来维护元素的次序,这样使得它看起来像是按照插入顺序保存的。
LinkedHashSet 的使用与 Vector 类似。
4.2.3 TreeSet
-
基于排列顺序实现元素不重复
-
实现了SortedSet接口,对集合元素自动排序
-
元素对象的类型必须实现Comparable接口,指定排序规则
-
通过CompareTo方法确定是否为重复元素
-
TreeSet 集合实现了自动排序,也就是说 TreeSet 会把你插入数据进行自动排序。
示例代码如下:
TreeSet treeSet = new TreeSet(); treeSet