java容器(Container)
1.什么是容器
容器是一个Java 所编写的程序,原先必须自行编写程序以管理对象关系,容器都会自动帮您做好。
2.java中三大容器
Java中的容器类型包括:List、Set和Map
map | set | list |
---|---|---|
以键值对的方式存储 键相同时值会被覆盖 | 不能存放相同的元素 | 可以存放相同的元素 |
基于哈希表或者红黑树实现 | 基于Map实现 | 基于数组或者链表实现 |
3.java内置的容器类
Java内部的容器类主要分为两类:Collection(集合)与Map(映射)。
Collection
set
HashSet
- 基于哈希表实现,底层使用HashMap来保存所有元素。
- 不能保证迭代顺序。
- 允许使用null元素。
LinkedHashSet
- LinkedHashSet底层使用LinkedHashMap来保存所有元素,它继承于HashSet。
- 内部使用双向链表维护插入顺序。
TreeSet
- 基于(TreeMap)红黑树实现 TreeSet非同步,线程不安全。
- TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。
List
ArrayList
- 实现 List 接口、底层使用数组保存所有元素。
- 相当于动态数组,支持动态扩容。
- 不同步。
Vector
- Vector可以实现可增长的对象数组。
- Vector 实现 List 接口,继承 AbstractList 类,同时还实现 RandmoAccess 接口,Cloneable 接口。
- Vector 是线程安全的 LinkedList LinkedList。
LinkedList
- 是基于链表实现的。
- 所以它的插入和删除操作比 ArrayList更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。
Queue
LinkedList
- 可以用于实现双向队列。
Map(用于映射(键值对)问题处理)
HashMap
- HashMap根据键的HashCode来实现,访问速度较快,遍历顺序并不确定。
- HashMap最多只允许一条记录的键为null,允许多条记录的值为null。
- HashMap线程不安全。
- 确保线程安全,可以用Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。
-
HashTable
- HashTable是遗留类,多数功能与HashMap类似,继承自Dictionary类。
- HashTable是线程安全的。也就是说任意时刻只有一个线程能够写HashTable。
- HashTable的并发性不如ConcurrentHashMap,因为ConcurrentHashMap引入了分段锁。
LinkedHashMap
- 基于哈希表和链表实现,借助双向链表确保迭代顺序是插入的顺序。
TreeMap
- 基于红黑树实现 。
- 默认按照键值得升序进行排序。
- 在使用TreeMap时,key必须实现Comparable接口或者在构造TreeMap传入自定义的Comparator,
否则会在运行时抛出java.lang.ClassCastException类型的异常。