Java容器类浅谈

https://www.programcreek.com/2013/03/hashmap-vs-treemap-vs-hashtable-vs-linkedhashmap/
http://www.cnblogs.com/LittleHann/p/3690187.html
http://www.cnblogs.com/200911/p/3948436.html

基本概念

容器的概念

在Java内部有一些类库,专门用来存放其它类的对象,这些类就叫做容器,或者就叫做集合。就是将若干性质相同或相近的类对象组合在一起而形成的一个整体。

大多集合类都位于java.util包下,为了处理多线程并发环境下的线程安全问题,java 5在java.util.concurrent包下提供了一些多线程支持的集合类。

容器存在的意义

早期的OOP语言都通过数组的方式来实现对引用集的集中管理和维护。但是数组需初始化指定长度,容量难以扩充,数组中数据的类型必须相同,因此需要更为灵活的数据容器。(其实,如果知道数据结构中关于数组和链表的表述可以想象得到…)

数组是一种内存结构,而容器是一种数据结构。

  1. 容器不能通过下标的方式访问容器中的元素。
    2、数组的所有功能通过Arraylist容器都可以实现,只是实现的方式不同
    3、如果非要将容器当做一个数组来使用,通过toArraylist方法返回的就是一个数组

  2. 数组可以存储基本数据类型,也可以存储引用数据类型,集合只能存储引用数据类型。
    数组只能保存特定类型。数组可以保存基本类型,但容器只能容纳对象。(添加基本数据时,会把基本数据类型数据封装成该数据类型封装类的对象);创建一个数组时可让它容纳一种特定的类型。这意味着可进行编译时间的类型检查防范自己设置了错误的类型或者错误地提取了一种类型,而不是运行时的Exception。容器不以具体的类型来处理对象,它们将所有对象都按Object类型处理。Java对数组和容器都做边界检查;如果过了界,它就会给一个RuntimeException。

  3. 数组是固定长度的,集合的长度是可变的。
    数组是一种高效的存储和随机访问对象引用序列的方式,但是当创建一个数组对象(注意和对象数组的区别)后,数组的大小也就固定了,当数组空间不足的时候就再创建一个新的数组,把旧的数组中所有的引用复制到新的数组中。(数组是一种内存结构,而容器是一种数据结构)[知道数组的长度,而且以后也不会再增加,那肯定就使用数组了;如果数组的长度不定或者说是长度会增加,为了方便起见使用容器]

  4. 数组存储的元素必须是同一个数据类型;集合存储的对象可以是不同数据类型。

总结:
一般情况下,考虑到效率与类型检查,应该尽可能考虑使用数组。如果要解决一般化的问题,数组可能会受到一些限制,这时可以使用Java提供的容器类。

自动拆箱,装箱

ArrayList和HashMap是异步的,Vector和Hashtable是同步的

HashMap vs. TreeMap vs. LinkedHashMap vs. ConcurrentHashMap vs. Hashtable

集合类 Key Value Super Interface Synchronized
Hashtable 非null 非null Dictionary Map 线程安全
ConcurrentHashMap 非null 非null AbstractMap ConcurrentMap extends Map 分段锁技术
TreeMap 非null 可null AbstractMap NavigableMap extends SortedMap extends Map 线程不安全
HashMap 可null 可null AbstractMap Map 线程不安全
LinkedHashMap 可null 可null HashMap Map 线程不安全

Java容器类浅谈