1.Collection
Collection是一个接口
Collections是一个类,并提供了一系列静态的方法实现对各种集合的搜索、排序等操作。
Collection的两个子接口为List和Set.
List:元素是有序的,并且允许重复。
Set:无序,不能含有重复的元素。
1)Collection接口的使用
public static void main(String[] args) {
Collection c=new ArrayList();//创建一个集合对象
c.add("1");//添加对象到集合中
c.add("2");
c.add("3");
System.out.println(c);
}
//输出[1, 2, 3]
2)List
List包括ArrayList和LinkedList
(1)ArrayList
ArrayList实现了collection的list接口,底层采用数组实现,内容有序,允许重复, 存取速度快,插入删除速度慢。
public static void main(String[] args) {
ArrayList al=new ArrayList();
al.add(123);//ArrayList存放的是对象,系统将123装箱成Integer类型的对象再存入
al.add("一");//String类对象
System.out.println(al);//输出时默认调用对象的toString()方法
System.out.println(al.get(0));//通过get()方法获取值
Object[] o=al.toArray();//将ArrayList转换为数组
System.out.println(o[1]);
}<pre name="code" class="java">//[123, A]
//123
//A
(2)LinkedList
LinkedList实现了collection的list接口内容有序,允许重复,底层使用双向链表实现,所以插入删除速度快,存取速度慢。
public static void main(String[] args) {
List list=new LinkedList();
list.add("A");
list.add("B");
list.add(1, "C");
System.out.println(list);
}
//输出[A, C, B]
3)Vector
常用方法:
push():添加元素
pop():删除栈顶元素
peek():获取栈顶元素
empty():判断栈是否为空
Stack<String> stack = new Stack<String>();
2)Set
Set包括HashSet和TreeSet,元素无序,不允许元素重复。
(1)HashSet
HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且采用散列的存储方法,所以没有顺序。HashSet按hash算法来存储元素,因此具有很好的存取和查找性能。
特点:1、不能保证元素的排列顺序,顺序有可能发生变化。
2、HashSet是异步的。
3、集合元素值可以是null。
4、当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据该HashCode值来确定该对象在HashSet中存储的位置。
public static void main(String[] args) {
Set set=new HashSet();
set.add("A");
set.add("C");
set.add("C");
System.out.println(set);
}
//输出[A, C]
来源:http://www.cnblogs.com/wyl-study/archive/2012/01/31/2332440.html
(2)TreeSet
使用红黑树存储,TreeSet可以确保集合元素处于排序状态。
public static void main(String[] args) {
TreeSet set=new TreeSet();
set.add(1);
set.add(5);
set.add(3);
set.add(9);
System.out.println(set.first());//输出第一个元素
System.out.println(set.headSet(5));//输出小于5的元素的集合
System.out.println(set.tailSet(5));//输出大于等于5的元素的集合
System.out.println(set.subSet(1, 9));//输出小于9大于等于1的元素的集合
System.out.println(set);
}
1
[1, 3]
[5, 9]
[1, 3, 5]
[1, 3, 5, 9]
2.Map
Map用来存储键值对<Key,Value>的元素。映射中不能包含重复的键,每个键最多只能映射一个值。
1)HashMap
继承AbstractMap,HashMap允许空(null)键值(key),非线程安全。
往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。
public static void main(String[] args) {
Map map=new HashMap();
map.put("1", "A");
map.put("2", "B");
map.put("1", "C");
map.put("", "D");
System.out.println(map);
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry entry = (Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
System.out.println(key+":"+val);
}
}
输出:
{=D, 2=B, 1=C}
:D
2:B
1:C
来源:http://www.cnblogs.com/devinzhang/archive/2012/01/13/2321481.html
2)TreeMap
基于红黑树数据结构的实现。查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)。TreeMap的特点在 于,你得到的结果是经过排序的。TreeMap是唯一的带有subMap()方法的Map,它可以返回一个子树。
3)HashTable
继承Dictionary,是线程同步的,不能接受null值。
题目:
1.HashMap和HashTable的区别?
HashMap和Hashtable都实现了Map接口,但决定用哪一个之前先要弄清楚它们之间的分别。主要的区别有:线程安全性,同步(synchronization),以及速度。
- HashMap几乎可以等价于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受为null的键值(key)和值(value),而Hashtable则不行)。
- HashMap是非synchronized,而Hashtable是synchronized,这意味着Hashtable是线程安全的,多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的扩展性更好。
- 另一个区别是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。这条同样也是Enumeration和Iterator的区别。
- 由于Hashtable是线程安全的也是synchronized,所以在单线程环境下它比HashMap要慢。如果你不需要同步,只需要单一线程,那么使用HashMap性能要好过Hashtable。
- HashMap不能保证随着时间的推移Map中的元素次序是不变的。
要注意的一些重要术语:
1) sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
2) Fail-safe和iterator迭代器相关。如果某个集合对象创建了Iterator或者ListIterator,然后其它的线程试图“结构上”更改集合对象,将会抛出ConcurrentModificationException异常。但其它线程可以通过set()方法更改集合对象是允许的,因为这并没有从“结构上”更改集合。但是假如已经从结构上进行了更改,再调用set()方法,将会抛出IllegalArgumentException异常。
3) 结构上的更改指的是删除或者插入一个元素,这样会影响到map的结构。
我们能否让HashMap同步?
HashMap可以通过下面的语句进行同步:
Map m = Collections.synchronizeMap(hashMap);
结论
Hashtable和HashMap有几个主要的不同:线程安全以及速度。仅在你需要完全的线程安全的时候使用Hashtable,而如果你使用Java 5或以上的话,请使用ConcurrentHashMap吧。