1. 程式人生 > 其它 >解析:HashSet集合儲存元素的特性——無序性、不重複性

解析: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時同一個物件而保留其一了~