成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

好用的java.util.Objects類

heartFollower / 3295人閱讀

摘要:好用的類在中,新增了一個(gè)工具類,就是類。事實(shí)上,我們進(jìn)行比較的對(duì)象,除了引用對(duì)象之外,就是自動(dòng)裝箱后等類型了。我們?cè)谥貙?xiě)時(shí),可以參考上面的類的寫(xiě)法。

好用的java.util.Objects

在jdk1.7中,新增了一個(gè)工具類,就是java.util.Objects類。它有3個(gè)簡(jiǎn)單的封裝方法,對(duì)于平常的使用來(lái)說(shuō)挺有用的,分別是:hashCode、equals、toString這3個(gè)方法。

1、hashcode生成
// 1. Objects.hash(Object... values)
public static int hash(Object... values) {
    return Arrays.hashCode(values);
}

// 2. Arrays.hashCode(Object a[])
public static int hashCode(Object a[]) {
  if (a == null)
    return 0;

  int result = 1;

  for (Object element : a)
    result = 31 * result + (element == null ? 0 : element.hashCode());

  return result;
}

// 3. Object.hashCode()
public native int hashCode();

首先,Objects的hash方法接收可變參數(shù),可變參數(shù)的內(nèi)部是一個(gè)數(shù)組。然后內(nèi)部調(diào)用Arrays的hashCode方法,我們來(lái)看一下其方法:核心是遍歷每一個(gè)參數(shù)來(lái)計(jì)算result值,在計(jì)算的過(guò)程中,每一個(gè)參數(shù)上轉(zhuǎn)型為Object使用hashCode來(lái)生成隨機(jī)值。那么Object的hashCode又是什么?這是一個(gè)本地方法,源碼不給出實(shí)現(xiàn),其數(shù)值和對(duì)象的內(nèi)存地址有關(guān)。

參數(shù)雖然上轉(zhuǎn)型為Object,但是對(duì)于String、Integer等對(duì)象類型,它們都重寫(xiě)了hashCode方法。

因?yàn)槭腔趦?nèi)存地址的生成,所以不同對(duì)象生成的hashcode值沖突的幾率是很小的。

2、對(duì)象equals比較
// 1. Objects.equals(Object a, Object b)
public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

// 2. Object.equals(Object obj)
public boolean equals(Object obj) {
  return (this == obj);
}

首先是對(duì)象的引用判斷,其次就是調(diào)用對(duì)象自身的equals方法來(lái)比較,如果對(duì)象類型沒(méi)有重寫(xiě)equals的話,就會(huì)調(diào)用Object的equals方法(仍然是對(duì)象的引用比較)。

事實(shí)上,我們進(jìn)行equals比較的對(duì)象,除了引用對(duì)象之外,就是String、Integer(自動(dòng)裝箱后)等類型了。

對(duì)于String,直接進(jìn)行引用比較。而對(duì)于Integer、Double等對(duì)象類型,它們都重寫(xiě)了equals方法,貼出Integer的equals方法:

public boolean equals(Object obj) {
  if (obj instanceof Integer) {
      return value == ((Integer)obj).intValue();
  }
    return false;
}

可以看到,內(nèi)部是進(jìn)行值相等判斷。

hashCode與equals方法的重要性

對(duì)于散列結(jié)構(gòu)(hash)的集合類型,比如說(shuō)HashMap、HashSet等,如果我們用它們來(lái)存儲(chǔ)我們自定義的對(duì)象,那么我們就必要重寫(xiě)類的hashCode與equals方法。為什么要重寫(xiě),這個(gè)原因就不贅述了。 還有Set集合類,由于它存儲(chǔ)不重復(fù)的元素。

下面我們給出利用Objects工具類的一種較為簡(jiǎn)單實(shí)用的重寫(xiě)方式:

public class Building {

    private String name;
    private double area;

    @Override
    public int hashCode() {
        return Objects.hash(name, area);
    }

    @Override
    public boolean equals(Object obj) {
          // 引用相等判斷
        if (obj == this) {
            return true;
        }
          // 類型判斷
        if (!(obj instanceof Building)) {
            return false;
        }
        Building building = (Building) obj;
          // 關(guān)鍵域相等判斷
        // 基本類型不要用用Objects.equals()方法,會(huì)自動(dòng)裝箱帶來(lái)額外開(kāi)銷(xiāo)
        return Objects.equals(name, building.name) && (area == building.area);
    }

    @Override
    public String toString() {
        return Objects.toString("name = " + name, "name is undefined") + ", "
                + Objects.toString("area = " + area, "area is undefined");
    }

      // setter、getter
}
3、toString

我們自己重寫(xiě)toString方法時(shí),有一點(diǎn)比較難寫(xiě),就是默認(rèn)值設(shè)置。

// Objects.toString(Object o, String nullDefault)
public static String toString(Object o, String nullDefault) {
    return (o != null) ? o.toString() : nullDefault;
}

// Objects.toStirng(Object 0)
public static String toString(Object o) {
  return String.valueOf(o);
}

我們?cè)谥貙?xiě)toString時(shí),可以參考上面的Building類的寫(xiě)法。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/76704.html

相關(guān)文章

  • 一些我認(rèn)為有用有趣JDK方法

    摘要:在學(xué)習(xí)的源碼過(guò)程中我遇到了一些有趣有用的方法,在此之前如果要使用這些工具方法,我首先會(huì)想到的是和這樣的語(yǔ)言擴(kuò)展包,但現(xiàn)在如果是寫(xiě)一些,使用原生即可達(dá)到目的。 在學(xué)習(xí)JDK的源碼過(guò)程中我遇到了一些有趣有用的方法,在此之前如果要使用這些工具方法,我首先會(huì)想到的是commons-lang和guava這樣的語(yǔ)言擴(kuò)展包,但現(xiàn)在如果是寫(xiě)一些demo,使用原生即可達(dá)到目的。當(dāng)然我們也不能否認(rèn)它們的作...

    lx1036 評(píng)論0 收藏0
  • 慕課網(wǎng)_《Java微信公眾號(hào)開(kāi)發(fā)進(jìn)階》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期六說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章概述課程簡(jiǎn)介本課程是在之前的初識(shí)微信公眾號(hào)開(kāi)發(fā)課程基礎(chǔ)之上的。慕課網(wǎng)課程涵蓋前端開(kāi)發(fā)等前沿技術(shù)語(yǔ)言,包括基礎(chǔ)課程實(shí)用案例高級(jí)分享三大類型,適合不同階段的學(xué)習(xí)人群。 時(shí)間:2017年08月12日星期六說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:http://img.m...

    Freelander 評(píng)論0 收藏0
  • java常見(jiàn)API第二部分

    摘要:類是日期時(shí)間格式化子類的抽象類,我們通過(guò)這個(gè)類可以幫我們完成日期和文本之間的轉(zhuǎn)換也就是可以在對(duì)象與對(duì)象之間進(jìn)行來(lái)回轉(zhuǎn)換。構(gòu)造方法由于為抽象類,不能直接使用,所以需要常用的子類。 day01【Object類、常用API】 主要內(nèi)容 Object類 Date類 DateFormat類 Calendar類 System類 StringBuilder類 包裝類 教學(xué)目標(biāo) -[ ] 能夠說(shuō)出...

    maybe_009 評(píng)論0 收藏0
  • 慕課網(wǎng)_《模式秘密之觀察者模式》學(xué)習(xí)總結(jié)

    摘要:時(shí)間年月日星期二說(shuō)明本文部分內(nèi)容均來(lái)自慕課網(wǎng)。慕課網(wǎng)教學(xué)源碼學(xué)習(xí)源碼第一章觀察者模式概述課程簡(jiǎn)介觀察者模式的定義定義對(duì)象間的一種一對(duì)多的依賴關(guān)系。 時(shí)間:2017年08月29日星期二說(shuō)明:本文部分內(nèi)容均來(lái)自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)源碼:https://github.com/zccodere/s...學(xué)習(xí)源碼:https://github.com/z...

    iKcamp 評(píng)論0 收藏0
  • Map學(xué)習(xí)二之HashMap唯一性解釋

    摘要:存儲(chǔ)自定義類型鍵值集合保證是唯一的作為的元素必須重寫(xiě)方法和方法以保證唯一存儲(chǔ)自定義類型鍵值類型類就必須重寫(xiě)方法和方法以保證唯一類型可以重復(fù)創(chuàng)建集合往集合中添加元素女王英國(guó)秦始皇秦國(guó)普京俄羅斯女王毛里求斯使用和增強(qiáng)遍歷集合存儲(chǔ)自定義類型鍵 package com.itheima.demo02.Map; import java.util.HashMap;import java.util.M...

    douzifly 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

heartFollower

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<