1.List接口
- 有序集合,存储和读取元素的顺序相同;
- 允许存储重复的元素;
- 有索引,可以通过普通for循环遍历;
- 常用方法:
- get(index)
- add(index, element)
- remove(index)
- set(index, element)
- list集合的遍历有三种方式:
- 普通for循环
- 迭代器
- 增强for循环
- 有Vector集合、ArraList集合、LinkedList集合实现了List接口。
1.1ArrayList
- List的数组实现,底层是一个大小可变的数组;
- 特点是查询快、增删慢,日常开发中使用最多的是查询、遍历数据;
- 许多程序员开发中随意的使用ArrayList完成任何需求,并不严谨,是不提倡的;
- 不是同步的;
1.2LinkedList
- List的链表实现,底层是一个链表结构;
- 特点是查询慢、增删快;
- 包含大量操作首尾元素的方法,使用LinkedList集合特有的方法不能使用多态;
- 常用方法:
- addFirst(E e):将指定元素插入到集合的开头
- addLast(E e):将指定元素插入到集合的末尾,等效于add()
- push(E e):将元素推入此集合所表示的堆栈,等效于addFirst()
- pop(E e):从此集合表示的堆栈弹出一个元素并返回,等效于removeFirst()
- getFirst():返回此集合的第一个元素
- getLast():返回此集合的最后一个元素
- removeFirst():移除并返回此集合的第一个元素
- removeLast():移除并返回此集合的最后一个元素
- isEmpty():不包含元素则返回true
1.3Vector
- 1.2版本后出现了其他单列集合,1.1版本出现的单列集合就是Vector;
- 底层是一个可变数组;
- 是同步的,单线程,速度慢。
2.Set接口
- 无序;
-
不允许存储重复元素;
- 没有索引,不能通过普通for循环遍历;
- 有HashSet和TreeSet集合实现了Set接口,LinkedHashSet又继承了HashSet。
2.1HashSet
- HashSet存储数据的结构是哈希表,是一个十进制的整数,由系统随机给出,就是对象的逻辑地址值,模拟出来的地址,不是数据实际存储的物理地址,Object类的方法hashCode()可以获取对象的哈希值,native int hashCode(),native表明该方法调用的是本地操作系统的方法,String类重写了hashCode();
- 哈希表的实现方式是一个数组+链表/红黑树;
- Set集合不允许存储重复元素的原因:set集合在调用add方法时,会调用元素的hashCode方法和equals方法,判断元素是否重复(前提是存储的元素必须重写hashCode方法和equals方法,保证元素不重复);
- HashSet集合存储自定义类型的元素,必须要保证存储的元素必须重写hashCode方法和equals方法。
2.2LinkedHashSet
- LinkedHashSet是HashSet的子类,方法一样,是Set的哈希表(数组+链表/红黑树)和链表的实现,多了一条链表,与HashSet的区别在于维护着一个运行于所有条目的双重链表,定义了迭代的顺序,按照元素插入的顺序进行迭代,多的那一条链表用于记录元素的存储顺序,保证元素有序。