1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Java中的hashCode() 和 equals()的若干問題解答

        共 14512字,需瀏覽 30分鐘

         ·

        2020-10-12 01:37


        一、hashCode()的作用


        哈希表這個(gè)數(shù)據(jù)結(jié)構(gòu)想必大多數(shù)人都不陌生,而且在很多地方都會(huì)利用到hash表來提高查找效率。在Java的Object類中有一個(gè)方法:


        public?native?int?hashCode();


        根據(jù)這個(gè)方法的聲明可知,該方法返回一個(gè)int類型的數(shù)值,并且是本地方法,因此在Object類中并沒有給出具體的實(shí)現(xiàn)。為何Object類需要這樣一個(gè)方法?它有什么作用呢?


        不妨舉個(gè)例子:


        假設(shè)內(nèi)存中有0 1 2 3 4 5 6 7 8這8個(gè)位置,如果我有個(gè)字段叫做ID,那么我要把這個(gè)字段存放在以上8個(gè)位置之一,如果不用HashCode而任意存放,那么當(dāng)查找時(shí)就需要到8個(gè)位置中去挨個(gè)查找。使用HashCode則效率會(huì)快很多,把ID的HashCode%8,然后把ID存放在取得余數(shù)的那個(gè)位置,然后每次查找該類的時(shí)候都可以通過ID的HashCode%8求余數(shù)直接找到存放的位置了。如果ID的HashCode%8算出來的位置上本身已經(jīng)有數(shù)據(jù)了怎么辦?這就取決于算法的實(shí)現(xiàn)了,比如ThreadLocal中的做法就是從算出來的位置向后查找第一個(gè)為空的位置,放置數(shù)據(jù);HashMap的做法就是通過鏈?zhǔn)浇Y(jié)構(gòu)連起來。反正,只要保證放的時(shí)候和取的時(shí)候的算法一致就行了。如果ID的HashCode%8相等怎么辦(這種對應(yīng)的是上句說的鏈?zhǔn)浇Y(jié)構(gòu)的場景)?這時(shí)候就需要定義equals了。先通過HashCode%8來判斷類在哪一個(gè)位置,再通過equals來在這個(gè)位置上尋找需要的類。對比兩個(gè)類的時(shí)候也差不多,先通過HashCode比較,假如HashCode相等再判斷equals。如果兩個(gè)類的HashCode都不相同,那么這兩個(gè)類必定是不同的

        ?????

        再舉個(gè)實(shí)際的例子Set。我們知道Set里面的元素是不可以重復(fù)的,那么如何做到?Set是根據(jù)equals()方法來判斷兩個(gè)元素是否相等的。比方說Set里面已經(jīng)有1000個(gè)元素了,那么第1001個(gè)元素進(jìn)來的時(shí)候,最多可能調(diào)用1000次equals方法,如果equals方法寫得復(fù)雜,對比的東西特別多,那么效率會(huì)大大降低。使用HashCode就不一樣了,比方說HashSet,底層是基于HashMap實(shí)現(xiàn)的,先通過HashCode取一個(gè)模,這樣一下子就固定到某個(gè)位置了,如果這個(gè)位置上沒有元素,那么就可以肯定HashSet中必定沒有和新添加的元素equals的元素,就可以直接存放了,都不需要比較;如果這個(gè)位置上有元素了,逐一比較,比較的時(shí)候先比較HashCode,HashCode都不同接下去都不用比了,肯定不一樣,HashCode相等,再equals比較,沒有相同的元素就存,有相同的元素就不存。如果原來的Set里面有相同的元素,只要HashCode的生成方式定義得好(不重復(fù)),不管Set里面原來有多少元素,只需要執(zhí)行一次的equals就可以了。這樣一來,實(shí)際調(diào)用equals方法的次數(shù)大大降低,提高了效率。

        ?????

        所以hashCode在上面扮演的角色為尋域(尋找某個(gè)對象在集合中區(qū)域位置)。hashCode可以將集合分成若干個(gè)區(qū)域,每個(gè)對象都可以計(jì)算出他們的hash碼,可以將hash碼分組,每個(gè)分組對應(yīng)著某個(gè)存儲(chǔ)區(qū)域,根據(jù)一個(gè)對象的hash碼就可以確定該對象所存儲(chǔ)區(qū)域,這樣就大大減少查詢匹配元素的數(shù)量,提高了查詢效率。

        ?????

        即hashCode() 的作用是獲取哈希碼,也稱為散列碼;它實(shí)際上是返回一個(gè)int整數(shù)。這個(gè)哈希碼的作用是確定該對象在哈希表中的索引位置。


        二、hashCode對于一個(gè)對象的重要性

        ?????

        hashCode() 定義在JDK的Object.java中,這就意味著Java中的任何類都包含有hashCode() 函數(shù)。
        ??????

        雖然,每個(gè)Java類都包含hashCode() 函數(shù)。但是,僅僅當(dāng)創(chuàng)建某個(gè)“類的散列表”(關(guān)于“散列表”見下面說明)時(shí),該類的hashCode() 才有用(作用是:確定該類的每一個(gè)對象在散列表中的位置;其它情況下(例如,創(chuàng)建類的單個(gè)對象,或者創(chuàng)建類的對象數(shù)組等等),類的hashCode() 沒有作用。
        ??????

        上面的散列表,指的是:Java集合中本質(zhì)是散列表的類,如HashMap,Hashtable,HashSet。

        ??????

        也就是說:hashCode() 在散列表中才有用,在其它情況下沒用。在散列表中hashCode() 的作用是獲取對象的散列碼,進(jìn)而確定該對象在散列表中的位置。

        ??????

        OK!至此,我們搞清楚了:hashCode()的作用是獲取散列碼。但是,散列碼是用來干什么的呢?這里簡單的介紹一下散列碼的作用。

        ?????

        我們都知道,散列表存儲(chǔ)的是鍵值對(key-value),它的特點(diǎn)是:能根據(jù)“鍵”快速的檢索出對應(yīng)的“值”。這其中就利用到了散列碼!散列表的本質(zhì)是通過數(shù)組實(shí)現(xiàn)的。當(dāng)我們要獲取散列表中的某個(gè)“值”時(shí),實(shí)際上是要獲取數(shù)組中的某個(gè)位置的元素。而數(shù)組的位置,就是通過“鍵”來獲取的;更進(jìn)一步說,數(shù)組的位置,是通過“鍵”對應(yīng)的散列碼計(jì)算得到的。

        ?????

        下面我以HashTable為例闡述hashCode對于一個(gè)對象的重要性。

        ??????

        一個(gè)對象勢必會(huì)存在若干個(gè)屬性,如何選擇屬性來進(jìn)行散列考驗(yàn)著一個(gè)人的設(shè)計(jì)能力。如果我們將所有屬性進(jìn)行散列,這必定會(huì)是一個(gè)糟糕的設(shè)計(jì),因?yàn)閷ο蟮膆ashCode方法無時(shí)無刻不是在被調(diào)用,如果太多的屬性參與散列,那么需要的操作數(shù)時(shí)間將會(huì)大大增加,這將嚴(yán)重影響程序的性能。但是如果較少屬相參與散列,散列的多樣性會(huì)削弱,會(huì)產(chǎn)生大量的散列“沖突”,除了不能夠很好的利用空間外,在某種程度也會(huì)影響對象的查詢效率。其實(shí)這兩者是一個(gè)矛盾體,散列的多樣性會(huì)帶來性能的降低。

        ??????

        那么如何對對象的hashCode進(jìn)行設(shè)計(jì),LZ也沒有經(jīng)驗(yàn)。從網(wǎng)上查到了這樣一種解決方案:設(shè)置一個(gè)緩存標(biāo)識(shí)來緩存當(dāng)前的散列碼,只有當(dāng)參與散列的對象改變時(shí)才會(huì)重新計(jì)算,否則調(diào)用緩存的hashCode,這樣就可以從很大程度上提高性能。

        ??????

        在HashTable計(jì)算某個(gè)對象在table[]數(shù)組中的索引位置,其代碼如下:


        int?index = (hash & 0x7FFFFFFF) % tab.length;


        為什么要&0x7FFFFFFF?因?yàn)槟承ο蟮膆ashCode可能會(huì)為負(fù)值,與0x7FFFFFFF進(jìn)行與運(yùn)算可以確保index為一個(gè)正數(shù)。通過這步我可以直接定位某個(gè)對象的位置,所以從理論上來說我們是完全可以利用hashCode直接定位對象的散列表中的位置,但是為什么會(huì)存在一個(gè)key-value的鍵值對,利用key的hashCode來存入數(shù)據(jù)而不是直接存放value呢?這就關(guān)系HashTable性能問題的最重要的問題:Hash沖突!

        ??????

        我們知道沖突的產(chǎn)生是由于不同的對象產(chǎn)生了相同的散列碼,假如我們設(shè)計(jì)對象的散列碼可以確保99.999999999%的不重復(fù),但是有一種絕對且?guī)缀醪豢赡苡龅降臎_突你是絕對避免不了的。我們知道hashcode返回的是int,它的值只可能在int范圍內(nèi)。如果我們存放的數(shù)據(jù)超過了int的范圍呢?這樣就必定會(huì)產(chǎn)生兩個(gè)相同的index,這時(shí)在index位置處會(huì)存儲(chǔ)兩個(gè)對象,我們就可以利用key本身來進(jìn)行判斷。所以具有相索引的對象,在該index位置處存在多個(gè)對象,我們必須依靠key的hashCode和key本身來進(jìn)行區(qū)分。


        三、equals()的作用


        equals() 的作用是 用來判斷兩個(gè)對象是否相等


        equals() 定義在JDK的Object.java中。通過判斷兩個(gè)對象的地址是否相等(即,是否是同一個(gè)對象)來區(qū)分它們是否相等。源碼如下:


        public?boolean?equals(Object?obj) {
        ????return?(this?== obj);
        }


        既然Object.java中定義了equals()方法,這就意味著所有的Java類都實(shí)現(xiàn)了equals()方法,所有的類都可以通過equals()去比較兩個(gè)對象是否相等。但是,我們已經(jīng)說過,使用默認(rèn)的“equals()”方法,等價(jià)于“==”方法。因此,我們通常會(huì)重寫equals()方法:若兩個(gè)對象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。


        下面根據(jù)“類是否覆蓋equals()方法”,將它分為2類。


        (01) 若某個(gè)類沒有覆蓋equals()方法,當(dāng)它的通過equals()比較兩個(gè)對象時(shí),實(shí)際上是比較兩個(gè)對象是不是同一個(gè)對象。這時(shí),等價(jià)于通過“==”去比較這兩個(gè)對象。
        (02) 我們可以覆蓋類的equals()方法,來讓equals()通過其它方式比較兩個(gè)對象是否相等。通常的做法是:若兩個(gè)對象的內(nèi)容相等,則equals()方法返回true;否則,返回fasle。


        下面,舉例對上面的2種情況進(jìn)行說明。


        1、"沒有覆蓋equals()方法"的情況


        代碼如下:


        package com.demo;

        public?class?EqualsTest1?{
        ????
        ????/**
        ?????* Person類
        ?????* @author lixiaoxi
        ?????*
        ?????*/

        ????private?static?class?Person{
        ????????int?age;
        ????????String name;
        ????????
        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?name + " - "?+age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建2個(gè)相同內(nèi)容的Person對象,
        ????????// 再用equals比較它們是否相等
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????System.out.printf("%s\n", p1.equals(p2));
        ????}
        ????
        }


        運(yùn)行結(jié)果:false


        結(jié)果分析:
        ?????

        我們通過 p1.equals(p2) 來“比較p1和p2是否相等時(shí)”。實(shí)際上,調(diào)用的Object.java的equals()方法,即調(diào)用的 (p1==p2) 。它是比較“p1和p2是否是同一個(gè)對象”。而由 p1 和 p2 的定義可知,它們雖然內(nèi)容相同;但它們是兩個(gè)不同的對象!因此,返回結(jié)果是false。


        2、"覆蓋equals()方法"的情況


        我們修改上面的EqualsTest1.java:覆蓋equals()方法。


        代碼如下:


        package com.demo;

        public?class?EqualsTest2?{
        ????
        ????/**
        ?????* Person類
        ?????* @author lixiaoxi
        ?????*
        ?????*/

        ????private?static?class?Person{
        ????????int?age;
        ????????String name;
        ????????
        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?name + " - "?+age;
        ????????}
        ????????
        ????????/**
        ?????????* 覆蓋equals方法
        ?????????*/

        ????????@Override
        ????????public?boolean equals(Object obj)
        {
        ????????????if(obj == null){
        ????????????????return?false;
        ????????????}
        ????????????
        ????????????//如果是同一個(gè)對象返回true,反之返回false
        ????????????if(this?== obj){
        ????????????????return?true;
        ????????????}
        ????????????
        ????????????//判斷是否類型相同
        ????????????if(this.getClass() != obj.getClass()){
        ????????????????return?false;
        ????????????}
        ????????????
        ????????????Person person = (Person)obj;
        ????????????return?name.equals(person.name) && age==person.age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建2個(gè)相同內(nèi)容的Person對象,
        ????????// 再用equals比較它們是否相等
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????System.out.printf("%s\n", p1.equals(p2));
        ????}
        }


        運(yùn)行結(jié)果:true


        結(jié)果分析:


        我們在EqualsTest2.java 中重寫了Person的equals()函數(shù):當(dāng)兩個(gè)Person對象的 name 和 age 都相等,則返回true。因此,運(yùn)行結(jié)果返回true。


        講到這里,順便說一下java對equals()的要求。有以下幾點(diǎn):


        1. 對稱性:如果x.equals(y)返回是"true",那么y.equals(x)也應(yīng)該返回是"true"。
        2. 反射性:x.equals(x)必須返回是"true"。
        3. 類推性:如果x.equals(y)返回是"true",而且y.equals(z)返回是"true",那么z.equals(x)也應(yīng)該返回是"true"。
        4. 一致性:如果x.equals(y)返回是"true",只要x和y內(nèi)容一直不變,不管你重復(fù)x.equals(y)多少次,返回都是"true"。
        5. 非空性,x.equals(null),永遠(yuǎn)返回是"false";x.equals(和x不同類型的對象)永遠(yuǎn)返回是"false"。


        四、equals()與==的區(qū)別


        == : 它的作用是判斷兩個(gè)對象的地址是不是相等。即,判斷兩個(gè)對象是不是同一個(gè)對象。


        equals() : 它的作用也是判斷兩個(gè)對象是否相等。但它一般有兩種使用情況(上面已詳細(xì)介紹過):


        情況1,類沒有覆蓋equals()方法。則通過equals()比較該類的兩個(gè)對象時(shí),等價(jià)于通過“==”比較這兩個(gè)對象。


        情況2,類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來比較兩個(gè)對象的內(nèi)容相等;若它們的內(nèi)容相等,則返回true(即,認(rèn)為這兩個(gè)對象相等)。


        下面,通過示例比較它們的區(qū)別。


        代碼如下:


        package com.demo;

        public?class?EqualsTest3?{
        ????
        ????/**
        ?????* Person類
        ?????* @author lixiaoxi
        ?????*
        ?????*/

        ????private?static?class?Person{
        ????????int?age;
        ????????String name;
        ????????
        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?name + " - "?+age;
        ????????}
        ????????
        ????????/**
        ?????????* 覆蓋equals方法
        ?????????*/

        ????????@Override
        ????????public?boolean equals(Object obj)
        {
        ????????????if(obj == null){
        ????????????????return?false;
        ????????????}
        ????????????
        ????????????//如果是同一個(gè)對象返回true,反之返回false
        ????????????if(this?== obj){
        ????????????????return?true;
        ????????????}
        ????????????
        ????????????//判斷是否類型相同
        ????????????if(this.getClass() != obj.getClass()){
        ????????????????return?false;
        ????????????}
        ????????????
        ????????????Person person = (Person)obj;
        ????????????return?name.equals(person.name) && age==person.age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建2個(gè)相同內(nèi)容的Person對象,
        ????????// 再用equals比較它們是否相等
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????System.out.printf("p1.equals(p2) : %s\n", p1.equals(p2));
        ????????System.out.printf("p1==p2 : %s\n", p1==p2);
        ????}
        }


        運(yùn)行結(jié)果:


        p1.equals(p2) : true
        p1==p2 : false


        結(jié)果分析:


        在EqualsTest3.java 中:


        (01) p1.equals(p2) 這是判斷p1和p2的內(nèi)容是否相等。因?yàn)镻erson覆蓋equals()方法,而這個(gè)equals()是用來判斷p1和p2的內(nèi)容是否相等,恰恰p1和p2的內(nèi)容又相等;因此,返回true。


        (02) p1==p2 這是判斷p1和p2是否是同一個(gè)對象。由于它們是各自新建的兩個(gè)Person對象;因此,返回false。


        五、hashCode() 和 equals()的關(guān)系


        我們以“類的用途”來將“hashCode() 和 equals()的關(guān)系”分2種情況來說明。


        1、第一種 不會(huì)創(chuàng)建“類對應(yīng)的散列表”


        這里所說的“不會(huì)創(chuàng)建類對應(yīng)的散列表”是說:我們不會(huì)在HashSet, Hashtable, HashMap等等這些本質(zhì)是散列表的數(shù)據(jù)結(jié)構(gòu)中,用到該類。例如,不會(huì)創(chuàng)建該類的HashSet集合。


        在這種情況下,該類的“hashCode() 和 equals() ”沒有半毛錢關(guān)系的!這種情況下,equals() 用來比較該類的兩個(gè)對象是否相等。而hashCode() 則根本沒有任何作用,所以,不用理會(huì)hashCode()。


        下面,我們通過示例查看類的兩個(gè)對象相等 以及 不等時(shí)hashCode()的取值。


        代碼如下:


        package com.demo;

        /**
        ?* @desc 比較equals() 返回true 以及 返回false時(shí), hashCode()的值。
        ?* @author lixiaoxi
        ?*
        ?*/

        public?class?NormalHashCodeTest?{
        ????
        ??????/**
        ?????* @desc Person類。
        ?????*/

        ????private?static?class?Person?{
        ????????int?age;
        ????????String name;

        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?name + " - "?+age;
        ????????}

        ????????/**
        ?????????* @desc 覆蓋equals方法
        ?????????*/
        ??
        ????????public?boolean equals(Object obj){
        ????????????if(obj == null){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????//如果是同一個(gè)對象返回true,反之返回false
        ????????????if(this?== obj){
        ????????????????return?true;
        ????????????}
        ??????????????
        ????????????//判斷是否類型相同
        ????????????if(this.getClass() != obj.getClass()){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????Person person = (Person)obj;
        ????????????return?name.equals(person.name) && age==person.age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建2個(gè)相同內(nèi)容的Person對象,
        ????????// 再用equals比較它們是否相等
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????Person p3 = new?Person("aaa", 200);
        ????????System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());
        ????????System.out.printf("p1.equals(p3) : %s; p1(%d) p3(%d)\n", p1.equals(p3), p1.hashCode(), p3.hashCode());
        ????}
        }


        運(yùn)行結(jié)果:


        p1.equals(p2) : true; p1(30961619) p2(521452)
        p1.equals(p3) : false; p1(30961619) p3(29744585)


        從結(jié)果也可以看出:p1和p2相等的情況下,hashCode()也不一定相等。


        2、第二種 會(huì)創(chuàng)建“類對應(yīng)的散列表”


        這里所說的“會(huì)創(chuàng)建類對應(yīng)的散列表”是說:我們會(huì)在HashSet, Hashtable, HashMap等等這些本質(zhì)是散列表的數(shù)據(jù)結(jié)構(gòu)中,用到該類。例如,會(huì)創(chuàng)建該類的HashSet集合。

        在這種情況下,該類的“hashCode() 和 equals() ”是有關(guān)系的:


        1)、如果兩個(gè)對象相等,那么它們的hashCode()值一定相同。這里的相等是指,通過equals()比較兩個(gè)對象時(shí)返回true。


        2)、如果兩個(gè)對象hashCode()相等,它們并不一定相等。


        因?yàn)樵谏⒘斜碇?,hashCode()相等,即兩個(gè)鍵值對的哈希值相等。然而哈希值相等,并不一定能得出鍵值對相等。補(bǔ)充說一句:“兩個(gè)不同的鍵值對,哈希值相等”,這就是哈希沖突。


        此外,在這種情況下。若要判斷兩個(gè)對象是否相等,除了要覆蓋equals()之外,也要覆蓋hashCode()函數(shù)。否則,equals()無效。例如,創(chuàng)建Person類的HashSet集合,必須同時(shí)覆蓋Person類的equals() 和 hashCode()方法。如果單單只是覆蓋equals()方法。我們會(huì)發(fā)現(xiàn),equals()方法沒有達(dá)到我們想要的效果。


        代碼如下:


        package com.demo;

        import java.util.HashSet;

        /**
        ?* @desc 比較equals() 返回true 以及 返回false時(shí), hashCode()的值。
        ?* @author lixiaoxi
        ?*
        ?*/

        public?class?ConflictHashCodeTest1?{
        ????
        ?????/**
        ?????* @desc Person類。
        ?????*/

        ????private?static?class?Person?{
        ????????int?age;
        ????????String name;

        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?"("+name + ", "?+age+")";
        ????????}

        ????????/**
        ?????????* @desc 覆蓋equals方法
        ?????????*/
        ??
        ????????@Override
        ????????public?boolean equals(Object obj)
        {
        ????????????if(obj == null){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????//如果是同一個(gè)對象返回true,反之返回false
        ????????????if(this?== obj){
        ????????????????return?true;
        ????????????}
        ??????????????
        ????????????//判斷是否類型相同
        ????????????if(this.getClass() != obj.getClass()){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????Person person = (Person)obj;
        ????????????return?name.equals(person.name) && age==person.age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建Person對象,
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????Person p3 = new?Person("aaa", 200);

        ????????// 新建HashSet對象
        ????????HashSet set?= new?HashSet();
        ????????set.add(p1);
        ????????set.add(p2);
        ????????set.add(p3);

        ????????// 比較p1 和 p2, 并打印它們的hashCode()
        ????????System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());
        ????????// 打印set
        ????????System.out.printf("set:%s\n", set);
        ????}
        ????
        }


        運(yùn)行結(jié)果:


        p1.equals(p2) : true; p1(13905160) p2(30961619)
        set:[(aaa, 200), (eee, 100), (eee, 100)]


        結(jié)果分析:


        我們重寫了Person的equals()。但是,很奇怪的發(fā)現(xiàn):HashSet中仍然有重復(fù)元素:p1 和 p2。為什么會(huì)出現(xiàn)這種情況呢?這是因?yàn)殡m然p1 和 p2的內(nèi)容相等,但是它們的hashCode()不等;所以,HashSet在添加p1和p2的時(shí)候,認(rèn)為它們不相等。


        下面,我們同時(shí)覆蓋equals() 和 hashCode()方法。


        代碼如下:


        package com.demo;

        import java.util.HashSet;

        /**
        ?* @desc 比較equals() 返回true 以及 返回false時(shí), hashCode()的值。
        ?* @author lixiaoxi
        ?*
        ?*/

        public?class?ConflictHashCodeTest2?{
        ????
        ????/**
        ?????* @desc Person類。
        ?????*/

        ????private?static?class?Person?{
        ????????int?age;
        ????????String name;

        ????????public?Person(String name, int?age) {
        ????????????this.name = name;
        ????????????this.age = age;
        ????????}

        ????????public?String toString() {
        ????????????return?name + " - "?+age;
        ????????}

        ????????/**
        ?????????* @desc重寫hashCode
        ?????????*/
        ??
        ????????@Override
        ????????public?int?hashCode()
        {
        ????????????int?nameHash = name.toUpperCase().hashCode();
        ????????????return?nameHash ^ age;
        ????????}

        ????????/**
        ?????????* @desc 覆蓋equals方法
        ?????????*/
        ??
        ????????@Override
        ????????public?boolean equals(Object obj)
        {
        ????????????if(obj == null){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????//如果是同一個(gè)對象返回true,反之返回false
        ????????????if(this?== obj){
        ????????????????return?true;
        ????????????}
        ??????????????
        ????????????//判斷是否類型相同
        ????????????if(this.getClass() != obj.getClass()){
        ????????????????return?false;
        ????????????}
        ??????????????
        ????????????Person person = (Person)obj;
        ????????????return?name.equals(person.name) && age==person.age;
        ????????}
        ????}
        ????
        ????public?static?void?main(String[] args) {
        ????????// 新建Person對象,
        ????????Person p1 = new?Person("eee", 100);
        ????????Person p2 = new?Person("eee", 100);
        ????????Person p3 = new?Person("aaa", 200);
        ????????Person p4 = new?Person("EEE", 100);

        ????????// 新建HashSet對象
        ????????HashSet set?= new?HashSet();
        ????????set.add(p1);
        ????????set.add(p2);
        ????????set.add(p3);

        ????????// 比較p1 和 p2, 并打印它們的hashCode()
        ????????System.out.printf("p1.equals(p2) : %s; p1(%d) p2(%d)\n", p1.equals(p2), p1.hashCode(), p2.hashCode());
        ????????// 比較p1 和 p4, 并打印它們的hashCode()
        ????????System.out.printf("p1.equals(p4) : %s; p1(%d) p4(%d)\n", p1.equals(p4), p1.hashCode(), p4.hashCode());
        ????????// 打印set
        ????????System.out.printf("set:%s\n", set);
        ????}
        }


        運(yùn)行結(jié)果:


        p1.equals(p2) : true; p1(68545) p2(68545)
        p1.equals(p4) : false; p1(68545) p4(68545)
        set:[aaa - 200, eee - 100]


        結(jié)果分析:


        這下,equals()生效了,HashSet中沒有重復(fù)元素。


        比較p1和p2,我們發(fā)現(xiàn):它們的hashCode()相等,通過equals()比較它們也返回true。所以,p1和p2被視為相等。


        比較p1和p4,我們發(fā)現(xiàn):雖然它們的hashCode()相等;但是,通過equals()比較它們返回false。所以,p1和p4被視為不相等。


        原文鏈接:cnblogs.com/xiaoxi/p/6428432.html



        瀏覽 41
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        評(píng)論
        圖片
        表情
        推薦
        點(diǎn)贊
        評(píng)論
        收藏
        分享

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            一区二区三区网| 黄色视频| 最近2021中文字幕免费| 黄网在线播放| 99无码精品| 韩国三级中文字幕HD久久精品| 久久久网| 美女白嫩嫩大BBB欣赏| 一区二区三区水蜜桃| 99热精品久久| 97日韩天堂| 麻豆国产| 一道本高清无码视频| 亚洲国产成人AV| 夜夜操狠狠操| 成人午夜大片| 青青草手机视频| 中文字幕久久人妻无码精品蜜桃| 欧美综合第一页| 高清无码视频免费| 伊人成人网视频| 亚洲福利影院| AV在线免费播放| 日本爱爱小视频| 亚洲无码在线视频观看| 国产亚洲精品久久久久久桃色| 五月天丁香婷婷视频| 91视频在线观看| 一级aa片| 无码免费一区| 99久久婷婷国产综合精品hsex | 亚洲无码性爱| 蜜桃精品在线观看| 中文一区| 国产免费无码视频| 北条麻妃在线一区二区| 亚洲成人视频网| 污视频在线| 一级片在线| 欧美成人视频网站| 无码一区二区视频| 天天干天| 久久精品偷拍视频| 日韩国产免费| 成人免费高清| 丁香激情视频| 中文字幕东京热加勒比| 亚洲人妻av| 日韩一区无码| 精品国产AⅤ麻豆| 中国免费一级无码成人片| 人成无码| av乱伦小说| 欧美熟妇擦BBBB擦BBBB| 国产a一级a毛一级视频| 欧美成人一区免费视频| 一级免费毛片| 99国产在线观看| 人妻骚逼| 黄色成人在线免费观看| 内射视频免费观看| 国产最新地址| 大香蕉免费在线| 中文字幕天堂在线| 欧一美一婬一伦一区?| 亚洲日韩网站在线观看| 欧美A视频在线观看| 黄色一级电影| 亚洲精品三级| 69超碰| 陈冠希和张柏芝mv| 高H视频在线观看| 日韩日日日| 国产精品porn| 亚洲无码性爱视频| 怡春院院成人免费视频| 1000部毛片A片免费视频| 久久久久亚洲AV无码专区成人| 伊人婷婷久久| 夏目あきら被续侵犯7天| 久久亚洲福利视频| 中文字幕精品在线免费视频观看视频 | 国产精品久免费的黄网站| 牛牛无码| 免费视频一二区| 中国一级黄片| 在线99精品| 国产精品9999久久久久仙踪林| 成人大香蕉| 日韩二区| 高清无码免费在线观看| 国产一级黄色电影| 欧美色图88| 人人操人人操人人| 婷婷五月天电影| 无码中文av| 亚洲AV免费在线| 精品一区二区视频| 久久久久国产视频| 国产在线导航| 操啊操| 人人操在线观看| 天堂成人在线| 夜夜操天天操| 宅男视频| 五月婷婷中文| 狠狠操AV| 成人无码免费| 午夜激情视频在线观看| 国产精品九九| 久久久久久av| 小骚逼操死你| 中文字幕A片无码免费看| 亚洲天堂久久| 91成人免费视频| 波多野结衣无码在线| 欧美色图88| 中文字幕视频一区| 免费在线黄片| mm131亚洲国产精品久久| 天堂无码| 成人福利影视| 九九九在线观看视频| 成人黄色网址| 亚洲国产精品欧美久久| 成人三级片视频| 激情五月丁香花| 牛牛无码| 精品一区二区免费视频| 亚洲高清无码中字| 三级毛片在线| 抽插免费视频| 天天超碰| 无码中文字幕在线播放| 黄片免费看视频| 日老女人逼| 久久亚洲AV| 中文字幕第一区| 91无码在线观看| 强伦轩一区二区三区四区播放方式 | 日韩ava| 午夜福利影院在线| 国产毛片18水真多18精品| 国产婷婷精品| 色优久久| 亚洲AA视频| 亚洲免费成人电影| 亚洲国产无码在线观看| 青娱乐成人在线| 免费看操片| 亚洲色图一区二区三区| 91精品视频在线播放| 久久影音先锋| 亚洲高清无码在线观看| 99精品一区| 成人a片在线免费观看| 国产人妻人伦精品1国产丝袜| 亚洲福利社| 中文字幕一级A片高清免| 2025国产在线| 红桃视频无码| 欧美又大又粗| av水果派| AV在线天堂| 欧美猛男的大鷄巴| 亚洲欧美精品AAAAAA片| 欧美色图视频在线观看| 日本熟妇无码一区二区| 日产精品久久久一区二区| 亚洲欧美日韩高清| 人妻人人澡| 不卡AV在线| 日本不卡二区| 亚洲综合一二三区| 日韩黄色视频在线观看| 色999亚洲人成色| 日韩免费三级| 亚洲成人一级片| 黄色视频网站在线观看免费| 大香蕉伊人在线观看| 91综合在线| 伊人久久大综合中文无码| 911国产在线| 亚洲精品无码免费| 国产成人精品一区| 超碰97资源| 亚洲精品高清无码| 午夜小电影| AV草逼| 福利视频中文字幕| 靠逼网站免费观看| 成人性生活片| 久久综合久久鬼| 大地二中文在线观看免费鲁大师 | 午夜无码免费| 精品国产区一区二| 热久久91| 正在播放JUQ-878木下凛凛子 | 成人午夜毛片| 黄色片在线播放| 日本色色网站免费| 91视频美女| 久久精品免费电影| 国产精品成人在线| 日本乱伦视频| 69人妻人人澡人人爽久久| 9热在线视频| 欧美又大又粗| 久久久久久亚洲Av无码精品专口 | 男女黄网站| JiZZjiZZ亚洲成熟熟妇 | 操逼日韩欧美| 国产成人午夜视频| 久久婷婷成人综合色怡春院| 特逼视频| 日本黄色视频在线观看| 无码AV高清| 亚洲黄色在线播放| 日韩一区二区三| 欧美在线色图| 免费播放片色情A片| 18成人毛片| 高潮毛片| 国产视频一区二区在线观看| av三级片在线观看| 午夜操p| 国产超级无码高清在线视频观看| 亚洲天堂视频在线播放| www.91国产| 东京热精品| 成人精品A片免费网站| 中国AV网| 亚洲国产精品午夜福利| 成人免费无码婬片在线观看免费| 四虎2025在线51| jzzijzzij亚洲成熟少妇在线观看| 久久婷婷国产麻豆91天堂| 国产无码区| 色老板在线观看| 亚洲国产av电影| 无码人妻一区二区三区在线视频不卡| 亚洲最新中文字幕| 神马午夜福利| 色婷婷激情在线| 国产黄片免费视频| 91婷婷五月天| 日韩美毛片| 国产91无码精品秘入口| 免费日本黄色| 大香蕉福利导航| 日韩高清无码成人| 午夜福利站| 免费视频91蜜桃| 亚洲国产成人精品女人久久久| 午夜性爱福利视频| 国产成人高清视频| 日韩精品成人电影| 黑人无码一二三四五区| 蜜芽成人精品久久久视频| 麻豆自拍偷拍| 五月天婷婷影院| 亚洲天堂美女| 91中文字幕在线播放| 精品九九九九| 色婷婷久久久久swag精品| 操逼网站在线看| 日韩一级无码特黄AAA片| 91嫩草欧美久久久九九九| 91精品国产一区二区三区四区大 | 影音先锋av在线资源站| 免费看黄色毛片| 国产精品99久久久久久成人| 成年人视频网站| 综综综综合网| 国产AV影片| 日韩电影中文字幕| 色色射| 狠狠色色| 91传媒在线观看| 国产aaaaaaaaaaaaa| 日韩欧美成人网站| 欧美精品久久久久久| 成人性爱自拍| 综合久久中文字幕| 午夜激情在线观看| 好看的中文字幕av| 亚洲无码123| 久久久成人网| 俺也去网av| 亚洲小说欧美激情另类A片小说| 中文字幕在线观看一区| 一级a一级a爰片免费免免中国A片| 国产精品粉嫩福利在线| 欧美午夜福利| 福利视频在线| 国产日韩一区| 色就是色欧美成人网| 国产亚洲精品午夜福利巨大软件| 午夜成人小电影| 99草自拍| 国产不卡一| 蜜桃精品在线| 52妺嘿嘿午夜福利在线| 日韩欧美操| 久草91| 日本免费A∨| 亚洲av男人天堂| 国产欧美综合在线三区| 可以免费看av的网站| 另类图片亚洲色图| 亚洲性爱大全| 欧美一区二区三区免费| 亚洲无码在线观看视频| 天天干天天天天| 嫩草国产| 成人亚洲精品一区二区三区| 99人妻在线| 在线观看欧美日韩视频| 中文字幕av一区| 91黄色电影| 一级片三级片| 狠狠躁18三区二区一区免费人 | 黄色免费观看网站| 久久精品福利| 十八禁网站在线播放| 狠狠视频| 国产精品色婷婷| 亚洲人成免费| 成人做爰免费网站2023| 老太婆擦BBBB撩BBBB| 久久国内视频| 久久秘成人久久无码| A在线视频| 久久久女女女女999久久| 内射视频在线免费观看| 国产xxxx| 亚洲vs无码秘蜜桃| 国产高清无码免费| 日韩不卡中文字幕| 操逼在线免费观看| 国产精品自拍一区| 亚洲小说区图片区都市| 国产一区二区00000视频| 国产成人亚洲综合AV婷婷| 免费黄色大片| 日本精品视频一区二区| 学生妹一级J人片内射视频| 免费肏屄| 亚洲无码视频在线看| 黄色一级生活片| 久久99人妻无码精品一区| 国产成人宗合| 东北老女人操逼| 91av在线播放| 麻豆自拍偷拍视频| 99免费视频在线观看| 丰满人妻| 香蕉久久久| 国产精品一级a毛视频| 超碰在线观看91| 国产精品欧美日韩| 日韩人妻在线观看| 国产男女无套免费| 欧美精品无码| 色久影院| 国产精品黄色电影| 好看的中文字幕av| 一级欧美| 台湾色综合| 东京热一区二区三区| 特黄一级A片| 久久综合久久鬼| 亚洲一区无码在线观看| 欧美动态视频| 99久久久久久久久久| 精品国产AⅤ麻豆| 人妻丰满熟妇| 黄片免费视频在线观看| 欧美三区四区| 色五月综合网| 亚洲Av无码午夜国产精品色软件| 人人澡人人干| 九九re精品视频在线观看| 欧美精品一二三| 蜜臀久久99精品久久久久久宅男 | 国产无套进入免费| 先锋资源一区| 亚洲中文无码第一页| 久久新视频| 亚洲91黄色片| 丰满熟妇人妻中文字幕| 亚州AV在线| 欧美日逼网站| 青娱乐A片| 国产Av一区二区三区| 99热青青| 日逼视频免费观看| 欧美成人精品欧美一级私黄| AV网站入口| 欧美日韩大片| 日韩黄色电影| 操B视频在线免费观看| 婷婷五月天小说| 高潮喷水AⅤ| 丁香五月天在线视频| 久久午夜福利视频| 99精品视频免费看| 69堂在线观看| 欧美午夜福利电影| 亚洲四房播| 亚洲一级在线观看| 免费看黄色毛片| 无码精品ThePorn| 国产精品秘ThePorn| 黄色无码网站| 狠狠2021| 爱搞逼综合网| 大香蕉日| 免费视频一区二区| 欧美熟妇BBB搡BBB| 永久免费看片视频5355| 99伊人网| 91麻豆国产视频| 免费精品视频| 99久久人妻无码中文字幕系列| 97人妻无码一区二区| 日本久久成人| 免费黄色在线| 懂色AV一区二区三区国产中文在线| 女同二人91| 中文字幕免费高清网站| 欧美18禁| 91在线视频精品| 91丨国产丨白浆| 国产三级| 国产jk在线| 欧美日韩视频免费观看| 亚洲AV高清无码| 黄色在线播放| 撸一撸成人在线做爱视频。| 国产v视频| 亚洲综合成人在线| 午夜黄色电影| 午夜av在线免费观看| 五月伊人婷婷| 韩国无码专区| 国产女人在线视频| 短发半推半就AV| 亚洲国产精品成人久久蜜臀| 久久99视频免费观看| 爱爱动态图| 99国产热| 亚洲网站免费在线观看| 久久性| 99在线看| 超碰91人人操| 四虎av| 久久久久久久无码| 国产又粗又大又爽| 亚洲成人在线视频| 欧洲成人在线视频| 亚洲高清无码视频在线播放| 日韩在线不卡| 东京热无码免费视频| 99欧美精品| 内射自拍| 亚洲黄色在线视频| 大香蕉国产在线视频| 国产AV日韩| 国产激情网站| JlZZJLZZ亚洲美女18| 亚洲成人视频在线播放| 亚洲中文字幕一区| 国产在线视频一区二区| 九九精品免费视频| 激情内射| 中文字幕乱码人妻二区三区| 日韩无码视频网站| 国产精品啪啪啪啪| 亚洲熟女一区二区三区妖精| h片在线观看免费| 国内久久婷婷| 久久视频99| 黄色视频白丝| 毛片内射| 中文无码一区二区三区| 亚洲中文字幕日韩| 韩国三级无码| 一级片在线播放| 91精品网站| 中文字幕人妻系列| www日本在线| 国产18女人水真多免费看| 免费无码在线观看| 麻豆激情| 大香蕉免费在线| 一区二区免费在线观看| 在线观看免费黄| 国产免费A片| 操B网址| 六月婷婷中文字幕| 亚洲AV成人片色在线观看高潮 | 免费看一区二区三区| 国产AV无| 欧美一级A片在免费看| 精品无码久久| 欧美成人精品欧美一级乱黄| 一本一道无码免费看视频| 日本中文视频| 免费黄色一级视频| 精品国产午夜福利| 亚洲国产高清在线观看视频| 18禁日韩| 口爆吞精在线观看| 一级黄色片免费| 成人电影综合网| 中文字幕中文字幕无码| 另类视频区| 美国操逼片| 久久精品福利| 天天撸天天操| 超碰在线观看99| 亚洲尤物在线| 国产中文字字幕乱码无限| 久久日韩视频| 亚洲情免| 欧美一级爱爱| 黄色成人视频| www.6969成人片亚洲| 91黄色视频网站| 国产性猛交╳XXX乱大交| 成人AV一AV二| 色图插插插| 国产18欠欠欠一区二区| 中文字幕成人电影| 国产成人免费在线观看| 日逼电影网| 亚洲视频免费在线播放| 欧美艹逼视频| 久久国产乱子伦精品免费午夜... 国产毛片精品一区二区色欲黄A片 | 日本色色网| 日韩精品一二三区| 日本一本不卡| 熟女少妇一区二区三区| 国产粉嫩在线观看| eeuss在线| 日韩精品中文无码| 欧美a片在线看| 热久久在线| 丁香激情视频| 亚洲日韩中文无码| 久操伊人大香蕉| 日韩东京热中文字幕| 超碰人人在线| 99精品视频免费观看| 偷拍三区| 丁香六月| 亚洲天堂自拍| 国产啊啊啊| 一区二区三区不卡视频| 国产成人视频在线| 国产精品成人无码免费| 免费看一级一级人妻片| 日本AⅤ在线| 大香蕉三级片| 成人做爰A片AAA毛真人| 国产高清免费无码| 暖暖日本在线| 搡老熟女-91Porn| 欧美国产一区二区| 亚洲性爱在线视频| 亚洲综合在线观看视频| 69福利网| 四虎成人免费视频| 国产香蕉av| 北条麻妃中文字幕在线观看| 理论片91| 91香蕉国产在线观看软件| 国产精品欧美精品| 日本熟妇一区二区三区| 国产嫩草精品A88AV| 丰满熟妇| 欧美操逼视频网站| 久久无码高清视频| 奇米AV| 中文字幕有码视频| 日韩不卡在线| 亚洲第一中文字幕网| 久草网大香蕉| 在线看片国产| 男女一区| 一级黄色电影免费在线观看| 精品人妻一区二区免费蜜桃| 色综合大香蕉| 成人精品一区二区区别解析| 刘玥无码| 色婷婷色99国产综合精品| 俄女兵一级婬片A片| 嫩BBB搡BBB搡BBB搡| 91无码人妻传媒tv| 亚洲字幕在线播放| 婷婷五月在线播放| 成人免费无码激情AV片| 亚洲第一成网站| 中文字幕成人网站| 亚洲人成小说| 亚洲五月天在线| 日韩人妻一区| 伊人成人在线观看| a级黄色视频免费观看| 日韩在线高清视频| 福利视频在线| 三级成人在线| 亚洲视频欧美视频| 高清无码波多野结衣| 日韩精品久久久久久久| 91人妻无码| 艹b视频在线观看| 91AV天天在线观看| 久色婷婷| 色综合天天综合成人网| 成人爽a毛片一区二区免费| 影音先锋aV成人无码电影| 日本高清版色视频| 国产地址| 成人网站在线看。| 日韩有码在线观看| 丁香五月天视频| 操你久久| 亚洲天堂女人| 午夜福利电影网| 久久丝袜视频| 91站街农村熟女露脸| 黄色大片AV| 成年人免费公开视频| 波多野吉衣高清无码| 亚洲无码AV在线播放| 东京热综合网| 国产一级影院| 骚逼久久| 日本内射在线观看| 91免费观看视频| 伊人精品大香蕉| 日本啪啪网站| 国产精品无码天天爽视频| 中日韩欧美一级A片免费| 最新av资源| 九九九视频在线观看| 豆花视频成人版www满18| 黄片免费观看网站| 91AV视频| 精品无码不卡| 欧美黄片一区| 国产精品久久久久永久免费看| 国产成人精品a区在线观看| 色视频免费观看| 美女91视频网站| 欧美干| 大荫蒂精品另类| 亚洲无码在线视频观看| 91综合视频| 欧美成人性色欲影院| 国产乱子伦无码视频免费| 成人精品国产| 亚洲福利女神成人福利| 久久精品视频免费看| 国产日韩欧美一区| 亚洲中文字幕第一页| 日本大香蕉在线视频| 9l视频自拍蝌蚪9l成人| 99乱伦| 国产无码乱伦内射| 国产高清久久| 狠狠久| 无码毛片在线观看| 无码中文字幕在线视频| 亚洲AV无码专区一级婬片毛片| 大香蕉尹人在线视频| 青娱乐成人在线| 欧美一级片在线观看| 免费一级A| 午夜性爱AV| 亚洲综合无码| 人成在线观看| 超碰在线国产| 欧美色色影院| 久久香蕉网站| 免费视频| 十八禁网站在线| 日韩一区二区三区精品| 中文字幕在线观看免费高清完整版在线观看 | 91看片看婬黄大片女跟女| 97在线免费视频| 日韩操比视频| 91在线免费视频观看| 极品美女援交在线| 91人妻日韩人妻无码| 国产AV无码成人精品毛片| 在线91网站| 偷拍欧美日韩| 久久91av| 中文字幕在线不卡视频| 亚洲高清免费| 男人操女人免费网站| 亚洲成人精品在线观看| 国产aaaaaaaaaaaaa| 亚洲精品人妻在线| 天天干天天撸影视| av777777| 成人网站在线免费观看| 亚洲无码AV一区二区| 亚洲中文字| 高清无码在线免费视频| 精品婷婷| www.jiujiujiu| 护士小雪的yin荡高日记H视频| 欧美日韩中文在线视频| 欧美又粗又大| 91精品国产闺蜜国产在线闺蜜 | 国产成人精品三级麻豆| 男人的天堂色琪琪| 久久免费视频精品| 午夜日屄| av网站免费观看| 白丝自慰网站| 一级黄色网| 国产精品aaa| 大香蕉超碰在线| 亚洲精品三级在线观看| 被黑人猛躁10次高潮视频| 男女高清无码| 中文字幕免费高清网站| 亚洲欧美激情视频| eeuss国产| 专肏老妇人大逼| 67194熟女| 丁香六月婷| 无码精品人妻一区二区三刘亦菲| 中文字幕乱码视频| 欧洲一级片| 99色婷婷| 人人操超碰| 五月天久久| 成人A电影| av无码中文| 91麻豆成人精品国产| 小黄片网站| 爱爱综合| 欲色av| 色噜噜狠狠一区二区三区牛牛影视| 午夜无码在线观看视频| 国产无遮挡| 免费看V片| 一个色综合网| 国产网站精品| 欧美日韩视频| 91超碰人人操| 干妞网免费视频| 日韩综合精品中文字幕66| 国产网站精品| 91乱伦| av在线直播| 亚洲精品在线观看免费| 激情婷婷五月| 熟女人妻ThePorn| 乱子伦一区二区三区视频在线观看 | 人妻北条麻妃在线| www.91麻豆| 天天爽天天摸| 99re2| 91国产爽黄在线| 在线香蕉| 懂色成人视频在线观看| 18国产免费视频在线观看| 国产午夜精品一区二区三区嫩A| 成人网站在线免费观看| 学生妹一级片| 亚洲AV成人片色在线观看高潮 | 国精品91无码一区二区三区在线 | 精品国产成人a在线观看| 福利视频免费观看| a片在线免费观看| 男女拍拍免费视频| 在线免费看A| 狠狠干综合| 自拍三级片| 免费在线亚洲| 欧美精品久久久久久久久爆乳| 丁香婷婷一区二区三区| 成人不卡视频| 日韩毛片在线视频x| 免费无码国产在线观看快色| 日韩大香蕉网| 东京热一级片| 国产免费黄色| 夜夜高潮夜夜爽| 国产成人精品一区二区三区视频 | 亚洲av综合在线| 乱伦五月天| 国产成人无码免费看片| 色福利视频| 天天欧美| 亚洲色情网站| 中文字幕高清在线| 欧美生活片18| 99成人电影| 无码人妻一区二区三区| 亚洲无码观看视频| 伊人久久成人| 西西www444无码大胆| 99re视频在线观看| 学生妹一级片| 在线观看www视频| 无码国精品一区二区免费蜜桃| 欧美日韩在线观看视频| 欧美午夜福利电影| 国产男女视频| 99精品在线播放| 激情视频免费看| 韩日一级片| 国产成人av网站| 围内精品久久久久久久久久‘变脸| 国产主播一区二区| 午夜无码鲁丝片午夜精品一区二区 | 国产精品美女毛片真酒店| 日本三级黄色| 亚洲AⅤ无码一区二区波多野按摩 69国产成人综合久久精品欧美 | 尤物视频在线| 9热在线视频| 国产小视频在线看| 91黄在线观看| 欧美手机在线| 欧美成人黄色| 麻豆成人精品国产免费| 欧美日韩在线观看中文字幕| 黄片视频链接| 日韩无码第一页| 成人精品久久久| 91午夜视频| 41ts午夜福利| 精品999999| 四虎亚洲| 豆花视频成人网站入口| A∨无码免费| 91精品婷婷国产综合久久竹菊| 夜色福利视频| 黄片网页| 蜜桃视频在线观看视频| 怡春院在线视频| 男人天堂网av| 草碰在线视频| 久久精品水多多www| 台湾无码| 久久久网站| 一级片无码| 丝袜美腿亚洲综合| 色拍拍视频| 青娱乐偷拍视频| 91香蕉在线视频| 婷婷成人视频| 国产日B| 青娱乐成人在线视频| 五月天激情综合| 黄色片免费视频网站| av拍拍| 久久人人操| 中文字幕av在线观看| 国产传媒在线观看| 波多野吉衣毛片| 黄色日逼片| 欧美一区二区三曲的| caopor在线| 亚洲美女一区| 青青草免费观看视频| 天天超碰| 国产精品欧美综合| 成人免费黄色视频| 特黄AAAAAAAAA真人毛片| 精品无码视频在线| 国产91白丝在线播放| 一级A片黄色| 色欲av网站| 伊人大香在线| 日韩欧美在线一区| 欧美狠狠插| 免费黄色a片| 久久黄色视屏| 亚洲精品国产精品国自产A片同性| 草草草视频| 天堂中文在线播放| 三级成人视频| 无码做爱视频| 国产精品天天狠天天看| 国产美女一区| 一级a免一级a做片免费| 午夜性爱视频| 男人的天堂在线播放| av777777| 日本狠狠操| jizzjizz欧美|