Java泛型
Java中常用的数据结构,Map、List、Set。
以Map<k, v>
和List<T>
来说,Map是以键值对key-value结构存储的集合,List是对象的列表。
Map
Map是一个接口,所以不能直接 new Map。
HashMap是Map的一个实现类,所以可以new HashMap。
常见的用法是:
Map<String, Integer> map = new HashMap<String, Integer>();
常见的Map实现类还有Hashtable。
HashMap
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
HashMap与Hashtable的比较
- 二者都实现了Map接口、Cloneable、Serializable接口,不同的是Hashtable继承自老旧的Dictionary类,HashMap继承自AbstractMap
- Hashtable是同步的,HashMap是非同步的。也就是说Hashtable是线程安全的,HashMap不是线程安全的。同步和线程安全指的是在多线程同时操作同一个Hashtable的时候,可以保证里面的数据是一致的。而HashMap则需要在在程序中自己来做同步。不过自Java 1.5之后,java提供了同步的HashMap,
java.util.concurrent.ConcurrentHashMap
。 - Hashtable可以使用Iterator和Enumeration来循环, HashMap只能使用Iterator循环
- Hashtable不允许为null的key和value,HashMap允许有一个key为null,允许有多个value为null。 >所以HashMap不能使用get(key)是否为null来判断是否存在某个key,应该使用containsKey(key)来判断。
- HashMap的size始终是2的次方,Hashtable的扩容方式是现有容量乘以2+1。
HashMap和Hashtable的衍生类
HashMap和Hashtable都是无序的,HashMap有一个之类LinkedHashMap,是有序的。
Hashtable最常见的之类是Properties
List
List是一个接口,继承自Collection。
public interface List<E> extends Collection<E>
由于List是个接口,所以不能直接 new List。
ArrayList
ArrayList是List的一个实现类,所以可以new ArrayList。用法如下:
List<String> list = new ArrayList<String>();
ArrayList的定义是这样的:
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
- ArrayList是无序的;
- ArrayList允许重复;
Set
Set也是一个接口,继承自Collection
public interface Set<E> extends Collection<E>
- Set不允许重复。
- Set是无序的。