Java中的Object類、Set接口(學習小結)

1.Object類

1.1 Object類概述

  • Object類是Java中所有類的基類。Java中所有的類都是直接或間接繼承Object類。
  • Object類的引用數據類型變量可以保存Java中任意數據類型空間的首地址。
  • Object類中規定了一些方法,可供子類使用。

(1).String toString();

  • 當前對象將以String類型描述。
  • 默認情況是當前類所屬包名.類名@十六進制內存地址
  • 如果對於數據類型展示有要求,可以重寫toString方法,在展示的方法中會默認執行toString方法。

(2)int hashCode();

  • 內存中當前對象的唯一索引值,默認情況下是當前對象所處空間首地址的十進制展示。

(3)boolean equals(Object obj);
比較方法,判斷兩個對象是否一致,Object類內默認情況下比較的方式是地址比較。
兩個對象地址一致,表示肯定是相同對象。如果我們期望修改equals比較規則,可以
在當前類內重寫
【注意】
Java中規定,如果兩個對象的equals比較方法結果爲true,要求hashCode值必須
一致
(4)線程有關方法

  • void wait();
  • void notify();
  • void notifyAll();

1.2 toString方法

展示字符串的方法,展示數據時,也可使用System.out.println();語句

1.3equals方法

  • 比較兩個對象是否一致,在Object類內默認方式是比較兩個對象的地址是否一致。
  • 但代碼中有時會存在一些情況,需要比較的是兩個對象中保存的內容是一致,此時使用Object類內繼承而來的equals方法,是不合適的。此時便需要重寫equals方法。

重寫equals方法:
(1).判斷兩個對象是不是同一個對象。如果調用方法的類對象和傳入參數類對象地址一致,那就是同一個對象,返回true。
(2).equals方法參數是Object類型,那也就是說任何類型的數據都可以作爲參數。因此須判斷兩個數據類型是否一致,如果不一致則無需進行比較操作。判斷數據類型是否一致使用instanceOf關鍵字,相同則繼續運行,不同則結束運行,返回false。
格式:

  •  	類對象  instanceOf  類名   { }
    

(3)判斷對象中保存的數據。
代碼實現:

@Override                                                            
public boolean equals(Object obj) {                                  
	// 1. 判斷是不是同地址對象                                                 
	if (this == obj) {                                               
		return true;                                                 
	}                                                                
	                                                                 
	// 2. 類型是否一致                                                     
	if (!(obj instanceof Student)) {                                 
		return false;                                                
	}                                                                
                                                            
	// 數據類型強制轉換                                                      
	Student stu = (Student) obj;                                     
	return this.id == stu.id                                         
			// this.name.equals(stu.name) 該equals方法是String類equals方法  
			&& this.name.equals(stu.name)                            
			&& this.age == stu.age                                   
			&& this.gender == stu.gender;                                                                                   
} 

1.4 hashCode方法

  • 在Object類內,hashCode方法,返回的內容是當前對象的空間首地址十進制展示方式。
  • 當前類重寫equals方法之後,兩個當前類對象比較結果爲true,那麼要求這兩個對象的hashCode必須一致!
  • hashCode使用有一個唯一原則。
  • 一般會參考參與equals比較的所有成員變量來組成對應的hashCode,這裏會使用到一些Java中提供的計算哈希值的方法。
  • hashCode使用未進行重寫的情況下,會使用地址作爲hashCode對應的數據,重寫之後,不再使用地址。重寫之後hashCode 不對應當前對象所在地址。
@Override
public int hashCode() {
	// 這裏通過Objects 工具類內的hash方法,傳入所有參與equals比較的成員變量
	// 得到對應的hashCode值
	return Objects.hash(id, name, age, gender);
}

2.Set接口

2.1 Set接口概述

特徵:

  • 無序:添加順序和存儲順序不一致,【並非是有排序效果】
  • 不可重複: 在一個Set集合中不能出現相同元素,重複添加相同元素無效,但代碼不會報錯
  • Set接口下有兩個實現類
    interface Set
    –| class HashSet 底層是哈希表存儲數據
    –| class TreeSet 底層存儲數據是一個二叉樹

2.2 HashSet實現類

2.2.1 底層結構

哈希表

  • 每一個單元格都有一個唯一位置, 這裏 需要通過hashCode方法,得到對應的哈希 值,並且按照哈希表存儲原理,計算當前元素一個保存的位置是哪裏。
  • 哈希表中每一個單元格位置都是一個桶式結構,存儲數據沒有順序可言,數量也沒有明確限制。
  • 首先執行HashCode方法,通過哈希值計算對應的位置。
    1.當前單元格位置沒有其他元素,直接放入
    2.如果當前位置有其他元素,需要使用equals方法
    比較,如果比較結果爲相同元素,無法存儲,同
    元臻可以存儲。

代碼演示:

import java.util.HashSet;

public class Demo2 {
	public static void main(String[] args) {
		HashSet<Person> hashSet = new HashSet<Person>();
		
		Person p1 = new Person(1, "AA", 10);
		Person p2 = new Person(2, "BB", 15);
		Person p3 = new Person(3, "CC", 2);
		Person p4 = new Person(4, "DD", -5);
		Person p5 = new Person(5, "EE", 11);
		
		/*
		 * 當前這裏兩個元素,ID一樣 ==> hashCode值是一致,會通過底層哈希表運算
		 * 保存到同一個單元格位置。
		 * 這裏會通過equals方法,比較兩個對象是否一致,來決定是否能夠保存。
		 * 如果兩個對象一致,無法保存。
		 * 
		 * 期望每一個哈希表單元格內保存的數據是唯一
		 */
		Person p6 = new Person(6, "111", 8);
		Person p7 = new Person(6, "222", 10);	
		hashSet.add(p4);
		hashSet.add(p6);
		hashSet.add(p3);
		hashSet.add(p5);
		hashSet.add(p2);
		hashSet.add(p1);
		hashSet.add(p7);
		
		System.out.println(hashSet);
	}
}

2.3TreeSet 實現類

2.3.1 Tree樹形結構

2.3.2 TreeSet存儲

若沒有比較方式,無法存儲。

2.3.3 Comparable接口使用

interface Comparable<T> {
	int compareTo(T t);
}
  • 方法參數爲T類型,由實現類遵從接口時約束,compareTo方法,返回值類型int類型,包括0, 負數,正數。
  • 0 表示兩個元素一致,如果在TreeSet中比較結果爲0,表示同一個元素,無法存儲第二元素。
  • Comparable接口由存儲元素對應的類遵從,完成該方法

2.3.4 Comparator接口使用

interface Comparator<T> {
	int compare(T o1, T o2);
}	
  • 需要完成一個自定義比較器類對象,返回值爲int類型,包括 0,負數,正數
  • 0 表示兩個元素一致,如果在TreeSet中比較結果爲0,表示同一個元素,無法存儲第二個。
  • Comparator使用要高於Comparable使用
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章