一:引言
集合:(set)是一個儲存和處理無重複元素的高效數據結構,映射表(map)類似於目錄,提供了使用鍵值對快速查詢和獲取值得功能
本章將討論Set Map 以及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接口,容量可以自動增大但是不可以自動減小並且可以儲存相同的元素