目录
集合图

集合图.png
集合机制
快速失败
- java.util包下面的所有的集合类都是快速失败fail-fast迭代器的,而java.util.concurrent包下面的所有的类都是安全失败fail-safe迭代器的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。因为安全失败是基于之前的数据进行一份拷贝,所以不受源集合的影响。
- 可以通过遍历集合,添加到另一个新集合解决遍历时修改问题
- 通过modCount统计修改次数
- foreach不能add或者remove否则会报错,但普通for循环可以(如果每次删除一个元素之后忘记了将角标减一的话可能会出问题的),迭代器也可以(迭代器是modCount != expectedModCount这么判断的, 每次迭代器操作会expectedModCount = modCount, 如果用的不是迭代器而是list.remove会报错)
- 迭代器会有相应的checkModify会可能fast-fail
while(integerIterator.hasNext()){
Integer x = integerIterator.next();
// 正常
integerIterator.remove();
// 这段代码会报错ConcurrentModificationException
//list.remove(1);
}
安全失败
- ConcurrentHashmap之类的并发安全类,不会抱ConcurrentModificationException,因为他是并发安全的
- COW也不会抱ConcurrentModificationException,因为它也是并发安全的。
for in 和 iterator区别 和 普通for循环效率对比
- for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合
Foreach的内部实现是通过迭代器来完成的,实现Iterable接口的类可以使用Foreach句型
虽然数组也可以使用Foreach句型,但数组并不是Iterable。Map虽然不能使用Foreach,但可以通过Map.Entry来对Map进行Foreach遍历
Map也可以用stream
Map<String, String> map = new HashMap<>();
map.entrySet().stream().filter();
- 由 TreeMap 和 ConcurrentSkipListMap 实现的 NavigableMap 接口解决了需要选择Map有序性
LinkedHashMap 可以作为LRU 这样可以轻松创建一个能够定期清理以节省空间的程序
SortedMap (由 TreeMap 或 ConcurrentSkipListMap 实现),键保证按排序顺序
Stack栈
- 在需要栈行为时使用 LinkedList ,或者从 LinkedList 类创建的 onjava.Stack 类。因为Stack继承自Vector,有性能之类的问题。
EnumSet,EnumMap
- 相当于操作Enum的set和map, 很多都基与位运算。
- 使用 BitSet 而不是 EnumSet 的唯一原因是,不知道在运行时需要多少标志 bitset使用long。
BitSet占空间太大,尽量不要用。
不可修改的类
- 不可修改的类会抛出UnsupportedOperationException异常 大部分操作都是可选操作都不会抛出这种异常
List<Integer> list2 = new ArrayList<>();
list2.add(3);
list2.add(4);
// 会抛出异常
List<Integer> list3 = Collections.unmodifiableList(list2);
list3.add(4);
参考文章
网友评论