java中的set接口有如下的特點(diǎn): 不允許出現(xiàn)重復(fù)元素,; 因?yàn)閖ava中的set接口模仿了數(shù)學(xué)上的set抽象,,所以,,對應(yīng)的數(shù)學(xué)上set的特性為: 互異性:一個(gè)集合中,任何兩個(gè)元素都認(rèn)為是不相同的,,即每個(gè)元素只能出現(xiàn)一次,。 Set不保存重復(fù)的元素,。Set中最常被使用的是測試歸屬性,你可以很容易的詢問某個(gè)對象是否在某個(gè)Set中,。Set具有與Collection完全一樣的接口,,因此沒有任何額外的功能。實(shí)際上Set就是Collection,,只是行為不同,。 實(shí)現(xiàn)了Set接口的主要有HashSet、TreeSet,、LinkedHashSet這幾個(gè)共同點(diǎn)就是每個(gè)相同的項(xiàng)只保存一份,。他們也有不同點(diǎn),區(qū)別如下: 1.HashSet: HashSet使用的是相當(dāng)復(fù)雜的方式來存儲元素的,,使用HashSet能夠最快的獲取集合中的元素,,效率非常高(以空間換時(shí)間),。會根據(jù)hashcode和equals來龐端是否是同一個(gè)對象,如果hashcode一樣,,并且equals返回true,,則是同一個(gè)對象,不能重復(fù)存放,。 package cn.set;import java.util.HashSet;import java.util.Set;class Student{ int id; public Student(int id) { this.id = id; } @Override public String toString() { return this.id+''; } @Override public int hashCode() { return this.id; } @Override public boolean equals(Object obj) { if (obj instanceof Student){ Student stu = (Student) obj; if (stu.id == this.id) return true; } return false; }}public class HashSetTest { public static void main(String[] args) { Set 正如上例所示,,重寫了hashCode()和equals()方法來區(qū)分同意對象后,就不能存放同以對象了,。如果注釋這兩個(gè)方法,,則所有Student對象視為不同對象,都可以存放,。 2.TreeSet TreeSet也不能存放重復(fù)對象,,但是TreeSet會自動排序,如果存放的對象不能排序則會報(bào)錯(cuò),,所以存放的對象必須指定排序規(guī)則,。排序規(guī)則包括自然排序和客戶排序。 ?、僮匀慌判颍篢reeSet要添加哪個(gè)對象就在哪個(gè)對象類上面實(shí)現(xiàn)java.lang.Comparable接口,,并且重寫comparaTo()方法,返回0則表示是同一個(gè)對象,,否則為不同對象,。 ②客戶排序:建立一個(gè)第三方類并實(shí)現(xiàn)java.util.Comparator接口,。并重寫方法,。定義集合形式為TreeSet ts = new TreeSet(new 第三方類()); 下面一個(gè)例子用TreeSet存放自然排序的對象:
package cn.set;import java.util.Set;import java.util.TreeSet;class Student1 implements Comparable 輸出結(jié)果為: 下面一個(gè)例子用TreeSet存放客戶排序的對象:
package com.set;import java.util.Set;import java.util.TreeSet;class Student1 implements Comparable 輸出結(jié)果為: 大家都知道List存放時(shí)按照插入順序排序的,其實(shí)也可以用自然排序和客戶排序?qū)ist集合排序,,大家請看:
package cn.set;import java.util.ArrayList;import java.util.Collections;import java.util.List;class MySort1 implements java.util.Comparator 輸出結(jié)果為: 下面為大家介紹Java中的Set集合接口實(shí)現(xiàn)插入對象不重復(fù)的原理: 在java的集合中,,判斷兩個(gè)對象是否相等的規(guī)則是: 1)、判斷兩個(gè)對象的hashCode是否相等 2),、判斷兩個(gè)對象用equals運(yùn)算是否相等 如果不相等,,認(rèn)為兩個(gè)對象也不相等 如果相等,認(rèn)為兩個(gè)對象相等(equals()是判斷兩個(gè)對象是否相等的關(guān)鍵) 對于一般類的對象(除String等封裝類型對象外): 若普通類沒有重寫hashcode()和equals()方法,,,,那么其對象在比較時(shí),是繼承的object類中的hashcode()方法,,object類中的hashcode()方法是一個(gè)本地方法,,對該方法的返回值進(jìn)行比較時(shí),比較的是對象的地址(引用地址),,使用new方法創(chuàng)建內(nèi)容相同的對象,,兩次生成的當(dāng)然是不同的對象。除非重寫hashcode()方法,。在object類中定義的equals()方法也是對對象地址的比較,。一句話總結(jié):若不重寫普通類的hashcode()和equals()方法,在Set集合中對象引用地址不一樣,,對象即不重復(fù),。 對于String等對象(String、Integer,、Double····等等): 由于這些封裝類本身已經(jīng)重寫了hashcode()方法,,并且重寫的方法的返回值跟對象的內(nèi)容相關(guān),而不是跟引用地址相關(guān),。這些封裝類中的equals()方法同樣進(jìn)行了重寫,,比較的是對象的內(nèi)容,而非引用地址,。一句話總結(jié):String等類的對象在集合中均比較他們的內(nèi)容,,內(nèi)容相同則覆蓋已存在的對象。 以上就是本文的全部內(nèi)容,,希望對大家的學(xué)習(xí)有所幫助,。 |
|