Java Queue

Java Queue中应当使用offer和poll而不是add和remove,原因是
一些队列有大小限制,因此如果想在一个满的队列中加入一个新项,多出的项就会被拒绝。 offer 方法不是对调用 add() 方法抛出一个 unchecked 异常,而只是得到由 offer() 返回的 false。

poll() 方法在用空集合调用时不是抛出异常,只是返回 null。因此新的方法更适合容易出现异常条件的情况。

peek,element区别:element() 和 peek() 用于在队列的头部查询元素。与 remove() 方法类似,在队列为空时, element() 抛出一个异常,而 peek() 返回 null。

Vector、ArrayList、LinkedList

Vector是Java早期提供的线程安全动态数组,如果不需要线程安全,并不建议选择,毕竟同步是有额外开销的。Vector内部是使用对象数组来保存数据,可以根据需要自动的增加容量,当数组已满时,会创建新的数组,并拷贝原有数组数据。

ArrayList是应用更加广泛的动态数组实现,它本身不是线程安全的,所以性能要好很多。与Vector近似,ArrayL ist也是可以根据需要调整容量,不过两者的调整逻辑有所区别,Vector 在扩容时会提高1倍,而ArrayList则是增加50%。

LinkedList顾名思义是Java提供的双向链表,所以它不需要像上面两种那样调整容量,它也不是线程安全的。

Java asList数组转集合

Arrays.asList() 方法,这个方法会返回一个 ArrayList 类型的对象。但是用这个对象对列表进行添加删除更新操作,就会UnsupportedOperationException 异常。这个 ArrayList 类并非 java.util.ArrayList 类,而是 Arrays 类的静态内部类!内部类里面并没有 add、remove 方法,这个类继承的 AbstractList 类里面有这些方法。如果是想将一个数组转化成一个列表并做增加删除操作的话以
Arrays.asList() 作为参数新建一个arraylist,真正的arraylist。

Hashtable、HashMap、TreeMap

Hashtable是早期Java类军提供的一个哈希表实现,本身是同步的,不支持null 键和值,由于同步导致的性能开销,所以已经很少被推荐使用

HashMap是应用更加广泛的哈希表实现,行为上大致上与HashTable 一致,主要区别在于HashMap不是同步的,支持null键和值等。通常情况下,HashMap进行put或者get 操作,可以达到常数时间的性能,所以它是绝大部分利用键值对存取场景的首选,比如, 实现一个用户ID和用户信息对应的运行时存储结构。不是线程安全的。

TreeMap则是基于红黑树的一种提供顺序访问的Map,和HashMap不同,它的get、put、remove之类操作都是0 (log(n)) 的时间复杂度,具体顺序可以由指定的Comparator来决定,或者根据键的自然顺序来判断。