Java学习笔记(七)
Contents
Java核心技术卷一基础知识第10版
#集合
for each
循环可以与任何实现了Iterable
接口的对象一起工作。- 迭代器访问
HashSet
虽然可以确定在迭代过程中能够遍历到集合中的所有元素,但却无法预知元素被访问的次序。 - 将 Java 迭代器认为是
位于两个元素之间
的。当调用next
时,迭代器就越过下一个元素,并返回刚刚越过的那个元素的引用。 - 如果想删除两个相邻的元素,需要先
next
再remove
。1
2
3
4
5Iterator<String> it = c.Iterator();
it.next();
it.remove();
it.next();
it.remove(); - 在 Java 程序设计语言中,所有链表实际上都是
双向链接的
。
集合类型 | 描述 |
---|---|
ArrayList | 一种可以动态增长和缩减的索引序列 |
LinkedList | 一种可以在任何位置进行高效地插人和删除操作的有序序列 |
ArrayDeque | 一种用循环数组实现的双端队列 |
HashSet | 一种没有重复元素的无序集合 |
TreeSet | —种有序集 |
EnumSet | 一种包含枚举类型值的集 |
LinkedHashSet | 一种可以记住元素插人次序的集 |
PriorityQueue | 一种允许高效删除最小元素的集合 |
HashMap | 一种存储键/值关联的数据结构 |
TreeMap | 一种键值有序排列的映射表 |
EnumMap | 一种键值属于枚举类型的映射表 |
LinkedHashMap | 一种可以记住键/值项添加次序的映射表 |
WeakHashMap | 一种其值无用武之地后可以被垃圾回收器回收的映射表 |
IdentityHashMap | 一种用 == 而不是用 equals 比较键值的映射表 |
- 数组和数组列表都有一个重大的缺陷。这就是从数组的
中间位置插入/删除
一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。 - 链表是一个有序集合。
- 可以根据需要给容器附加许多的迭代器,但是这些迭代器只能
读取列表
。另外,再单独附加一个既能读又能写
的迭代器。 - 迭代器检测到并发修改:在每个迭代器方法的开始处检查自己改写操作的计数值是否与集合的改写操作计数值一致。
- 散列表(hash table):要想査找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。
- 装填因子(load factor)决定何时对散列表进行再散列。
- 树集是一个有序集合。
- 链接散列映射将用
访问顺序
,而不是插入顺序
,对映射条目进行迭代。 - 每次调用 get 或 put,受到影响的条目将从当前的位置删除,并放到条目链表的尾部(只有条目在链表中的位置会受影响,而散列表中的桶不会受影响。一个条目总位于与键散列码对应的桶中)。
- EmimSet 是一个枚举类型元素集的高效实现。EnumSet 类没有公共的构造器。
IdentityHashMap
类的键的散列值不是用hashCode
函数计算 的,而是用System.identityHashCode
方法计算的。它根据对象的内存地址来计算散列码。两个对象在比较时使用==
。