set接口java
java.util.Set 接口和 java.util.List 接口同樣,一樣繼承自 Collection 接口,它與 Collection 接口中的方 法基本一致,可是set接口中元素無序,而且不重複數組
分類ide
1.HashSet集合性能
2.LinkedHashSet集合this
HashSet集合:spa
java.util.HashSet 是 Set 接口的一個實現類,它所存儲的元素是不可重複的,而且元素都是無序的(即存取順序 不一致)code
1 package demosummary.set; 2
3 import java.util.HashSet; 4
5 public class HashSetTest01 { 6 public static void main(String[] args) { 7 //建立set集合
8 HashSet<String> set = new HashSet<>(); 9 //添加元素
10 set.add("德瑪"); 11 set.add("德邦"); 12 set.add("皇子"); 13 set.add("劍聖"); 14 set.add("德瑪"); 15 System.out.println(set);//[德邦, 皇子, 德瑪, 劍聖]//元素不容許重複,且無序 16 //遍歷集合
17 for (String s : set) { 18 System.out.println(s); 19 } 20 } 21 }
HashSet 是根據對象的哈希值來肯定元素在集合中的存儲位置,所以具備良好的存取和查找性能。保證元素惟一性 的方式依賴於: hashCode 與 equals 方法對象
HashSet集合存儲數據的結構(哈希表)blog
哈希表是由數組+鏈表+紅黑樹(JDK1.8增長了紅黑樹部分)實現的,以下圖所示繼承
HashSet存儲自定義類型元素
HashSet中存放自定義類型元素時,須要重寫對象中的hashCode和equals方法,創建本身的比較方式,才能保 證HashSet集合中的對象惟一
1 package demosummary.set; 2
3 import java.util.Objects; 4
5 public class SetPerson { 6 private String name; 7 private int age; 8
9 public SetPerson() { 10 } 11
12 public SetPerson(String name, int age) { 13 this.name = name; 14 this.age = age; 15 } 16
17 public String getName() { 18 return name; 19 } 20
21 public void setName(String name) { 22 this.name = name; 23 } 24
25 public int getAge() { 26 return age; 27 } 28
29 public void setAge(int age) { 30 this.age = age; 31 } 32
33 @Override 34 public boolean equals(Object o) { 35 if (this == o) return true; 36 if (o == null || getClass() != o.getClass()) return false; 37 SetPerson setPerson = (SetPerson) o; 38 return age == setPerson.age &&
39 Objects.equals(name, setPerson.name); 40 } 41
42 @Override 43 public int hashCode() { 44 return Objects.hash(name, age); 45 } 46
47 @Override 48 public String toString() { 49 return "SetPerson{" +
50 "name='" + name + '\'' +
51 ", age=" + age +
52 '}'; 53 } 54 }
1 package demosummary.set; 2
3 import java.util.HashSet; 4
5 public class SetPersonTest { 6 public static void main(String[] args) { 7 //建立set集合
8 HashSet<SetPerson> sp = new HashSet<>(); 9 //添加元素
10 SetPerson setPerson = new SetPerson("德瑪",18); 11 sp.add(setPerson); 12 sp.add(new SetPerson("德邦", 19)); 13 sp.add(new SetPerson("皇子", 20)); 14 sp.add(new SetPerson("劍聖", 19)); 15 //遍歷set集合
16 for (SetPerson person : sp) { 17 System.out.println(person); 18 } 19 /**
20 * 執行結果 21 * SetPerson{name='皇子', age=20} 22 * SetPerson{name='德瑪', age=18} 23 * SetPerson{name='德邦', age=19} 24 * SetPerson{name='劍聖', age=19} 25 */
26 } 27 }
LinkedHashSet
HashSet的一個子類 java.util.LinkedHashSet ,它是鏈表和哈希表組合的一個數據存儲結構,保證取出元素是有序的
1 package demosummary.set; 2
3 import java.util.Iterator; 4 import java.util.LinkedHashSet; 5 import java.util.LinkedList; 6
7 public class LinkedHashSetTest01 { 8 public static void main(String[] args) { 9 //建立LinkedList集合
10 LinkedHashSet<String> set = new LinkedHashSet<>(); 11 //添加元素
12 set.add("劍聖"); 13 set.add("德瑪"); 14 set.add("皇子"); 15 set.add("德邦"); 16 //迭代器輸出結果
17 Iterator<String> iterator = set.iterator(); 18 while (iterator.hasNext()) { 19 System.out.println(iterator.next()); 20 } 21 /**
22 * 輸出結果 23 * 劍聖 24 * 德瑪 25 * 皇子 26 * 德邦 27 */
28 } 29 }
可變參數
若是咱們定義一個方法須要接受多個參數,而且多個參數類型一致,咱們能夠對其簡化成以下格 式:
修飾符 返回值類型 方法名(參數類型... 形參名){ }
等價於
修飾符 返回值類型 方法名(參數類型[] 形參名){ }
1 package demosummary.set; 2
3 public class SetTest { 4 public static void main(String[] args) { 5 //定義一個數組
6 int[] arr = {1,5,8,66,88,345}; 7 //定義一個結果並賦值
8 int sum = getSum(arr);//調用方法並給sum賦值 9 //輸出結果
10 System.out.println(sum); 11 } 12
13 /**
14 * 完成數組 全部元素的求和 原始寫法 15 * public static int getSum(int[] arr){ 16 * int sum = 0; 17 * for(int a : arr){ 18 * sum += a; 19 * } 20 * return sum; 21 * } 22 */
23 //可變參數寫法
24 public static int getSum(int[] arr){ 25 //定義一個sum參數
26 int sum = 0; 27 //加強for
28 for (int i : arr) { 29 //得出結果
30 sum += i; 31 } 32 //返回結果
33 return sum; 34 } 35 }