Iterable
|-- Collection
|-- List
|-- ArrayList
|-- Vector
|-- Stack
|-- LinkedList
|-- Set
|-- HashSet
|-- LinkedHashSet
|-- TreeSet
|-- Queue
|-- Deque
|-- LinkedList
Set
概述:Set集合中的元素是唯一的。有些Set是无序的,有些Set是有序的。
HashSet
特性:
a. 底层的数据结构是哈希表
b. 不保证迭代顺序(无序),并且不保证迭代顺序恒久不变(不保证元素之间的相对位序)
c. 能够存储null
d. 不同步
LinkedHashSet
特性:
a. 是HashSet的子类
b. 底层数据结构是哈希表和双向链表
c. 哈希表保证了元素的唯一性
d. 双向链表定义迭代顺序,该顺序就是元素的插入顺序
e. 能够存储null
f. 不同步
*注意事项:
a. 元素的唯一性依赖于存储元素的equals()和hashCode()
b. 千万不要修改Set集合元素的属性值
TreeSet
特性:
a. 底层的数据结构是 TreeMap, TreeMap的底层是红黑树。
b. 如果创建对象时,没有传入 Comparator(比较器) 对象,则根据自然顺序进行排序
c. 如果创建对象时,传入了 Comparator 对象,则根据 Comparator 进行排序。
d. 不能存储 null 元素,除非在Comparator中定义的null的比较规则
e. 不同步
API:
E ceiling(E e)
E floor(E e)
E higher(E e)
E lower(E e)
E first()
E last()
E pollFirst()
E pollLast()
//视图技术
NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive)
1. 元素的自然顺序(natural order)是什么? int compareTo(T o)
要求元素实现Comparable接口, 自然顺序就是Comparable接口中compareTo()定义的顺序。
2. Comparator接口
int compare(T o1, T o2)
o1 < o2: 返回负整数
o1 = o2: 返回零
o1 > o2: 返回正整数
3. TreeSet 是如何保证元素的唯一性的呢?
查看源码,底层是红黑树,遇到相同的key,更新value值
它依赖于存储元素的 compareTo(obj) 方法,或者是传入的 Comparator 对象的 compare(o1, o2) 方法
*:注意事项:
a. TreeSet(BST)不依赖存储元素的equals()和hashCode()方法。
b. 千万不要修改Set集合中元素的属性值
Map
|-- HashMap
|-- LinkedHashMap
|-- Hashtable
|-- Properties
|-- TreeMap
Map
概述
a. 将键映射到值的对象。(举例: 字典:键–>单词, 值–>释义,发音,词源…)
b. Map 中键是唯一的 (不能包含重复的键,一个键只能关联一个值)
c. 每个键最多只能映射到一个值。
API:
增(改):
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> m)
删:
void clear()
V remove(Object key)
查:
V get(Object key)
boolean containsKey(Object key)
boolean containsValue(Object value)
获取集合属性:
boolean isEmpty()
int size()
遍历:
Set<Map.Entry<K,V>> entrySet()
Set<K> keySet()
Collection<V> values()
HashMap
特性:
a. 底层数据结构是哈希表。
b. 允许null键和null值。
c. 不保证映射的顺序,特别是它不保证该顺序恒久不变。
d. 不同步。
HashMap VS Hashtable
共同点:底层的数据结构都是哈希表
不同点:
a. HashMap的键和值可以是null, Hashtable不可以
b. HashMap是不同步的, Hashtable是同步的
Properties
特性:
a. Hashtable<Object, Object> 的子类
b. Properties 类表示了一个可持久的属性集。
c. Properties 可以把数据保存到流中,或者从流中加载数据。
d. Properties 中每个键及其对应值都是一个字符串。
注意事项:1. 不要使用Hashtable里面定义的方法添加键值对!因为它们可以插入不是String 类型的数据。
2. 如果一个Properties中含有非String的键值对,那么这样的Properties是”不安全”的。调用 store 或者 save 方法将失败。
API:
增(改):
Object setProperty(String key, String value)
查:
String getProperty(String key)
String getProperty(String key, String defaultValue)
遍历:
Set<String> stringPropertyNames()
流相关:
// void store(OutputStream out, String comments)
void store(Writer writer, String comments)
// void load(InputStream inStream)
void load(Reader reader)
注意事项:字节流默认使用 ISO8859-1 字符编码。
void storeToXML(OutputStream os, String comment)
// void storeToXML(OutputStream os, String comment, String encoding)
void loadFromXML(InputStream in)
注意事项:默认使用UTF-8字符编码。
LinkedHashMap
概述:
a. HashMap的子类
b. 底层数据结构是哈希表和双向链表,具有可预知的迭代顺序。
c. 哈希表保证了键的唯一性
d. 双向链表定义了迭代顺序, 也就是插入顺序
e. 不同步
*注意事项:LinkedHashMap不能直接用于LRU中。
TreeMap
特性:
a. 底层的数据结构是红黑树。
b. 如果创建对象时,没有传入 Comparator 对象,键将按自然顺序进行排序。
c. 如果创建对象时,传入了 Comparator 对象,键将按 Comparator 进行排序。
d. 不同步
API:
K ceilingKey(K key)
K floorKey(K key)
K higherKey(K key)
K lowerKey(K key)
K firstKey()
K lastKey()
Map.Entry<K,V> pollFirstEntry()
Map.Entry<K,V> pollLastEntry()
//视图方法
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)