(二)java集合框架

一:引言

集合:(set)是一個儲存和處理無重複元素的高效數據結構,映射表(map)類似於目錄,提供了使用鍵值對快速查詢和獲取值得功能
本章將討論Set Map 以及List的用法

 collection包括set和list接口

二:set接口

set接口中包括三個具體類分別爲:散列類HashSet,樹形集TreeSet和鏈式散列集LinkedHashSet用來創建集合。Set接口拓展了Collection接口,其中Set實例中不包含重複元素    e1.equals(e2)!=true

2.1HashSet

Hashset默認情況下,初始容量爲16而負載係數爲0.75,若知道將創建的集合大小,則可以再構造方法中創建指定容量和負載係數。負載係數大小爲0.0~1
若創建完成,在增加容量前,負載係數會測量集合是否允許多滿。如果元素個數超過集合的容量與負載係數的大小,那麼集合的容量將會自動翻倍;(若容量爲16,負載係數爲0.5,那麼當集合尺寸達到8(16*0.5=8)時,容量將會自動翻倍到32)
負載係數過高會降低空間開銷,默認0.75是時間開銷和空間開銷的最佳權衡值(將在散列章節中更深入討論負載係數問題)

例:將字符串添加到集合中

Set <String> set = new HashSet<String>();
String s1 = "Hello";
String s2 = s1;
String s3 = "world";
set.add(s1);
set.add(s2);
Set.add(s3);
//取值方法用迭代器進行取值
Itreator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next()+" ");
}
//也可使用for each方法進行取值,如下:
for(String string:set){
System.out.prientln(set.toUpperCase()+" ");
}
/*
迭代器Itreator,創建一個迭代器,迭代器(iterator)是一種對象
它能夠用來遍歷標準模板庫容器中的部分或全部元素。
迭代器使開發人員能夠在類或結構中支持foreach迭代。
*/
//HashSet集合中,可使用add進行添加元素,或者addAll()方法,使用remove()進行刪除

~~~~~~~~~~~~~~~~~~~~~手動分隔線 ~~~~~~~~~~~~~~~~~~~~~~~~~ ~

2.2 LinkedHashSet

LinkedHashSet用一個鏈表實現拓展HashSet,支持對鏈表中的元素進行排序,HashSet 中的元素是無序的,LinkedHashSet可以根據元素插入的順序提取,同時LinkedHashSet同樣是集合,其中的元素是不能重複的,只是簡單的對插入的元素進行簡單的插入的順序的排序,若要強行加一個不同的順序,使用TreeSet更加高效

~~~~~~~~~~~~~~~~~~~~~~~~~~手動分隔線 ~~~~~~~~~~~~~~~~~~~ ~

2.3TreeSet

TreeSet繼承自SortSet抽象類,顯然,TreeSet 中的元素是有序的

3.1   創建一個TreeSet:
import java.util.TreeSet;
public class TreeSetmothod {
public static void main(String[] args) {
	TreeSet<String> ts = new TreeSet<String>();
	ts.add("關羽");
	ts.add("劉備");
	ts.add("張飛");
	ts.add("劉備");
	ts.add("李逵");
	ts.add("趙雲");
	for(String i:ts) {
		System.out.print(i+" ");
	}
	System.out.println("first:" + ts.first());
	//SortSet集合提供first和last方法返回集合中最大值和最小值
	System.out.println("last:" + ts.last());
	System.out.println("headSet:" + ts.headSet("張飛"));
	//SortSet方法提供headSet(x)和tailSet(x)方法分別返回小於x的元素
	//和大於等於x的元素
	System.out.println("tailSet:" + ts.tailSet("張飛"));
}
}

輸出結果爲:
輸出結果

TreeSet實現自定義排序

方法一:(創建關於自定義對象的HashSet集合並實現Comparable接口)
本例使用學生的成績作爲排序

//創建自定義的Student類
package ScoreMangement;
public class Student implements Comparable<Student>{
    private int score;
    private String name;
    private String sno;
    public Student() {
    }
    public Student(String sno,String name,int score ) {
        this.score = score;
        this.name = name;
        this.sno = sno;
    }

    public Student(String sno ,int score ) {
        this.score = score;
        this.sno = sno;
    }
    public String getSno() {
        return sno;
    }

    public void setSno(String sno) {
        this.sno = sno;
    }

    public void setScore(int score) {
        this.score = score;
    }
    public String getName() {
        return name;
    }

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

    public int getScore() {
        return score;
    }
    @Override
    public String toString() {
        return "學號:"+ this.getSno()+" 姓名"+this.getName()+" 成績:"+this.getScore();
    }
    @Override
    public int compareTo(Student o) {
        int num = this.score - o.score;
        int num2 = num == 0?this.sno.length() - o.sno.length(): num;
        int num3 = num2 == 0?this.name.length() - o.name.length():num2;
        return num3;
    }
}

創建實例對象1

package ScoreMangement;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo {
    public static void main(String[] args) {
        Set<Student> students = new TreeSet<>();
        students.add(new Student("201819244325", "吳用", 196));
        students.add(new Student("201819244326", "公孫勝", 128));
        students.add(new Student("201819244329", "花榮", 129));
        students.add(new Student("201819244330", "李逵", 100));
        students.add(new Student("201819244331", "魯智深", 163));
        students.add(new Student("201819244332", "林沖", 168));
        students.add(new Student("201819244333", "柴進", 166));
        students.add(new Student("201819244334", "朱仝", 145));
        students.add(new Student("201819244335", "楊志", 103));
        students.add(new Student("201819244336", "史進", 126));
        students.add(new Student("201819244337", "阮小五", 130));

        for (Student str : students) {
            System.out.println(str.getSno() + " " + str.getName() + " " + str.getScore());
        }
}

方法二:自定義排序類,實例方法繼承此類

//非完全代碼
//創建自定義的排序類
class MyComparator implements Comparator(String){
public int compare(String str1,String str2){
return str1.length() - str2.length();
}

//實例類實現自定義的排序類
}
public static void main(String [] args){
TreeSet <String> set = new TreeSet<String> (new MyComparator());
//set.add()添加元素
//指定方式,自定義數據類型以及方法必須是可比較的對象
    traverse(set);
}

~~~~~~~~~~~~~~~~~~~~~~~~手動分隔線 ~~~~~~~~~~~~~~~~~~~~~ ~

由於List和Set同時繼承了Collection接口,因此接下來討論LIst集合中的實現子類及其方法

三: List

序:List接口繼承自Collection接口,定義順序儲存元素的合集其中包括兩個具體的類ArrayList 和 LinkedList

3.1數組線性表ArrayList

ArrayList: 數組線性表,動態創建。若需要通過下標隨機訪問元素,而不會在線性表起始位置插入或刪除元素,那麼使用ArrayList更高效,同時ArrayList使用可變大小的數組實現List接口,容量可以自動增大但是不可以自動減小並且可以儲存相同的元素

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章