梗概:
1.List:
- 可以允许重复的对象。
- 可以插入多个null元素。
- 是一个有序容器,保持了每个元素的插入顺序,输出的顺序就是插入的顺序。
- 常用的实现类有 ArrayList、LinkedList 和 Vector。
ArrayList 最为流行,
它提供了使用索引的随意访问,而 LinkedList 则对于经常需要从 List 中添加或删除元素的场合更为合适
2.Set:
- 不允许重复对象
- 无序容器,你无法保证每个元素的存储顺序,TreeSet通过 Comparator 或者 Comparable 维护了一个排序顺序。
- 只允许一个 null 元素
- Set 接口最流行的几个实现类是 HashSet、LinkedHashSet 以及 TreeSet。
最流行的是基于 HashMap 实现的 HashSet;
TreeSet 还实现了 SortedSet 接口,
因此 TreeSet 是一个根据其 compare() 和 compareTo() 的定义进行排序的有序容器。而且可以重复
3.Map
-
Map不是collection的子接口或者实现类。Map是一个接口。
-
Map 的 每个 Entry 都持有两个对象,也就是一个键一个值,
Map 可能会持有相同的值对象但键对象必须是唯一的。 -
TreeMap 也通过 Comparator 或者 Comparable 维护了一个排序顺序。
-
Map 里你可以拥有随意个 null 值但最多只能有一个 null 键。
-
Map 接口最流行的几个实现类是 HashMap、LinkedHashMap、Hashtable 和 TreeMap。(HashMap、TreeMap最常用)
以下详解:
一、List集合
java.util.List
接口
- 上层接口
implements Collection
接口 - 下层实现类
ArrayList
、Vector
、LinkedList
总结:有顺序的Collection
1.List接口特点
- 有序的集合 ,存储和取出元素的顺序是一致的
- 有索引,包含一了些带索引的方法
- 允许重复的元素(Set不包含重复元素)
2.常用方法(List特有)
带索引的方法(List特有)
1.void add(int index ,E element) 将指定的元素添加到指定位置上(不写索引默认添加到最后)
2.E get(int index) 返回指定索引的元素
3.E remove(int index) 删除指定索引的元素,返回删除的元素
4.E set(int index ,E emement)
用元素替换集合中指定位置的元素,返回更新前的元素
(注意索引越界异常)
3.遍历方式(同Collection,三种)
同上层的Collection,for循环,foreach循环,Iterator遍历
4.List下层:ArrayList、Vector
-
ArrayList
java.util.ArrayList
最常用的集合 -
Vector
java.util.Vector
-
共同点:
-
上层接口都是List接口
-
存储的结构是数组结构。
-
特点 :元素增删慢,查询快
-
-
不同点:
- Vector 线程安全/线程同步 ,比较慢,已经被淘汰
- ArrayList 线程不安全/线程不同步
4.List下层:LinkedList
java.util.LinkedList
-
上层接口: List接口
-
储存结构是双向链表结构
-
特点
- 底层是一个链表结构:元素查询慢,增删快
- 双向链表结构,包含了大量操作首尾的方法
-
常用方法:
双向链表结构,包含了大量操作首尾的方法
这是LinkedList特有的方法,使用这些方法不能使用多态
1. void addFirst(E e) 将指定元素插入列表的开头
void addLast(E e) 将指定元素插入列表的结尾
2. void push(E e)将元素推入此列表表示的堆栈
3. E getFirst() 返回此列表的第一个元素。
E getLast() 返回此列表的最后一个元素。
4. E removeFirst() 移除并返回此列表的第一个元素。
E removeLast() 移除并返回此列表的最后一个元素。
E pop() 从此列表所表示的堆栈处弹出一个元素。
5. boolean isEmpty() 判断是否为空
二、Set集合
java.util.Set接口
- 上层接口
implements Collection
接口 - 下层实现类
HashSet
、LinkedHashSet
、TreeList
、EnumSet
(专门用于枚举类型的Set) - 总结:去重复的Collection
1.Set接口特点
- 不允许存储重复元素的
(底层是Map接口的K,此时V默认为Object类型对象) - 没有索引,
所以不带索引方法,也不能使用普通的for循环遍历
只能用增强的for循环和迭代器遍历