Set集合介紹 java
阿新 • • 發佈:2018-12-15
set的介紹
Set介面是繼承於Collection介面,而且方法全是繼承於Collection介面
一個不包含重複元素的 collection。更確切地講,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。
子類HashSet
首先要知道,hashset的方法 都是重寫set介面中的方法,自己是沒有自己的方法的。
//新增元素
HashSet<String> hs = new HashSet<>();
hs.add("a");// set中沒有a則返回true
//保證元素唯一
hs. add("a");// 返回false 並沒有再存
//HashSet的toString方法
System.out.println(hs); //HashSet 重寫了toString方法
for(String string:hs){
System.out.println(string);
}
//出現是無序的
如果我們要存自定義class
我們先要知道如果我們直接這樣寫,HashSet會呼叫hashCode方法,而我們自定義的類中,繼承的是Object類的hashCode方法,這個只是如果新建一個物件就生成一個hashcode碼,它們都不同,所以,不管內容是否一樣都返回碼不同。
如何解決?
Alt + Shift +s 生成 hashCode和equals方法
HashCode 存在的原因,為了儘量不重複的equals方法(提高效率)
public class Person {
private String name;
private int age;
public Person() {
super();
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
/*
* 為什麼是31?
* 1,31是一個質數,質數是能被1和自己本身整除的數
* 2,31這個數既不大也不小
* 3,31這個數好算,2的五次方-1,2向左移動5位
*/
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) //呼叫的物件和傳入的物件是同一個物件
return true; //直接返回true
if (obj == null) //傳入的物件為null
return false; //返回false
if (getClass() != obj.getClass()) //判斷兩個物件對應的位元組碼檔案是否是同一個位元組碼
return false; //如果不是直接返回false
Person other = (Person) obj; //向下轉型
if (age != other.age) //呼叫物件的年齡不等於傳入物件的年齡
return false; //返回false
if (name == null) { //呼叫物件的姓名為null
if (other.name != null) //傳入物件的姓名不為null
return false; //返回false
} else if (!name.equals(other.name)) //呼叫物件的姓名不等於傳入物件的姓名
return false; //返回false
return true; //返回true
}
public int compareTo(Person o) {
int length = this.name.length() - o.name.length(); //比較長度為主要條件
int num = length == 0 ? this.name.compareTo(o.name) : length; //比較內容為次要條件
return num == 0 ? this.age - o.age : num; //比較年齡為次要條件
}
}
LinkedHashSet 介紹
我們知道Linked是連結串列,而Hash 和雜湊碼有關,而set是實現的set介面的特性
具有可預知迭代順序的 Set 介面的雜湊表和連結列表實現。此實現與 HashSet 的不同之外在於,後者維護著一個運行於所有條目的雙重連結列表。此連結列表定義了迭代順序,即按照將元素插入到 set 中的順序(插入順序)進行迭代。注意,插入順序不 受在 set 中重新插入的 元素的影響。(如果在 s.contains(e) 返回 true 後立即呼叫 s.add(e),則元素 e 會被重新插入到 set s 中。)
LinkedHashSet程式碼例項
程式碼方法的用法和hashset的用法是一致的,上面是有例項的
LinkedHashSet特點
- 底層是連結串列實現的,是set集合中唯一可保證如何存就如何取的集合物件
- 保證元素的唯一性