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對象共有的一些基本方法
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); } } }