Java进阶—集合
Collection接口
Collection是基本的集合接口,不提供直接的接口实现,实现Collection接口必须都提供两套标准的构造函数,一个是无参,用于创建一个空的 Collection,一个是带有 Collection 参数的有参构造函数,用于创建一个新的 Collection
List接口
List 接口为 Collection 直接接口,是有序的 Collection,用户可以对列表中每个元素的插入位置进行精确地控制
ArrayList
ArrayList 是一个动态数组,允许任何符合规则的元素插入甚至包括 null
ArrayList 擅长于随机访问
每个 ArrayList 实例都有一个容量,该容量是指用来存储列表元素的数组的大小。默认初始容量为 10。随着 ArrayList 中元素的增加,它的容量也会不断的自动增长。
注意,ArrayList 实现不是同步的。 注意,ArrayList 实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须保持外部同步。所以为了保证同步,最好的办法是在创建时完成,以防止意外对列表进行不同步的访问。
LinkedList
LinkedList 是一个双向链表,除了基本操作方法外还提供了get,remove,insert 方法
LinkedList 不能随机访问
在列表中索引的操作将从开头或结尾遍历列表,好处在于能以较低的代价进行插入删除操作
LinkedList实现也是不同步的。
LinkedList实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作
Vector
操作几乎和ArrayList一样,但Vector的是实现是同步的,是线程安全的动态数组
Stack
Stack 继承自 Vector,实现一个后进先出的堆栈
Stack 提供 5 个额外的方法使得 Vector 得以被当作堆栈使
用。基本的 push 和 pop 方法,还有 peek 方法得到栈顶的元素,empty 方法测试堆栈是否为空,search 方法检测一个元素在堆栈中的位置
Stack 刚创建后是空栈
Set接口
Set 是一种不包括重复元素的 Collection。Set有自己的内部顺序,所以随机访问没有意义,他运行null的存在但仅有一个
所有传入 Set 集合中的元素都必须不同,同时要注意任何可变对象
实现了 Set 接口的集合有:EnumSet(枚举的专用 Set)、HashSet(称查询速度最快的集合,因为其内部是以 HashCode 来实现的)、TreeSet(生成一个总是处于排序状态的 set,内部以 TreeMap 来实现)
Map接口
Map是由一系列键值对组成的集合,提供了 key 到 Value 的映射,也没有继承 Collection,
一个 key 对应一个 value,所以它不能存在相同的 key 值,value 值可以相同
实现 map 的有:HashMap、TreeMap、HashTable、Properties、EnumMap
HashMap
是我们使用非常多的 Collection,它是基于哈希表的 Map 接口的实现,以 key-value 的形式存在
HashMap 实现了 Map 接口,继承 AbstractMap
TreeMap
TreeMap的键以某种排序规则排序,内部以 red-black(红-黑)树数据结构实现,实现了 SortedMap 接口
HashTable
HashMap也是以哈希表数据结构实现的,解决冲突时与 HashMap 也一样也是采用了散列链表的形式,不过性能比 HashMap 要低
HashTable 继承 Dictionary 类,实现 Map 接口。其中 Dictionary 类是任何可将键映射到相应值的类(如 Hashtable )的抽象父类
Queue
主要分为两大类,一类是阻塞式队列,队列满了以后再插入元素则会抛出异常,主要包括 ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。另一种队列则是双端队列,支持在头、尾两端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList