集合:只能存儲對象,對像類型可以不一樣,長度可變。
常用的接口和類:
1、List接口(有序、可重複):ArrayList類、LinkedList、Vector類
2、Set接口(無序、不能重複):HashSet類、TreeSet類
3、Map接口(鍵值對、鍵唯一、值不唯一):HashMap類、Hashtable類、TreeMap類
集合類的循環遍歷
1、普通for循環:如for(int i=0;i<arr.size();i++){…}
2、foreach(增強型for循環):如for(Object i:arr){…}
3、Iterator(迭代器):如Iterator it = arr.iterator();while(it.hasNext()){ Object o =it.next(); …}
注意:無法在遍歷的過程中對數組或者集合進行修改,而for循環可以在遍歷的過程中對源數組或者集合進行修改
ArrayList、LinkedList和Vector的區別
ArrayList:效率高,多用於查詢
LinkedList:多用於插入和刪除
Vector:線程安全,多用於查詢
代碼:
import java.util.ArrayList;import java.util.Iterator;import java.util.LinkedList;import java.util.List;import java.util.Vector;public class ListTest {public static void main(String[] args){List arrayList=new ArrayList();List linkedList=new LinkedList();List vector=new Vector();arrayList.add("1"); //字符類型arrayList.add("1"); //重複元素arrayList.add("2");arrayList.add(1); //數字類型linkedList.add("1");linkedList.add("1");linkedList.add("2");linkedList.add(1);vector.add("1");vector.add("1");vector.add("2");vector.add(1);for(Object obj:arrayList){ //foreach循環System.out.println(obj);}for(int i=0;i<linkedList.size();i++){ //普通for循環System.out.println(arrayList.get(i));}Iterator it = vector.iterator(); //迭代器while(it.hasNext()){Object j=it.next();System.out.println(j);}}}HashSet和TreeSet的區別
HashSet:HashSet 是哈希表實現的,HashSet中的數據是無序的,可以放入null,但只能放入一個null
TreeSet:TreeSet是二差樹實現的,Treeset中的數據是自動排好序的,不允許放入null值
代碼:
public class SetTest {public static void main(String[] args){Set hashSet=new HashSet();Set treeSet=new TreeSet();hashSet.add("1"); //字符類型hashSet.add("1"); //重複元素hashSet.add("2");hashSet.add(1); //數字類型treeSet.add("1");treeSet.add("1");treeSet.add("2");//treeSet.add(1); //報錯,treeSet不能添加不同的數據類型for(Object i:hashSet){ //foreach循環System.out.println(i);}Iterator it = treeSet.iterator(); //迭代器while(it.hasNext()){Object j=it.next();System.out.println(j);}}}注意:Set接口沒有get方法,所以不能使用普通for循環來遍歷
HashMap、Hashtable和TreeMap的區別
HashMap:HashMap允許存在一個為null的key,多個為null的value
Hashtable:hashtable的key和value都不允許為null
TreeMap:能夠把它保存的記錄根據鍵排序,默認是按鍵值的升序排序,也可以指定排序的比較器,當用Iterator 遍歷TreeMap時,得到的記錄是排過序的
代碼:
import java.util.HashMap;import java.util.Hashtable;import java.util.Iterator;import java.util.Map;import java.util.Set;import java.util.TreeMap;public class MapTest {public static void main(String[] args){Map hashMap=new HashMap();Map hashtable=new Hashtable();Map treeMap=new TreeMap();hashMap.put(1, "1"); //字符類型值hashMap.put(2, "1"); //同值不同鍵hashMap.put(3, "2");hashMap.put(4, 1); //數字類型值hashMap.put("5", 1); //字符類型鍵hashtable.put(1, "1");hashtable.put(2, "1");hashtable.put(3, "2");hashtable.put(4, 1);hashtable.put("5", 1);treeMap.put(1, "1");treeMap.put(2, "1");treeMap.put(5, "2");treeMap.put(4, 1);//treeMap.put("5", 1); //報錯,TreeMap不能添加不同類型的鍵//遍歷hashMap鍵for(Object key:hashMap.keySet()){System.out.println(key);}//遍歷hashtable值for(Object value:hashtable.values()){System.out.println(value);}//遍歷hashMap鍵值對Set set = hashMap.keySet();for(Iterator iter = set.iterator(); iter.hasNext();){Object key = iter.next();Object value = hashMap.get(key);System.out.println(key+"/t"+value);}//迭代遍歷hashtable鍵值對,倒序! Iterator table = hashtable.entrySet().iterator();while(table.hasNext()){Map.Entry entry = (Map.Entry) table.next(); Object key = entry.getKey(); //取鍵Object value = entry.getValue(); //取值System.out.println(key+"/t"+value); }//迭代遍歷treeMap鍵值對Iterator tmp = treeMap.entrySet().iterator();while(tmp.hasNext()){Map.Entry entry = (Map.Entry) tmp.next(); Object key = entry.getKey(); //取鍵Object value = entry.getValue(); //取值System.out.println(key+"/t"+value); }}}關於線程安全的類有:Vecto、HashTabl、StringBuffe
非線程安全:ArrayList 、LinkedList、HashMap、HashSet、TreeMap、TreeSet、StringBulider
注意:ConcurrentHashMap可代替HashMap用於線程安全,且效率比Hashtable高
java自身的機制並不能完全保證線程安全。需要自己手動編碼控制。