set介面 java.util.Set 介面和 java.util.List 介面一樣,同樣繼承自 Collection 介面,它與 Collection 介面中的方 法基本一致,但是set介面中元素無序,並且不重覆 分類 1.HashSet集合 2.LinkedHashSet集合 HashSet集 ...
set介面
java.util.Set 介面和 java.util.List 介面一樣,同樣繼承自 Collection 介面,它與 Collection 介面中的方 法基本一致,但是set介面中元素無序,並且不重覆
分類
1.HashSet集合
2.LinkedHashSet集合
HashSet集合:
java.util.HashSet 是 Set 介面的一個實現類,它所存儲的元素是不可重覆的,並且元素都是無序的(即存取順序 不一致)
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集合存儲數據的結構(哈希表)
哈希表是由數組+鏈表+紅黑樹(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 }