1. Set 接口
1.1 特点:无序(以哈希表顺序存放);元素不能重复;增删快;元素可以是null,但只能放一个。
什么是无序?存入与取出的顺序不一致。
元素不能重复?实体类需要重写equals()和hashCode()方法。(重点掌握)
1.2 遍历方式:
foreach
Iterator 迭代器
1.3 主要实现类:
HashSet
TreeSet
LinkedHashSet
2. HashSet
2.1 特点:以哈希表的形式存放元素(底层是HashMap);线程不同步;增删快;可以存null,但只能放一个。
2.2 如何确认重复元素?
当hashcode值相同,且equals()返回值为true时,HashSet就认为这两个元素是相同的。
所以在实体类中需要重写hashcode()及equals()。
示例:在User实体类中重写hashcode()\equals()
@Override
public boolean equals(Object obj) {
if(thisobj) return true;
if(!(obj instanceof User)) return false;
if(!this.username.equals(obj.getUserName())) return false;
return this.ageobj.getAge();
}
@Override
public int hashCode() {
int result = name.hashCode();
result = 31 * result + age.hashCode();
return result;
}
3. TreeSet
3.1 特点:根据某种规则对元素进行排序;底层是TreeMap(红黑树)。
3.2 TreeSet 与 HashSet的区别?(面试题)
(1)TreeSet判断两个对象是否相同的方法是Comparable接口中的compareTo()方法;而而HashSet用的则是继承自Object类的equals()方法。
(2)TreeSet有自动排序的功能,HashSet没有。
-
LinkedHashSet
4.1 特点:FIFO先进先出;迭代的顺序就是添加的顺序。 -
Queue 接口(队列)
5.1 特点:FIFO先进先出;主要用于存储数据,而不是处理数据。
5.2 主要实现类:
LinkedList
5.3 常用方法:
add() | offer() 在集合最后一位追加元素,禁止添加null(LinkedList没有禁止)
remove() | poll() 删除第一个元素
element() | peek() 获取第一个元素
4. Map 接口
4.1 特点:无序;以 Key/Value对 的形式存储数据;键不能重复,值可以重复;Key不能为null,value可以为null,且可以重复。
4.2 遍历方式:
Iterator
将Map的Key转成Set,通过Foreach遍历
4.3 主要实现类:
HashMap
Hashtable
TreeMap
LinkedHashMap
Map 接口常用方法:
put() 添加
get() 获取key对应的Value
remove() 移除key对应的value
clear() 移除集合中所有元素