java學習筆記系列:
java學習筆記10--泛型總結
java學習筆記9--內部類總結
java學習筆記8--接口總結
java學習筆記7--抽象類與抽象方法
java學習筆記6--類的繼承、Object類
java學習筆記5--類的方法
java學習筆記4--對象的初始化與回收
java學習筆記3--類與對象的基礎
java學習筆記2--數據類型、數組
java學習筆記1--開發環境平臺總結
本文地址:http://www.49028c.com/archimedes/p/java-study-note11.html,轉載請注明源地址。
Java集合框架概述集合就是將若干用途相同、近似的“數據”結合成一個整體。
集合從體系上分為三種:
(1) 列表(List):List集合區分元素的順序,允許包含相同的元素。
(2) 集(Set):Set集合不區分元素的順序,不允許包含相同的元素。
(3) 映射(Map):Map集合保存的”鍵”-“值”對,“鍵”不能重復,而且一個“鍵”只能對應一個“值”。
Java集合中只能保存引用數據類型,也就是保存的是對象的地址,而非對象本身。集合中元素相當于引用類型的變量。
JDK所提供的容器API全部位于java.util包中。Java集合主要包括三種類型:Set(集),List(列表),Map(映射)。
Java集合類框圖:
Collection和Iterator接口
在Collection接口中聲明了適用于Java集合(只包括Set和List)的通用方法。因此Set和List對象可以調用以上方法,Map對象不可以。
Iterator接口隱藏了底層集合的數據結構,向客戶程序提供了遍歷各種數據集合的統一接口。
如果集合中的元素沒有排序,Iterator遍歷集合中元素的順序是任意的,并不一定與集合中加入元素的順序是一致的。
Collection接口中的方法:
booleanadd(Eo) | 確保此 collection 包含指定的元素(可選操作) |
void clear() | 移除此 collection 中的所有元素(可選操作) |
booleancontains(Objecto) | 如果此 collection 包含指定的元素,則返回 true |
booleanisEmpty() | 如果此 collection 不包含元素,則返回 true |
Iterator<E>iterator() | 返回在此 collection 的元素上進行迭代的迭代器 |
booleanremove(Objecto) | 從此 collection 中移除指定元素的單個實例,如果存在的話(可選操作) |
int size() | 返回此 collection 中的元素數 |
Object[]toArray() | 返回包含此 collection 中所有元素的數組 |
Collection方法舉例:
public class javatest { public static void main(String args[]) { Collection c = new ArrayList(); c.add("Hello World!"); //添加String類型對象 c.add(new Integer(100)); //添加Integer類型對象 c.add(new Float(2323.45f)); //添加Float類型對象 System.out.PRintln(c.size()); System.out.println(c); }}List接口以及實現類
List是Collection的子接口,實現List接口的容器中存放的對象是有順序的,而且可以重復。List容器中存放的對象都有一個整數型的序號,記錄該對象在容器中的位置,可以根據序號來訪問容器中的元素。
JDK提供實現List接口的類有ArrayList、LinkedList等。相關方法如下:
Object get(int index)Object set(int index,Object obj)void add(int index,Object obj)Object remove(int index)int indexOf(Object obj)int lastIndexOf(Object obj)
List接口舉例:
public class javatest { public static void main(String args[]) { List li=new ArrayList(); for(int i=0;i<10;i++) li.add("a"+i); System.out.println(li); li.add(3,"a20"); System.out.println(li); li.set(4,"a30"); System.out.println(li); System.out.println((String)li.get(2)); li.remove(0); System.out.println(li); }}
運行結果如下:
[a0, a1, a2, a3, a4, a5, a6, a7, a8, a9][a0, a1, a2, a20, a3, a4, a5, a6, a7, a8, a9][a0, a1, a2, a20, a30, a4, a5, a6, a7, a8, a9]a2[a1, a2, a20, a30, a4, a5, a6, a7, a8, a9]
List接口的實現類-ArrayList
java.util.ArrayList實現了List接口,用于描述長度可變的數組列表(底層采用數組實現)。ArrayList允許元素取值為null,提供了一些新增的方法來操作列表的容量的大小。
public ArrayList()public ArrayList(int initialCapacity)public void ensureCapacity(int minCapacity)public void trimToSize()
ArrayList舉例:
ArrayList list=new ArrayList(6);list.add("codingwu");list.add(new Integer(10));list.add(new Double(10.5)); System.out.println(list.size());Object item[]=list.toArray();for(int i=0;i<item.length;i++) System.out.println(item[i]);list.trimToSize();
List接口的實現類-Vector
java.util.Vector實現了List接口,用于描述長度可變的數組向量(底層采用數組實現)。
與ArrayList的區別:Vector是線程安全的(同步),用在多線程環境中,運行效率慢。ArrayList不是線程安全的,用在單線程環境中。
Vector類的新增方法:
public Vector()public Object elementAt(int index)public void removeElement(int index)public void insertElement(Object obj,int index)public boolean removeElement(Object obj)public void removeAllElements()public Object toArray()Map接口以及實現類
以該接口為根的集合類,用于存儲“關鍵字”(key)和“值”(value)的元素對,其中每個關鍵字映射到一個值,當需要通過關鍵字實現對值的快速存取時使用
聲明的抽象方法主要有:
查詢方法、修改方法
兩個主要實現類:
HashTable、HashMap
查詢方法
int size() —— 返回Map中的元素個數
boolean isEmpty() —— 返回Map中是否包含元素,如不包括任何元素,則返回true
boolean containsKey(Object key) —— 判斷給定的參數是否是Map中的一個關鍵字(key)
boolean containsValue(Object val) —— 判斷給定的參數是否是Map中的一個值(value)
Object get(Object key) —— 返回Map中與給定關鍵字相關聯的值(value)
Collection values() —— 返回包含Map中所有值(value)的Collection對象
Set keySet() ——返回包含Map中所有關鍵字(key)的Set對象
Set entrySet() —— 返回包含Map中所有項的Set對象
修改方法
Object put(Object key, Object val) —— 將給定的關鍵字(key)/值(value)對加入到Map對象中。其中關鍵字(key)必須唯一,否則,新加入的值會取代Map對象中已有的值
void putAll(Map m) —— 將給定的參數Map中的所有項加入到接收者Map對象中
Object remove(Object key) —— 將關鍵字為給定參數的項從Map對象中刪除
void clear() —— 從Map對象中刪除所有的項
哈希表
也稱為散列表,是用來存儲群體對象的集合類結構,其兩個常用的類是HashTable及HashMap
哈希表存儲對象的方式與前面所講的數組,Vector及ArrayList不同。數組、Vector及ArrayList中對象的存儲位置是隨機的,即對象本身與其存儲位置之間沒有必然的聯系。因此查找一個對象時,只能以某種順序(如順序查找,二分查找)與各個元素進行比較,如果數組或向量中的元素數量很龐大時,查找的效率必然降低
哈希表中,對象的存儲位置和對象的關鍵屬性k之間有一個特定的對應關系f,我們稱之為哈希(Hash)函數。它使每個對象與一個唯一的存儲位置相對應。因而在查找時,只要根據待查對象的關鍵屬性k,計算f(k)的值即可知其存儲位置
哈希表相關的一些主要概念:
容量(capacity)—— 哈希表的容量不是固定的,隨對象的加入,其容量可以自動擴充
關鍵字/鍵(key)—— 每個存儲的對象都需要有一個關鍵字key,key可以是對象本身,也可以是對象的一部分(如對象的某一個屬性)
哈希碼(hash code)—— 要將對象存儲到HashTable,就需要將其關鍵字key映射到一個整型數據,稱為key的哈希碼(hash code)
哈希函數(hash function)——返回對象的哈希碼
項(item)—— 哈希表中的每一項都有兩個域:關鍵字域key及值域value(即存儲的對象)。key及value都可以是任意的Object類型的對象,但不能為空(null),HashTable中的所有關鍵字都是唯一的
裝填因子(load factor)—— (表中填入的項數)/(表的容量)
構造方法:Hashtable( ); // 初始容量為101,最大裝填因子為0.75Hashtable(int capacity);Hashtable(int capacity, float maxLoadFactor);
Object put(Object key, Object value) —— 值value以key為其關鍵字加入到哈希表中,如果此關鍵字在表中不存在,則返回null,否則表中存儲的value
Hashtable aPhoneBook = new Hashtable();aPhoneBook.put("Zhang Lei", "010-84256712");aPhoneBook.put("Zhu Yongqin", "010-82957788");aPhoneBook.put("Liu Na", "010-80791234");System.out.println(aPhoneBook); // 顯示{ Liu Na=010-80791234, Zhu Yongqin=010-82957788, Zhang Lei=010-84256712 }View Code
Object get(Object key) —— 返回關鍵字為key的值value,如果不存在,則返回null。如
Hashtable aPhoneBook = new Hashtable();aPhoneBook.put("Zhang Lei", "010-84256712");aPhoneBook.put("Zhu Yongqin", "010-82957788");aPhoneBook.get("Zhang Lei"); // 返回"010-84256712"aPhoneBook.get("Zhu Yongqin"); // 返回"010-82957788"aPhoneBook.get("Liu Ling"); // 返回nullView Code
Object remove(Object key) —— 將鍵/值對從表中去除,并返回從表中去除的值,如果不存在,則返回null。如
Hashtable aPhoneBook = new Hashtable();aPhoneBook.put("Zhu Yongqin", "010-82957788");aPhoneBook.put("Liu Na", "010-80791234");aPhoneBook.remove("Zhu Yongqin");aPhoneBook.remove("010-80791234"); // 不出錯,但返回nullSystem.out.println(aPhoneBook); // 顯示{ Liu Na=010-80791234}View Code
boolean isEmpty() —— 判斷哈希表是否為空boolean containsKey(Object key) —— 判斷給定的關鍵字是否在哈希表中boolean contains(Object value) —— 判斷給定的值是否在哈希表中boolean containsValue(Object value) —— 判斷給定的值是否在哈希表中void clear() —— 將哈希表清空Enumeration elements() —— 返回包含值的Enumeration對象Enumeration keys() —— 返回包含關鍵字的Enumeration對象
HashMap類與HashTable類很相似,只是HashTable類不允許有空的關鍵字,而HashMap類允許
Set接口以及實現類Set是最簡單的集合,集合中的對象不按照特定的方式排序,并且沒有重復的對象。Set接口主要有兩個實現類:HashSet和TreeSet
Set集合里多個對象之間沒有明顯的順序,基本與Collection方法相同。只是行為不同(Set不允許包含重復元素)。Set集合不允許重復元素,是因為Set判斷兩個對象相同不是使用==運算符,而是根據equals方法。即兩個對象用equals方法比較返回true
public class TestSet { public static void main(String[] args) { Set<String> books = new HashSet<String>(); //添加一個字符串對象 books.add(new String("Struts2權威指南")); //再次添加一個字符串對象, //因為兩個字符串對象通過equals方法比較相等,所以添加失敗,返回false boolean result = books.add(new String("Struts2權威指南")); System.out.println(result); //下面輸出看到集合只有一個元素 System.out.println(books); }}
程序運行結果:
false[Struts2權威指南]
說明:程序中,book集合兩次添加的字符串對象明顯不是一個對象(程序通過new關鍵字來創建字符串對象),當使用==運算符判斷返回false,使用equals方法比較返回true,所以不能添加到Set集合中,最后只能輸出一個元素。Set接口中的知識,同時也適用于HashSet、TreeSet和EnumSet三個實現類。
HashSet類
HashSet按Hash算法來存儲集合的元素,因此具有很好的存取和查找性能。
HashSet的特點:
(1)HashSet不是同步的,多個線程訪問是需要通過代碼保證同步
(2)集合元素值可以使null。
HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,并且兩個對象的hashCode()方法返回值也相等。
//類A的equals方法總是返回true,但沒有重寫其hashCode()方法 class A { public boolean equals(Object obj) { return true; } } //類B的hashCode()方法總是返回1,但沒有重寫其equals()方法 class B { public int hashCode() { return 1; } } //類C的hashCode()方法總是返回2,但沒有重寫其equals()方法 class C { public int hashCode() { return 2; } public boolean equals(Object obj) { return true; } } public class TestHashSet { public static void main(String[] args) { HashSet<Object> books = new HashSet<Object>(); //分別向books集合中添加2個A對象,2個B對象,2個C對象 books.add(new A()); books.add(new A()); books.add(new B()); books.add(new B()); books.add(new C()); books.add(new C()); System.out.println(books); } }
程序運行結果:
[B@1,B@1,C@2,A@b5dac4,A@9945ce]
TreeSet類
TreeSet是SortedSet接口的唯一實現,TreeSet可以確保集合元素處于排序狀態(元素是有序的)。
TreeSet提供的幾個額外方法:
Comparatorcomparttor():返回當前Set使用的Compara投入,或者返回null,表示以自然方式排序。
Objectfirst():返回集合中的第一個元素。
Objectlast():返回集合中的最后一個元素。
Objiectlower(Objecte):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,參考元素可以不是TreeSet的元素)。
Objecthigher(Objecte):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素,參考元素可以不需要TreeSet的元素)。
SortedSetsubSet(fromElement,toElement):返回此Set的子集,范圍從fromElement(包含大于等于)到toElement(不包含小于)。
SortedSetheadSet(toElement):返回此Set的子集,由小于toElement的元素組成。
SortedSettailSet(fromElement):返回此Set的子集,由大于或等于fromElement的元素組成。
public class TestTreeSetCommon { public static void main(String[] args) { TreeSet<Integer> nums = new TreeSet<Integer>(); //向TreeSet中添加四個Integer對象 nums.add(5); nums.add(2); nums.add(10); nums.add(-9); //輸出集合元素,看到集合元素已經處于排序狀態 System.out.println(nums); //輸出集合里的第一個元素 System.out.println(nums.first()); //輸出集合里的最后一個元素 System.out.println(nums.last()); //返回小于4的子集,不包含4 System.out.println(nums.headSet(4)); //返回大于5的子集,如果Set中包含5,子集中還包含5 System.out.println(nums.tailSet(5)); //返回大于等于-3,小于4的子集。 System.out.println(nums.subSet(-3 , 4)); } }
說明:由運行結果可以看出,TreeSet并不是根據元素的插入順序進行排序,而是根據元素實際值來進行排序。TreeSet采用紅黑樹的數據結構對元素進行排序,具體排序內容會在后續文章中說明。
參考資料http://www.49028c.com/zhxxcq/archive/2012/03/14/2395511.html
新聞熱點
疑難解答