△列表迭代器也是不支持在迭代的时候添加元素的,只是列表迭代器自己定义了增删的方法而已.迭代器可以看成实在两个元素之间的指针,每当调用next就跳过一个元素并返回刚刚跳过的元素.
△HashTable不允许null作为键和值,而HashMap可以.
△在Java中,所有链表实际上都是双向连接的,即每个节点还存放着指向前驱节点的引用
,add方法将在listiterator迭代器位置前添加一个元素.尽管有Listiterator,但是对列表的并发修改仍然会产生异常,但是这里有个特例,set操作不被视为结构性的修改.
△链表不支持随机访问,调用get方法,依然需要逐个寻找,因此对于列表,非常不建议下列的做法(效率极低,最好用迭代器):
for(int i=0;i<list.size();i++) { list.get(i); }
△散列表由链表数组实现.每个列表称为桶.先计算散列码,然后得到桶的索引,最后根据桶内如果有重复元素,在根据equals方法判断是否重复.
△优先级队列:迭代的时候无序,但是remove的时候是有顺序的.
△集合框架中视图的概念:
通过使用视图,可以获得其他实现了集合接口和映射表接口的对象.例如keyset方法,看似好像创建了一个新集,但是这个类的方法可以对原映射表进行操作.例如:如果在keyset中remove了某个key,对应的映射表会被删除.
△LinkedHashSet和LinkedHashMap,链接散列映射表将用访问顺序而不是插入顺序对于映射条目进行迭代.(ArrayList是插入顺序).每次调用get或put则会更新顺序,将使得元素到了条目的尾部,因此有利于寻找什么元素访问频率较低,在枚举的前几个元素都是访问低的..,要想构造这样的HashMap,在构造函数的时候使用:LinkedHashMap<K,V>(initialCapacity,loadFactor,true).
△RandomAccess接口可以用来检测一个集合是否支持高校的随机访问.(标记性接口),ArrayList和Vector类实现了RandomAccess接口
△Arrays类的静态方法返回了一个包含了普通数组的一个List包装器.例如:
Card[] cardDeck=new Card[2]; List<Card> cardList=Arrays.asList(cardDeck);
返回的是视图对象带有访问底层数组的get和set方法,改变数组大小的所有方法(add和remove)都会抛出异常.
collections.nCopies(n,anObject):将返回一个不可修改的实现类List接口的对象,对象中有n个元素,每个元素都是"anObject".
△子范围视图也可以建立.例如对于一个列表可以调用subList获得一个列表的子范围视图.可以将任何操作应用于子范围,并且能够真实反映整个列表的情况.例如,下列操作将删除一个列表的第一个元素到第9个元素(包含头不包含尾):
List group=staff.subList(1,10);
group.clear();
△Collections.unmodifiableList(list):将返回一个不可修改的列表视图,Collections.synchronizedMap(new HashMap<>());将返回一个线程安全的HashMap.