1. 程式人生 > >Java的集合框架

Java的集合框架

集合 false strong 編碼 學生類 .class 其中 編譯器 臨時

Java集合框架綜述

1:集合框架(Collection Framework)

首先要知道 集合代表的是一組對象,和數組差不多 但是數組的長度是固定不變的,而集合是可以變換長度的,比如說:集合就是一根金箍棒,可長可短, 數組就像是一根普通的木棍,長度是固定的,不能變長或者變短。在Java的集合框架中定義了一套規範用來操作集合和具體實現細節,在這裏呢也可以把集合想象成一個數據庫 ,它有“增刪改查”四種操作 ,在本章呢會介紹集合框架的基本類和接口和一些的基本操作方法。

2:集合框架的兩大接口(Collection和Map)

1.Collection接口

Collection表示一組對象 ,這些對象也稱為collection元素,一個collection允許有重復的值,而另一些則不允許,一些collection是有序的,而有一些是無序的,在Java中沒有直接實現collection的 但是它提供了兩個子接口 這兩個子接口繼承了collection接口,那是哪兩個接口呢?

ヾ(??▽?)ノ 這裏介紹兩個collection接口的子接口 List 和 Set

1.1ArraysLIst類

ArrayList是List的一個實現類。每一個ArrayList實例都有一個容量,該容量是指用來存儲列表的數組大小,它總是等於或者小於列表的大小,隨著向ArrayList不斷添加元素,其容量也不斷的增大。這裏ArrayList它跟數組有很多相同點,到底有什麽相同點和不同點呢?如下技術分享

那知道ArrayList的概念 怎麽創建一個ArrayList集合呢? 定義語法如下:

1 //創建ArrayList集合 2 List list = new ArraysList(0);

在創建ArrayList集合的時候需要導入包:

//導入包
import
java.util.ArrayList; import java.util.List;

知道了創建ArrayList集合 那怎麽向集合裏添加元素呢 開始說過java集合框架中定義了一套規範來實現“增傷改查”那怎麽實現具體操作呢?下面介紹ArrayList集合的常用方法:

ArraysLIst 集合的常用方法
Arrays.asList(); 將數組裝換為集合 
add(Object value); 添加元素
add(int index,Object value)向指定位置插入元素 
get(int index);通過下標獲取元素 
set(intindex,Object value);修改指定位置的元素 
remove(
int index); 移除集合中指定位置的元素 remove(Object o);從集合中移除第一次出現的指定元素(如果存在) removeAll(collection<?>c);從列表中移除制動的collection 中包含的所有元素 Clear (); 移除集合中所有的元素
//遍歷ArrayList
foreach(Object item : list){
    //通過get()方法獲取元素
}

需要註意的是: 1.存儲的元素類型都是Object類型

        2.ArrayList集合中是可以添加重復的值,這個跟數組是一樣的

3. 它的初始容量為10的空列表

1.2HashSet類

HashSet是一個哈希集是set的一個重要實現類 它不保證順序恒久不變,也就是說是無序的,它允許使用NUll元素 但是只能有一個。而且他還不能有重復的值。set中 添加某個對象 無論添加多少次 最終只會保留一個該對象(的引用) 並且 保留的是第一次添加的那一個。既然是無序的所以它沒有索引,不能通過索引獲取元素。同樣跟ArrayList一樣它儲存的類型也是Object類型。

那怎麽創建一個Hashset呢? 代碼如下:

//創建HashSet(哈希集)
HashSet hashset= new HashSet();

在創建HashSet實例時需要導入包:

import java.util.HashSet;

以下是HashSet類的一些常用方法 如下圖:

add(Object value) 如果此 set中尚未包含指定元素,則添加指定元素 它的返回值是Boolean類型

clear() 移除所有元素

remove(Object o)如果指定元素存在於此 set 中,則將其移除 它的返回值是Boolean類型

size()獲取set中的元素的數量  返回值是int

isEmpty()判斷該set中是否包含任何元素 返回值是boolean類型

iterator() 返回對此 set 中元素進行叠代的叠代器。

大家看到Hashset並沒有直接獲取元素的方法,因為他是無序的 沒有索引,這裏我們用iterator()方法叠代獲取數據,那怎麽用呢?代碼如下:

import java.util.Iterator;//導包

itIterator i = hash.iterator(); while(i.hasNext()){ String str = (String)i.next();//需要強轉 }

這裏需要註意的是 HashSet裏儲存是Object類型 需要什麽數據類型 就強轉成什麽數據類型

上面的是通過Iterator()方法進行叠代 看起來比較麻煩 所以還有一種漸變的方法 通過foreach叠代器進行獲取數據 代碼如下:

foreach(Object item in hash){

      //獲取數據        

}

上面是Collection接口中的兩個子接口 List和Set 下面介紹另一個接口 Map

2.Map接口

Map提供了一種映射關系 其中的元素是以鍵值對(Key-value)的形式存儲的 能夠實現根據key快速查找Value

Map中的鍵值對以Entry類型的對象實例形式存在

健(key值)不可重復 value值可以
一個值可以跟很多的key進行映射關系 但一個健(key值)最多只能映射到一個值(value)

2.1 HashMap類

HashMap是map的一個重要實現,也是最常用的 基於哈希表實現 它的Entry對象是無序排序的,Key值和value值都可以為null 但是一個HashMap只能有一個kay值為null的映射(key值不可重復)

介紹了HashMap類的概念 那怎麽創建呢? 代碼如下:

//導入包
import java.util.HashMap;
//創建Hashmap
HashMap hash = new HashMap();

那HashMap類中有什麽常用方法呢?如下:

get(Object key); 指定健獲取所映射的值
Clear();從此映射中移除所有的映射關系
remove(Object key);從此映射中移除指定鍵的映射關系(如果存在)
size();  獲取此映射中的鍵-值映射的關系
put(K key,V value) 在此映射中關聯指定的值與指定鍵  如果該映射以前包含了一個該鍵的映射關系  從而達到修改的功能
entrySet 語法: public Set<Map.Entry<K,V>> enttryset()  返回map中所有的鍵值對
KeySet  語法: public Ste<k>keyset()  返回此映射中所包含的鍵的set視圖
getKey()  獲取鍵 
getValue() 獲取值

如何向HashMap中添加映射關系呢?如下:

//創建HashMap
HashMap hashmap =  new HashMap();
//通過HashMap類的Put()方法添加映射關系
hashmap.put(1, "張三");

這裏需要註意的是:1.向HashMap中添加映射關系時 需要指定一個Key(鍵)指定一個Value(值)從而達到映射關系,

2.同樣這裏的健(key)和值(value)都是object類型,

如何獲取HashMao中的數據呢?HashMap是鍵值對可以通過獲取鍵的方法獲取數據代碼如下:

//通過HashMap類的gat(object key)獲取值
System.out.println(hashmap.get(1));

那如何遍歷HashMap中的元素呢? 用foreach叠代器實現 代碼如下:

//遍歷HashMap的Key值獲取數據
for (Object item:hashmap.keySet()) {
    System.out.println(hashmap.get(item));
            
}

其他的方法就不一一測試了 ( ̄▽ ̄)~*

那現在有一個問題 比如如下代碼:

List list = new ArrayList();
list.add("qqyumidi");
list.add("corn");
list.add(100);
 for (int i = 0; i < list.size(); i++) {
       String name = (String) list.get(i); //1
       System.out.println("name:" + name);
}

定義了一個List類型的集合,先向其中加入了兩個字符串類型的值,隨後加入一個Integer類型的值。這是完全允許的,因為此時list默認的類型為Object類型。在之後的循環中,由於忘記了之前在list中也加入了Integer類型的值或其他編碼原因,很容易出現類似於//1中的錯誤。因為編譯階段正常,而運行時會出現“java.lang.ClassCastException”異常。因此,導致此類錯誤編碼過程中不易發現。

以上代碼中有兩個問題:

A.當我們將一個對象放入集合中,集合不會記住此對象的類型,當再次從集合中取出此對象時,改對象的編譯類型變成了Object類型,但其運行時類型任然為其本身類型。

B.因此,//1處取出集合元素時需要人為的強制類型轉化到具體的目標類型,且很容易出現“java.lang.ClassCastException”異常。

那有什麽辦法可以使集合能夠約束元素類型呢 並達到安逸不報錯呢?在Collection和Map中有出現了一個泛型集合。

3.什麽是泛型?

泛型也可以理解為“參數化類型”,類型的參數化,就是可以把類型像方法的參數那樣傳遞。這一點意義非凡。

那它有什麽作用呢? :泛型使編譯器可以在編譯期間對類型進行檢查以提高類型安全,減少運行時由於對象類型不匹配引發的異常。

怎麽定義個泛型集合呢?把上面的代碼修改如下:

List<String> list = new ArraysList<String>();//定義泛型的語法 

list.add("aaa");

list.add("bbb");

list.add(1111);//1

foreach(String item : list){

   System.out.println(item);    

}

根據上面的代碼 得到 定義泛型集合的語法:

List<E> list  = new ArraysList<E>();
在List<>尖括號裏是要對集合數據類型的約束
<E>中的E表示類型形參,可以接收具體的類型實參
上面的代碼集合類型是String類型 那麽代碼“1”我們添加一個int類型的數據 這樣編譯器是會報錯的,因為在定義泛型的時候 限制的是String類型 所以只能添加String類型的數據,
所以我們總結: 當泛型進行了數據類型約束的時候 不能添加其他的數據類型,否則編譯器會報錯。
那麽HashSet也可以定義泛型,對元素的數據類型進行約束,那怎麽創建HashSet泛型呢?語法如下:
//創建HashSet泛型
HashSet<E> hashSet = new HashSet<E>();

同樣是對HashSet中的元素進行數據類型約束 用法如上,具體方法 請往上看HashSet集合的方法。

需要註意的是:

1.泛型集合中 不能添加泛型規定的類型及其子類型以外的對象 否則會報錯
2.泛型集合中的限定類型 不能使用基本數據類型
3. 可以通過使用包裝類限定允許存入的基本數據類型

以上是Collection家族的集合和泛型,那麽Map家族有泛型嗎? 答案是肯定的

HashMap如何定義泛型呢 我們用代碼實現一下 代碼如下:

//定義HashMap泛型
HashMap<K, V> Hashmap = new HashMap<K, V>();

在HashMap<K,V>

K代表的是Key(鍵)的數據類型,

V代表的值(value)的數據類型,

也就是說 K鍵的數據類型必須是規定的數據類型不能是其他的數據類型,值(value)也是一樣。

以上是對泛型的介紹,這裏在介紹一下Map中的contains方法:

contains方法 某個序列是否包含某個對象 如果包含則返回true 如果不包含則返回faslse

HashMap中:

ContainsKey(object key); 獲取此映射是否包含對於指定建的映射關系
ContainsValue(object values); 獲取此映射是否在此映射中存在的值

具體怎麽使用呢?請看代碼:

Student類

public class Student {
    //學號
    private String id;
    
    //姓名
    private String name;
    
    
    public String getId() {
        return id;
    }


    public void setId(String id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }

    public Student(String id,String name){
        
        this.id=id;
        this.name=name;
        
    }
    

}

test類

import java.util.HashMap;
/**
 * ClassName: TestContains 
 * @Description: TODO測試 Map接口的HashMap類的Contains方法
*/
public class TestContains {
    
    public static void main(String[] args) {
        
        //創建HashMap泛型   鍵的類型約束是String類型 值的類型約束是學生類(Student)
        HashMap<String, Student> hashmap  = new HashMap<String, Student>();
        //創建一個學生 張三
        Student zs = new Student("A1000", "張三");
        //向泛型中添加元素
        hashmap.put("1",zs);
        //檢查是否存在鍵Key 1
        boolean yesno = hashmap.containsKey("1");
        //輸出結果
        System.out.println("Does it contain key1:"+yesno);
        //檢查是否包含值 Value “張三”這個學生
        boolean yesno1 = hashmap.containsValue(zs);
        //輸出結果
        System.out.println("Does it contain values‘張三’:"+yesno1);
        
    }
}

這裏我的HashMap中key的約束數據類型是String (這裏大家註意下 泛型類型約束不能放基本數據類型 可以放數據類型的類 )value的類型約束是Student類的實例,也是就是說我定義的是學生類 裏面只能放一個學生 要是放一個老師就不行。

言歸正傳 這裏我使用HashMap中的Contains方法來判斷泛型中是否包含某個鍵 或者包含某個對象,它的返回值類型就是Boolean類型,true或false;

接下來帶大家認識兩個接口和一個工具類:

1.Collections(工具類)

Collections工具類是java集合框架中 用來操作集合對象的工具類,這裏我們只介紹一個方法sort();

在使用之前需要導入工具類的包 代碼如下:

//導入包
import java.util.Collections;

sort()方法呢主要是排序 語法如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class TetsCollectionsSort {
    public static void main(String[] args) {
        
        //創建ArrayList泛型
        List<String> list = new ArrayList<String>();
        //向集合裏添加數據
        list.add("aasd");
        list.add("csfgsfd");
        list.add("zasd");
        list.add("gghg");
        //輸出排序前
        System.out.println("排序前");
        for (String item : list) {
            System.out.println(item);
        }
        //進行排序
        Collections.sort(list);
        //排序後
        System.out.println("排序後");
        for (String item : list) {
            
            System.out.println(item);
            
        }
    }
}
這裏發現這些字符串的順序發生了變化 那麽是怎麽進行排序的呢?
答:
在排序String字符串的時候是比較首字母排序 如果首字母一樣則比較第二個字符 如此往下,如果字符串的開頭是數字,則比較數字的大小,數字在前,字母在後,
上面是java集合框架的Collections工具類的sort()方法的介紹,下面介紹一個接口
2.Comparable接口
前面介紹了Collections.sort()方法   而要實現序列的排序就要實現comparable接口下面就介紹Comparable接口
實現該接口表示,這個類的實例可以進行自然排序,
定義了默認的比較規則
其實現類需要compareTo()方法
compareTo
()方法返回整數表示大 負數表示小 0表示相等
一個生活的小案例 在學校裏做廣播體操時 一般學生的排列都是按照身高去排列,從矮到高排列 因此學生是可以進行比較的,那麽我們想兩個事物要進行比較,是不是要找到可以比較的方式呢?在我們比較連個事物的時候
會有一個默認的比較規則,稱為自然排序,比如在學生排列的時候這個身高就是可以比較的特性,也是默認的比較規則,那麽自然順序就是身高之間的差異。
那麽如何用代碼實現呢? 代碼如下:
Student類
public class Student{
    //學號
    private String id;
    
    //姓名
    private String name;
    
    
    public String getId() {
        return id;
    }


    public void setId(String id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }

    public Student(String id,String name){
        
        this.id=id;
        this.name=name;
        
    }
}
test類
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

/* ClassName: TestContains 
 * @Description: TODO測試comparable接口比較對象
 */
public class TestContains {

    public static void main(String[] args) {

        // 創建HashMap泛型 鍵的類型約束是String類型 值的類型約束是學生類(Student)
        List<Student> list = new ArrayList<Student>();
        // 創建兩個學生 張三 李四
        Student zs = new Student("Z1000", "張三");
        Student ls = new Student("V1000", "李四");
        // 向集合中添加元素
        list.add(zs);
        list.add(ls);
        // 排列前
        for (Student item : list) {
            System.out.println("學號是:" + item.getId() + "姓名:" + item.getName());
        }
        // 排列
        Collections.sort(list);//1
        // 排序後
        for (Student item : list) {
            System.out.println("學號是:" + item.getId() + "姓名:" + item.getName());
        }

    }
}

這裏呢我們的代碼1處會報錯的 是因為咱們的Student這個類沒有實現comparable接口 所以我們要對Student這個類進行改造 修改後的代碼如下:

public class Student  implements Comparable<Student>{
    //學號
    private String id;
    
    //姓名
    private String name;
    
    
    public String getId() {
        return id;
    }


    public void setId(String id) {
        this.id = id;
    }


    public String getName() {
        return name;
    }


    public void setName(String name) {
        this.name = name;
    }

    public Student(String id,String name){
        
        this.id=id;
        this.name=name;
        
    }

  //重寫comparable的comparato()方法
    @Override
    public int compareTo(Student o) {
        
        return this.id.compareTo(o.id);
    }
    

}

這裏讓Student這個類實現Comparable接口 因為接口都是抽象的 所以這裏必須重寫compareTo()方法

這個方法實現 讓學生的Id進行一個比較排列 返回整形 那麽Test類輸出如下:

排序前
學號是:Z1000姓名:張三
學號是:V1000姓名:李四
排序後
學號是:V1000姓名:李四
學號是:Z1000姓名:張三

這裏的排序方法向上面介Collections.sort()方法一樣

3.Comparator接口 ---- 比較工具
用於定義臨時比較規則,而不是默認比較規則
其實現類需要實現Compare()方法
強行對某個對象 collection 進行整體排序 的比較函數。可以將 Comparator 傳遞給 sort 方法
compare()方法返回整數表示大 負數表示小 0表示相等

具體實現comparator接口的代碼如下:
StudentComparator類
import java.util.Comparator;

public class StudentComparator implements Comparator<Student>{

  //要實現Comparator接口必須要重寫Compare()方法 @Override
public int compare(Student o1, Student o2) { //按照學生的姓名進行排列 return o1.getName().compareTo(o2.getName()); } }
Test類修改如下:
import java.util.ArrayList;
import java.util.List;
import java.util.Collections;

/* ClassName: TestContains 
 * @Description: TODO測試comparable接口比較對象和comparator接口
 */
public class TestContains {

    public static void main(String[] args) {

        // 創建HashMap泛型 鍵的類型約束是String類型 值的類型約束是學生類(Student)
        List<Student> list = new ArrayList<Student>();
        // 創建兩個學生 張三 李四
        Student zs = new Student("Z1000", "張三");
        Student ls = new Student("V1000", "李四");
        // 向集合中添加元素
        list.add(zs);
        list.add(ls);
        // 排列前
        System.out.println("排序前");
        for (Student item : list) {
            System.out.println("學號是:" + item.getId() + "姓名:" + item.getName());
        }
        // 排列
        Collections.sort(list);
        // 排序後
        System.out.println("排序後");
        for (Student item : list) {
            System.out.println("學號是:" + item.getId() + "姓名:" + item.getName());
        }
        //按照姓名排序如下
        System.out.println("按照姓名排序是:");
        Collections.sort(list,new StudentComparator());
        for (Student item : list) {
            System.out.println("學號是:" + item.getId() + "姓名:" + item.getName());
        }
        
    }
}

這裏Collections.sort();時需要傳遞一個集合 和一個實現類的對象,

本章主要介紹Java集合框架的主要成員有:Collection接口 Map接口 Collections工具類 Comparable接口 Comparator接口

本章內容到此結束!!!

 




Java的集合框架