1. 集合类
AbstractCollection
实现了Collection
类中的部分方法,具体的集合类就可以实现AbstractCollection
类了(它实现了例如contains,toString等方法),如图一所示
<center>图1. 集合框架中的类</center>
Java 中的链表,LinkedList
- Java中的链表都是双向链表
LinkedList.add
只会将元素添加在表尾,如果需要在任意位置添加元素,需要使用ListIterator
接口,例如:ListIterator<String> iter = tmpList.listIterator(); // 遍历迭代器到指定位置,然后执行插入 for(int i=0;i<n;i++) iter.next(); iter.add("inster string");
- 迭代器在操作同一个集合是可能会出现异常,即,一个迭代器删除了一个元素,另一个迭代器执行next方法希望返回这个被删除的元素,则会抛出
ConcurrentModificationException
。解决方案是:第一,关联集合的所有迭代器只读,或者只有一个迭代器可以修改;第二,集合有一个操作次数,每个迭代器有一个操作次数,当迭代器本身的操作次数和集合的操作次数不相等,则抛出异常。 - LinkedList.get方法当索引大鱼n//2时,从列表尾端开始访问,注意这并不是随机访问,链表不支持随机访问。
数组列表
- ArrayList封装了一个动态再分配的对象数据。
- 散列表(hash table)
其实就是使用链式法解决冲突,注意,在Java8之后,当桶满的时候,链表会变为平衡二叉树,以提高性能。 (桶数时开始指定的,搜集具有相同散列码的数目)。
- 另外,当装填因子大于0.75,就会再散列,即丢弃原来的散列表,将所有元素插入新表,新表的桶数是原来的两倍。
TreeSet(有序集合)
- 底层排序使用的是红黑树,必须实现了Comparable接口或者必须提供Comparator。
- 队列与双端队列,底层是堆,队头总是最小的元素
映射
- HashMap(无序)
- TreeMap(有序)
弱散列映射(WeakHashMap)
假定程序中的任何部分不会再引用这个键,因此,无法从映射中删除这个键值对。WeakHashMap即就是解决这个问题的。当对键的唯一引用来自算列表本身时,(外部没有任何地方再引用这个键),WeakHashMap则会删除这个键值对。实现原理,
- LinkedHashSet和LinkedHashMap会记住插入顺序,而上文所提到的有序 指的是,数据结构会根据元素本身对元素经行排序。LInkedHashMap还可以根据访问顺序排列,即调用get和put时,将当前元素删除放到尾部。
- IdentityHashMap的散列码不是使用hashCode函数计算得到的,而是根据对象的内存地址计算得到的,因此,IdentityHashMap对象的比较使用
==
而不是equals
。
2. 视图与包装器
小集合,Java9引入了给定元素,生成对应集合列表,map的方式,例如,
List.of(x,y,z) Map.of()
- 视图,其实就很类似python中的切片,获得某个区间的元素,一般是左闭右开的,但是
NavigableSet
可以更详细的定义左右两个端点是否包含。 不可修改视图
同步视图(Synchronized Views)
对于普通的集合,如果一个线程准备读,一个线程准备再散列,将会引起异常,为此,
Collections.synchronizedMap
即保证了线程安全,也就是它保证了一个线程操作完毕之后,其它线程才能继续操作。Checked views
其实就是
Collections.checkedList(list,String.class)
用来检测Collection
中的所有元素是否符合第二个参数的类型,用来避免泛型编程中出现类型不统一的错误,例如刚才提到的就会检测list
中的元素是否都是String
类型。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。