1.集合关系图
2.Collection接口
Collection是集合List、Set、Queue的父类接口。
2.1 List接口
List是有序集合。
2.1.1 LinkedList
LinkedList底层是双向链表,插入和删除速度快,随机访问的速度较慢。排列有序,值可以重复,线程不安全。
常用方法:
- add(Object obj):向链表末尾添加一个新节点。
- add(int index,Object obj):向链表指定位置添加一个新节点。
- addFirist(Object obj):向链表表头添加一个新节点。
- remove(int index):删除指定位置的节点。
- get(int index):得到指定位置的节点。
- indexOf(Object obj):返回节点对象在链表中首次出现的位置,如果链表中无此节点的对象则返回-1 。
- size():返回链表的长度。
- contains(Object obj):判断链表节点对象中是否含有obj。
2.1.2 ArrayList
ArrayList底层是数组,当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,不适合插入和删除,但是它随机访问速度快。排列有序,值可以重复,线程不安全。当ArrayList的容量不够时
自动扩容(原来容量*1.5+1)。
常用方法:
- add(Object obj):向链表末尾添加一个新节点。
- add(int index, Object obj):向链表指定位置添加一个新节点。
- clear():从链表中删除所有元素。
- remove(Object obj):移除ArrayList中首次出现的指定元素,存在则移除并返回true,否则返回false。
- get(int index):得到指定位置的节点。
- toArray():将链表转换为一个数组。
- set(int index, Object obj):将链表中指定位置上的元素替换成新元素。
- contains(Object obj):判断链表节点对象中是否含有obj。
- isEmpty():返回true表示链表中没有任何元素。
- size():返回链表长度。
2.1.3 Vector
Vector底层也是数组,他是线程安全的,所以访问速度比Array List慢。当Vector的容量不够时,自动扩容一倍的容量。
常用方法与ArrayList类似。
2.2 Set接口
Set无序且不能重复。
2.2.1 HashSet
HashSet底层是哈希表,HashSet 通过 hashCode 值来确定元素在内存中的位置。一个 hashCode 位置上可以存放多个元素。元素的哈希值是通过元素的hashcode 方法来获取的, HashSet 首先判断两个元素的哈希值,如果哈希值一样,接着会比较equals 方法 如果 equls 结果为 true ,HashSet 就视为同一个元素。如果 equals 为 false 就不是同一个元素。
如图 1 表示 hashCode 值不相同的情况;图 2 表示 hashCode 值相同,但 equals 不相同的情况。
常用方法:
- add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
- size():返回Set集合中的元素个数。
- isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
- clear():移除此Set中的所有元素。
- contains(Object obj):如果Set包含指定的元素,则返回 true,否则返回false。
- remove(Object obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。
- iterator() :返回在此Set中的元素上进行迭代的迭代器。
2.2.2 TreeSet
TreeSet底层是二叉树,每增加一个对象都会进行排序,将对象插入的二叉树指定的位置。Integer 和 String 对象都可以进行默认的 TreeSet 排序,而自定义类的对象是不可以的,自己定义的类必须实现 Comparable 接口,并且覆写相应的 compareTo()函数,才可以正常使用。
常用方法:
- add(Object obj):向Set集合中添加元素,添加成功返回true,否则返回false。
- size():返回Set集合中的元素个数。
- isEmpty():如果Set不包含元素,则返回 true ,否则返回false。
- contains(Object obj):如果Set包含指定的元素,则返回 true,否则返回false。
- remove(Object obj) : 删除Set集合中的元素,删除成功返回true,否则返回false。
- ceiling(Object obj):返回此set中大于或等于给定元素的最小元素。
- floor(E e):返回此set中小于或等于给定元素的最大元素。
- lower(E e):返回此集合中的最大元素严格小于给定元素。
2.2.3 LinkedHashSet
LinkedHashSet 底层使用 LinkedHashMap 来保存所有元素,它继承HashSet,在相关操作上与父类 HashSet 的操作相同,直接调用父类 HashSet 的方法即可。输出LinkedHashSet集合中的元素时,元素的顺序和添加顺序一致。
2.3 Queue
先入先出,添加元素只能在队尾,移除只能在队首。LinkedList实现该接口。
常用方法:
- add(Object obj):添加一个元素到队尾,失败抛异常。
- remove():获取队首的元素,并从队列中移除,失败抛异常。
- element():获取队首的元素,但不从队列中移除,失败抛异常。
- offer(Object obj):添加一个元素到队尾
- poll():获取队首的元素,并从队列中移除
- peek():获取队首的元素,但不从队列中移除
3.Map接口
3.1 HashMap
HashMap基于数组、链表、红黑树,无序,访问速度快。HashMap的键只允许一条为null,值不限制。非线程安全,如果需要满足线程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。
- put(K key, V value) 将键(key)/值(value)映射存放到Map集合中。
- get(Object key):返回指定键所映射的值,没有该key对应的值则返回 null。
- size():返回Map集合中数据数量。
- clear():清空Map集合。
- isEmpty ():判断Map集合中是否有数据,如果没有则返回true,否则返回false。
- remove(Object key):删除Map集合中键为key的数据并返回其所对应value值。
- keySet():返回Map集合中所有key组成的Set集合。
- containsKey(Object key):判断集合中是否包含指定键,包含返回 true,否则返回false。
- entrySet():将Map集合每个key-value转换为一个Entry对象并返回由所有的Entry对象组成的Set集合。
3.4.3. HashTable(线程安全)
3.2 Hashtable
很多映射的常用功能与 HashMap 类似,不同的是它承自 Dictionary 类,并且是线程安全的,任一时间只有一个线程能写 Hashtable,并发性不如 ConcurrentHashMap,因为 ConcurrentHashMap 引入了分段锁。Hashtable 不建议在新代码中使用,不需要线程安全的场合可以用 HashMap 替换,需要线程安全的场合可以用 ConcurrentHashMap 替换。Hashtable键和值都不能为null。
3.3 TreeMap
TreeMap 实现 SortedMap 接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用 Iterator 遍历 TreeMap 时,得到的记录是排过序的。如果使用排序的映射,建议使用 TreeMap。