java集合架構,java集合
java集合架構
1.java集合架構概述
java SE包含了由一組類和介面組成的java集合架構(java Collection Framework,簡稱JCF),其主要功能是用來將儲存的資料以某種結構組織,並以特定的方式來訪問這些資料,其目標是提供一個處理對象集合的通用架構,減少程式員處理不同對象集合時的編碼量。
集合類中的一些區別,除了它們是否支援重複元素操作外,還包括元素是否有順序,以及是否允許添加null元素。java集合架構中根據這三個區別,將對象的儲存方式分為三種類型,分別是:
1.Set(集):對象容器中的對象沒有順序,且不能重複。
2.List(列表):對象容器中的對象按照索引順序排序,而且可以有重複的對象。
3.Map(映射):對象容器中的元素包含一對“鍵對象-值對象”映射,其中鍵對象不能重複,值對象可以重複。
為支援對象的排序和遍曆訪問操作,java集合架構中又提供了幾個介面:
1.介面SortedSet為Set類型容器提供拍戲功能。
2.介面SortedMap為Map類型容器提供對鍵對象的排序。
3.介面Comparable和comparator用來實現集合中對象的排序。
2.Collection介面和Iterator介面
Collection介面中定義了Collection對象共有的一些基本方法
| 方法 |
描述 |
| int size() |
返回當前集合中包含的元素個數 |
| isEmpyt() |
判斷集合中是否含有元素 |
| boolean contains(Objact o) |
判斷集合中是否含有某一指定元素 |
| add(Objact o) |
向集合中添加某一個元素 |
| remove(Objact o) |
從集合中刪除某一元素 |
| Iterator iterator() |
返回一個遍曆器,用來訪問集合中的各個元素 |
Iterator介面是一種用於遍曆集合的介面。
Iterator介面中的方法
| 方法 |
描述 |
| hasNext() |
如果集合中還有更多元素,該方法返回true |
| next() |
返回集合中的下一個元素 |
| remove() |
刪除Iterator返回的最後一個元素 |
1.List介面
List介面繼承自Collection介面,它有如下特點:
1.List中的元素是有順序的。
2.List通常允許重複元素。
3.List的實作類別通常支援null元素。
4.可以通過索引訪問List對象容器中的元素。
List介面最常用的實作類別是ArrayList類和LinkedList類。
1).ArrayList
程式執行個體:
package lei; import java.util.ArrayList; import java.util.List; public class Test { public static void main(String[] args) { List list = new ArrayList<>(); list.add(1); list.add("zhangsan"); list.add(false); list.add('a'); list.add(0, "lisi"); list.add(1); list.remove(1); list.remove(2); list.set(0, "wangwu"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); } } }
Object類定義的equals()方法只有在傳遞給該方法的對象與調用該方法的對象是同一對象的時候,才會返回true。可以通過重寫equals()方法來把具有相同狀態的兩個對象被看做是同一對象。
2).LinkedList
| 方法 |
描述 |
| void addFirst |
在鏈表開頭添加一個對象 |
| void addLast |
在鏈表末尾添加一個對象 |
| getFirst() |
返回鏈表中的第一個元素 |
| getLast() |
返回鏈表中的最後一個元素 |
| removeFirst() |
刪除鏈表中的第一個元素 |
| removeLast() |
刪除鏈表中的最後一個元素 |
程式執行個體:
package lei; import java.util.LinkedList; import java.util.List; public class Test2 { public static void main(String[] args) { LinkedList l=new LinkedList<>(); l.add("zhangsan"); l.add("lisi"); l.addFirst(1); l.addLast(4); System.out.println(l.getFirst()); System.out.println(l.getLast()); l.removeFirst(); l.removeLast(); for (int i = 0; i < l.size(); i++) { System.out.println(l.get(i)); } } }
LinkedList與ArrayList的選擇
如果列表需要快速存取,但不經常進行元素的插入和刪除操作,那麼選擇ArrayList會好一些;如果需要對;列表進行頻繁的插入和刪除操作,那麼就應該選擇LinkedList。
2.set介面
set介面繼承自Collectiion介面,同時也繼承了Collection介面的全部方法。set介面有以下特點:
1.Set類型容器中不能包含重複元素。當加入一個元素到容器中時,要比較元素的內容是否存在重複的,所以加入Set類型對象容器的對象必須重寫equals()方法。
2.元素能能有順序,也可能沒有順序。
3.因為元素可能沒有順序,所以不能基於下標訪問Set中費元素。
實現Set介面最常用的是HashSet類和TreeSet類。
1).Hashset
Hashset類是基於雜湊演算法的Set介面實現,它主要有如下幾個特點:
1.當遍曆Hashset時,其中的元素是沒有順序的。
2.Hashset中不允許出現重複元素。這裡的重複元素是指有相同的雜湊碼,並且用equals()方法進行比較時,返回true的兩個對象。
3.允許包含null元素。
如果我們編寫的類重新定義了equals方法,那麼這個類也必須重新定義hashCode()方法,並且保證當兩個對象用equals方法比較結果為true時,這兩個對象的hashCode()方法的傳回值相等。
程式執行個體:
package lei; import java.util.HashSet; import java.util.Set; public class Test4 { public static void main(String[] args) { Set<String> set=new HashSet<String>(); set.add("zhangsan"); set.add("lisi"); for(String s:set){ System.out.println(s); } } }
2).TreeSet
TreeSet類不僅實作類別Set介面,還實現了SortedSet介面,從而保證集合中的對象按照一定的順序排序。當向TreeSet集合中添加一個對象時,會把它插入到有序的對象序列中,但是這種排序並不是按照對象添加的順序排序,而是按照一定的演算法來排序。
TreeSet使用元素的自然順序對元素進行排序,或者根據建立Set時提供的Comparator進行排序。TreeSet支援自然排序和自訂排序兩種排序方式。
3.Map介面
Map(映射)介面是java集合架構中不同於Collection介面的另一個重要介面,它對應的是在一種從鍵(Key)到值(Value)的對應關係的集合。Map類型的對象容器裡面儲存著兩組對象,一組對象用於儲存Map裡的Key,另外一組用於儲存Value。Key和Value可以升級任何參考型別的資料。Key不能重複,但是Value可以重複。
1).HashMap
HashMap是基於雜湊演算法的Map介面的實現。HashMap將它的鍵儲存在雜湊表中進行維護,鍵是唯一的。但是,HashMap並不保證鍵以特定順序排列,特別是不保證順序永久不變。
HashMap類實現了Map介面,從而具有Map介面的所有方法。
package day1228; import java.util.*; public class HashMapDemo { public static void main(String[] args) { // 建立一個新的HashMap Map<String, String> map = new HashMap<String, String>(); map.put("a1", "xiao"); map.put("b2", "xiaol"); map.put("a4", "xiaosd"); map.put("b1", "12a"); map.put("a3", "1"); // 使用iterator遍曆 鍵和值 System.out.println("之前的Map值是:"); Set<String> keys = map.keySet(); for (Iterator<String> i = keys.iterator(); i.hasNext();) { String key = i.next(); String value = map.get(key); System.out.println(key + "=" + value); } // 刪除鍵為"a4"的值 System.out.println("\n刪除索引值為a4的元素"); map.remove("a4"); // //使用iterator遍曆 鍵和值 System.out.println("\n之後的Map值:"); keys = map.keySet(); for (Iterator<String> i = keys.iterator(); i.hasNext();) { String key = i.next(); String value = map.get(key); System.out.println(key + "=" + value); } } }
2).TreeMap
TreeMap類是基於紅/黑樹狀結構演算法的Map介面實現。TreeMap中鍵的存放方式與TreeSet相似,它將鍵存放在樹中,鍵的順序按照自然順序或者自訂順序兩種方式排列。
程式執行個體:
package day1228; import java.util.*; public class TreeMapDemo { public static void main(String[] args) { //建立一個新的TreeMap Map<Integer, String> map = new TreeMap<Integer, String>(); map.put(1, "one"); map.put(2, "two"); map.put(3, "three"); map.put(4, "four"); map.put(5, "five"); //使用iterator顯示鍵和值 System.out.println("之前的map值為:"); Set<Integer> keys=map.keySet(); for(Object key:keys){ String value=map.get(key); System.out.println(key+"="+value); } //刪除鍵為3的值 System.out.println("\n刪除索引值為3的元素"); map.remove(3); //使用iterator顯示鍵和值 System.out.println("\n之後的值Map為:"); for(Object key:keys){ String value=map.get(key); System.out.println(key+"="+value); } } }