解析:HashSet集合儲存元素的特性——無序性、不重複性
技術標籤:點滴成長
一、開篇準備
首先要知道的是,在Java中,要比較兩個物件是否為同一個物件時,一般都是通過equals()或者hashCode()方法;
1.equals()方法比較物件時,是比較的兩個物件的記憶體地址;
public boolean equals(Object obj) {
return (this == obj);
}
2.hashCode()方法比較物件時,是比較的兩個物件在雜湊表中的索引位置,及雜湊碼;
3.equals()與hashCode()判斷物件時的關係:
(1)當equals()判斷兩個物件相同時,那麼兩個物件的hashCode()一定也相同;
(2)當hashCode()判斷兩個物件不相同時,那麼equals()判斷兩個物件也一定不相同;
(3)當hashCode()判斷兩個物件相同時,equals()判斷兩個物件不一定相同(即:不相同的兩個物件的hashCode也有可能相同);
二、HashSet特性解析
直接上程式碼:
1.TestObject類:
public class TestObject { private String str; private int num; public TestObject() { } public TestObject(String str, int num) { this.str = str; this.num = num; } }
2.TestPro類:
import java.util.*; public class TestPro { public static void main(String args[]) { TestObject testObject1 = new TestObject("哈哈", 1); TestObject testObject2 = new TestObject("嗯嗯", 2); TestObject testObject3 = new TestObject("哦哦", 3); TestObject testObject4 = new TestObject("哈哈", 1); HashSet<TestObject> hashSet = new HashSet<>(); hashSet.add(testObject1); hashSet.add(testObject2); hashSet.add(testObject3); hashSet.add(testObject4); hashSet.add(testObject1); System.out.println("雜湊碼:\n" + testObject1.hashCode() + "\t" + testObject2.hashCode() + "\t" + testObject3.hashCode() + "\t" +testObject4.hashCode() + "\n"); System.out.println("測試輸出:" + hashSet.toString()); } }
3.執行結果:
一、開篇準備
首先要知道的是,在Java中,要比較兩個物件是否為同一個物件時,一般都是通過equals()或者hashCode()方法;
1.equals()方法比較物件時,是比較的兩個物件的記憶體地址;
public boolean equals(Object obj) {
return (this == obj);
}
2.hashCode()方法比較物件時,是比較的兩個物件在雜湊表中的索引位置,及雜湊碼;
3.equals()與hashCode()判斷物件時的關係:
(1)當equals()判斷兩個物件相同時,那麼兩個物件的hashCode()一定也相同;
(2)當hashCode()判斷兩個物件不相同時,那麼equals()判斷兩個物件也一定不相同;
(3)當hashCode()判斷兩個物件相同時,equals()判斷兩個物件不一定相同(即:不相同的兩個物件的hashCode也有可能相同);
二、HashSet特性解析
直接上程式碼:
1.TestObject類:
public class TestObject {
private String str;
private int num;
public TestObject() {
}
public TestObject(String str, int num) {
this.str = str;
this.num = num;
}
}
2.TestPro類:
import java.util.*;
public class TestPro {
public static void main(String args[]) {
TestObject testObject1 = new TestObject("哈哈", 1);
TestObject testObject2 = new TestObject("嗯嗯", 2);
TestObject testObject3 = new TestObject("哦哦", 3);
TestObject testObject4 = new TestObject("哈哈", 1);
HashSet<TestObject> hashSet = new HashSet<>();
hashSet.add(testObject1);
hashSet.add(testObject2);
hashSet.add(testObject3);
hashSet.add(testObject4);
hashSet.add(testObject1);
System.out.println("雜湊碼:\n" + testObject1.hashCode() + "\t" + testObject2.hashCode() + "\t" + testObject3.hashCode() + "\t" +testObject4.hashCode() + "\n");
System.out.println("測試輸出:" + hashSet.toString());
}
}
3.執行結果:
一、開篇準備
首先要知道的是,在Java中,要比較兩個物件是否為同一個物件時,一般都是通過equals()或者hashCode()方法;
1.equals()方法比較物件時,是比較的兩個物件的記憶體地址;
public boolean equals(Object obj) {
return (this == obj);
}
2.hashCode()方法比較物件時,是比較的兩個物件在雜湊表中的索引位置,及雜湊碼;
3.equals()與hashCode()判斷物件時的關係:
(1)當equals()判斷兩個物件相同時,那麼兩個物件的hashCode()一定也相同;
(2)當hashCode()判斷兩個物件不相同時,那麼equals()判斷兩個物件也一定不相同;
(3)當hashCode()判斷兩個物件相同時,equals()判斷兩個物件不一定相同(即:不相同的兩個物件的hashCode也有可能相同);
二、HashSet特性解析
直接上程式碼:
1.TestObject類:
public class TestObject {
private String str;
private int num;
public TestObject() {
}
public TestObject(String str, int num) {
this.str = str;
this.num = num;
}
@Override
public String toString() {
return "TestObject[" + "str=" + str + ", num=" + num + "]";
}
}
2.TestPro類:
import java.util.*;
public class TestPro {
public static void main(String args[]) {
TestObject testObject1 = new TestObject("哈哈", 1);
TestObject testObject2 = new TestObject("嗯嗯", 2);
TestObject testObject3 = new TestObject("哦哦", 3);
TestObject testObject4 = new TestObject("哈哈", 1);
HashSet<TestObject> hashSet = new HashSet<>();
hashSet.add(testObject1);
hashSet.add(testObject2);
hashSet.add(testObject3);
hashSet.add(testObject4);
hashSet.add(testObject1);
System.out.println("雜湊碼:\n" + testObject1.hashCode() + "\t" + testObject2.hashCode() + "\t" + testObject3.hashCode() + "\t" +testObject4.hashCode() + "\n");
System.out.println("測試輸出:" + hashSet.toString());
}
}
3.執行結果:
由上述結果及程式碼可知,HashSet的無序性顯而易見;而不可重複性,是指的物件的hashCode相同時才認為是相同的元素(testObject1與testObject4物件的屬性值雖然相同,但是他們是兩個物件,因此他們的hashCode不相同,所以HashSet集合認為他們是兩個元素);
只要對TestObject類稍作修改,就可以實現我們預期的效果(testObject1與testObject4屬性相同時,只保留一個),即重寫equals()與hashCode()即可;
上程式碼:
public class TestObject {
private String str;
private int num;
public TestObject() {
}
public TestObject(String str, int num) {
this.str = str;
this.num = num;
}
@Override
public boolean equals(Object obj) {
TestObject testObj = (TestObject) obj;
return ((testObj.num == this.num) && testObj.str.equals(this.str));
}
@Override
public int hashCode() {
return num * this.str.hashCode();
}
@Override
public String toString() {
return "TestObject[" + "str=" + str + ", num=" + num + "]";
}
}
執行結果為:
從上述結果可以看出:我們在TestObject類中重寫equals()和hashCode()後,testObject1與testObject4的hashCode相同了,所以HashSet集合就任務testObject1與testObject4時同一個物件而保留其一了~