java类容器的继承关系
JAVA的容器---List,Map,Set
Collection
├List
│├LinkedList
│├ArrayList
│└Vector
│ └Stack
└Set
Map
├Hashtable
├HashMap
└WeakHashMap
HashMap HashTable 是无序的,ArrayList TreeMap是有序的。
ArrayList LinkList HashMap 非同步
HashTable Vector 同步(同步的没有非同步的集合性能高)
JAVA类容器使用
不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:
Iterator it = collection.iterator(); // 获得一个迭代子
while(it.hasNext()) {
Object obj = it.next(); // 得到下一个元素
}
由Collection接口派生的两个接口是List和Set。
LinkedList的内 部实现是链表,它适合于在链表中间需要频繁进行插入和删除操作,ArrayList从其命名中可以看出它是一种类似数组的形式进行存储,因此它的随机访问速度极快,如果需要快速随机访问元素,应该使用ArrayList。
如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。
尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。
在使用add()方法增加新的元素时,如果要增加的数据量很大,应该使用ensureCapacity()方法,该方法的作用是预先设置Arraylist的大小,这样可以大大提高初始化速度。
LinkedList一样,ArrayList也是非同步的(unsynchronized)。
Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=falses
Map中元素,可以将key序列、value序列单独抽取出来。使用keySet()抽取key序列,将map中的所有keys生成一个Set;使用values()抽取value序列,将map中的所有values生成一个Collection。 为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。
HashMap 和 HashTable的区别
线程安全不同
HashTable的方法是同步的,HashMap是未同步,所以在多线程场合要手动同步HashMap。HashMap效率高
对NULL的处理不同
HashTable不允许null值(key和value都不可以), 编译期不会检查,运行期会出现空指针异常。
HashMap允许null值(key和value都可以)。当get()方法返回null值时,即可以表示 HashMap中没有该键,也可以表示该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键,而应该用containsKey()方法来判断。
方法不同
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。
Map的排序
匿名内部类的使用:
要产生的新类需要继承于一个已有的父类或者实现一个接口,并且这个类的声明只在创建此类对象时用了一次。
Map的遍历
方法1:
方法2:
比较:
entrySet比keySet 效率要高很多。
keySetMap.keySet()会生成KeyIterator迭代器,其next方法只返回其key值
entrySetMap.entrySet()方法会生成EntryIterator 迭代器,其next方法返回一个Entry对象的一个实例,其中包含key和value
方式一再取得key所对应的value时,此时还要访问Map的这个方法,这时,方式一多遍历了一次table。
Collection是一个接口,没有任何直接实现类
Collection的实现类是指Collection的具体子接口的实现类
Collection的子接口常见的有List和Set,Map不是Collection的子接口。