1. 程式人生 > >java集合體系--Collecion的各種子介面、實現類(上)

java集合體系--Collecion的各種子介面、實現類(上)


Collection集合體系


Map體系

●Java集合大致分為Set、List、Queue、Map四種體系。

●最常用的集合:HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、TreeMap

●Iterator介面也是Java集合框架的成員,但它與Collection系列,Map系列的集合不一樣:Collection、Map系列集合主要用於盛裝其他物件,而Iterator則主要用於遍歷Collection集合中的元素,

Iterator物件也被稱為迭代器。

HashSet

當向HashSet集合中存入一個元素時,HashSet會呼叫該物件的hashCode()方法來得到該物件的hashCode值,然後根據hashCode值決定該物件在HashSet中的儲存位置。

HashSet集合判斷兩個元素相等的標準是兩個物件通過equals()方法比較相等,並且兩個物件的hashCode()方法返回值也相等。

具體的方法參見API文件,這裡就不展示了。

HashSet去重的原理:1.hashCode,2.equals是否相同

可以通過覆寫hashCode和equals方法改變其去重規則,進行自定義去重

TreeSet

與HashSet相比,TreeSet多了幾個額外的方法


因為TreeSet中的元素是有序的,所以增加了訪問第一個、前一個、後一個、最後一個元素的方法,並且提供了從三個TreeSet中擷取子TreeSet的方法。

TreeSet加入元素時,必須加入同類型的物件則會發生

ClassCastException異常,因為TreeSet會呼叫集合元素的compareTo()方法來比較元素之間的大小關係(自然排序)。

方法測試:

@Test
public void TreeSetTest(){
    TreeSet ts=new TreeSet();
    ts.add(2);
    ts.add(5);
    ts.add(-8);
    ts.add(10);
    System.out.println(ts);
    System.out.println(ts.first());//輸出-8
    System.out.println(ts.last());//輸出10
    System.out.println(ts.headSet(5));//返回小於5的子集,不包含5,輸出[-8,2]
    System.out.println(ts.tailSet(5));//返回大於5的子集,如果Set中有5,子集也包含5,輸出[5,10]
    System.out.println(ts.subSet(-8,5));//返回值包括前面不包括後面,輸出[-8, 2]
}

其他測試:

@Test
public void TreeSetAddObjTest(){
    TreeSet ts=new TreeSet();
    ts.add(5);
    ts.add("hello");
    System.out.println(ts);
}

測試結果:


如果加入的是實體物件,比如Student,則Student類必須實現Comparable介面,並重寫compareTo()方法,

(這也時TreeSet去重的原理!!!)

Student類有姓名、年齡、性別三個屬性,省略程式碼為get/set方法,如下:

public class Student implements Comparable{
@Override
public int compareTo(Object o) {
    Student s= (Student) o;
    return getAge()>s.getAge()?1:getAge()<s.getAge()?-1:0;
    }
}

標紅程式碼表示:可以根據需要改變排序規則,這裡是升序排列。

@Test
public void TreeSetAddObjTest(){
    TreeSet ts=new TreeSet();
    Student stu1=new Student("張三",23,"男");
    Student stu2=new Student("zone",21,"男");
    Student stu3=new Student("小鋂",22,"女");
    ts.add(stu1);
    ts.add(stu2);
    ts.add(stu3);
    System.out.println(ts);
    for(Object o:ts){
        Student stu= (Student) o;
        System.out.println(stu.getName()+"的年齡"+stu.getAge());
    }
}

測試結果:


原文出自:https://my.csdn.net/qq_37094660(如需轉載請註明出處)