如果你想保证元素的唯一性(就是没有重复元素)可以选择 的实现类,所有
实现类都遵循统一约束。
" 与 区别
" 是实现了基于动态数组的数据结构, 基于链表的数据结构
对于随机访问 $ 和 ," 性能优于 ,因为 要
移动指针。
对于新增()和删除(), 性能优于 " ,因为
" 要移动数组。
底层实现:当程序以 $(%)获取集合中指定元素时," 性能大于
。因为 " 底层基于数组来保存集合元素,调用 $ 时底层调用
&'%(返回该元素,而 必须一个一个的搜索找到元素。
当程序以 ()添加元素时," 会对数组元素进行整体搬家,
如果添加元素导致超过底层数组长度," 必须在创建一个原来长度 ! 倍的
数组,再有垃圾回收器回收原来的数组,系统开销比较大。对于 主要开
销再 (%)上,他必须一个一个搜索过去,找到 % 处元素并在该元素
之前插入新元素。即使如此 性能依然高于 " 。
当程序 (%)时," 仍然需要对数组进行整体搬家,但
无需创建新数组(因此 " 执行 略快于 ),而 使
用 时与 时开销几乎完全相同。
# 和 " 区别
# 的方法都是同步的( )),是线程安全的,而 "
不是,由于线程同步必定会损耗性能,因此 " 比 # 性能好(而且
* 提供了一个 工具类,该工具类通过 ) 方法
既可以将 " 包装成线程安全的)。
# 或者 " 超过原始大小时," 总是扩充为原来的 ! 倍,
但 # 先判断 + 变量大于 , 时,则扩充后的容量为原来
容量-该变量值,否则扩充为原来的 倍
与 区别
实现 接口, 实现了 接口
仅存一个对象, 存储键值对
使用 ()添加元素, 通过 ()添加元素
通过对象来计算 的值,对于两个对象 可能相同,
所以用 . 来判断对象相等性。 通过 / 计算 。
! 相对于 快,因为它使用唯一的键获取对象
与 区别
是非线程安全的, 是线程安全的。
允许 和 为 ,而 都不能为
继承 & 虚拟类, 是 *&/ 中引进的
接口实现。