1. 程式人生 > >Set集合介紹 java

Set集合介紹 java

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集合中唯一可保證如何存就如何取的集合物件
  • 保證元素的唯一性