最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

細(xì)數(shù)java中Long與Integer比較容易犯的錯(cuò)誤總結(jié)

 更新時(shí)間:2017年01月22日 10:02:14   投稿:jingxian  
下面小編就為大家?guī)?lái)一篇細(xì)數(shù)java中Long與Integer比較容易犯的錯(cuò)誤總結(jié)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

今天使用findbugs掃描項(xiàng)目后發(fā)現(xiàn)很多高危漏洞,其中非常常見(jiàn)的一個(gè)是比較兩個(gè)Long或Integer時(shí)直接使用的==來(lái)比較。 其實(shí)這樣是錯(cuò)誤的。

因?yàn)長(zhǎng)ong與Ineger都是包裝類型,是對(duì)象。 而不是普通類型long與int , 所以它們?cè)诒容^時(shí)必須都應(yīng)該用equals,或者先使用longValue()或intValue()方法來(lái)得到他們的基本類型的值然后使用==比較也是可以的。

但是有一種特殊情況, 其實(shí)Long與Integer都將 -128~127 這些對(duì)象緩存了。 可以看看Long類型源碼里面有一個(gè)LongCache類,代碼如下:

private static class LongCache {
 private LongCache(){}

 static final Long cache[] = new Long[-(-128) + 127 + 1];

 static {
   for(int i = 0; i < cache.length; i++)
 cache[i] = new Long(i - 128);
 }
  }

先看看這個(gè)例子:

public class Test05 {

  public static void main(String[] args) {
    Long a = 5L;
    Long b = 5L;

    System.out.println("a == b ? " + (a == b));

    Long c = 129L;
    Long d = 129L;
    System.out.println("c == d ? " + (c == d));
  }
}

打印的結(jié)果是:

a == b ? true
c == d ? false


原因

首先來(lái)看看 Long a = 5L ; 它是如何將一個(gè)基本類型long包裝成一個(gè)對(duì)象Long的 。

可以寫(xiě)一個(gè)測(cè)試類,然后反編譯一下,看看java它是如何解析Long a = 5L這樣一條命令的 。

測(cè)試類如下:

public class Test06 {
  Long l = 3L;
}

然后使用javap -verbose Test06 就能看到反編譯的結(jié)果了, 下面是輸出的部分:

{
java.lang.Long l;

public com.spring.test.Test06();
 Code:
  Stack=3, Locals=1, Args_size=1
  0:  aload_0
  1:  invokespecial  #10; //Method java/lang/Object."<init>":()V
  4:  aload_0
  5:  ldc2_w #12; //long 3l
  8:  invokestatic  #14; //Method java/lang/Long.valueOf:(J)Ljava/lang/Long;
  11: putfield    #20; //Field l:Ljava/lang/Long;
  14: return
 LineNumberTable:
  line 3: 0
  line 5: 4
  line 3: 14

 LocalVariableTable:
  Start Length Slot Name  Signature
  0   15   0  this    Lcom/spring/test/Test06;


}

從Code中的8可以看出調(diào)用了Long的一個(gè)類方法Long.valueOf(Long) , 所以可以得到的結(jié)論是Long a = 5L實(shí)際上等于 Long a = Long.valueOf(5) ;

然后再看看Long.valueOf()方法是如何定義的:

 public static Long valueOf(long l) {
 final int offset = 128;
 if (l >= -128 && l <= 127) { // will cache
   return LongCache.cache[(int)l + offset];
 }
    return new Long(l);
  }

一目了然,會(huì)先判斷基本類型的值如果在-128~127之間,就會(huì)直接從LongCache里面取出緩存的對(duì)象返回,否則就new一個(gè)新的Long對(duì)象返回 。

現(xiàn)在就不難理解Test05程序執(zhí)行得到的結(jié)果了,因?yàn)閍與b等于5,在-127~128之內(nèi),所以都是直接從LongCache里面返回的一個(gè)Long對(duì)象,所以他們?cè)谑褂?=比較的時(shí)候,就是相等的(對(duì)于對(duì)象類型來(lái)說(shuō),==比較的是兩個(gè)對(duì)象的引用指向堆中的地址) ,而c與d等于129,不在-127~128之間,所以他們他們是分別new出來(lái)的兩個(gè)新的Long對(duì)象,使用==來(lái)比較自然是不相等的了。

Long重寫(xiě)了equals方法:

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

它是先通過(guò).longValue()方法獲取Long對(duì)象的基本類型long的值之后再做比較的。

所以對(duì)于Integer與Long的比較,最好是使用equals來(lái)比較才能確保得到我們想要的結(jié)果。

Integer與Long一樣,這里就不舉例了。

以上這篇細(xì)數(shù)java中Long與Integer比較容易犯的錯(cuò)誤總結(jié)就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Java版仿QQ驗(yàn)證碼風(fēng)格圖片驗(yàn)證碼

    Java版仿QQ驗(yàn)證碼風(fēng)格圖片驗(yàn)證碼

    這篇文章主要為大家分享了java圖片驗(yàn)證碼實(shí)例代碼,感興趣的小伙伴們可以參考一下
    2016-04-04
  • java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

    java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼

    這篇文章主要介紹了java實(shí)現(xiàn)釘釘機(jī)器人消息推送的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • Java中Spring擴(kuò)展點(diǎn)詳解

    Java中Spring擴(kuò)展點(diǎn)詳解

    這篇文章主要介紹了Java中Spring技巧之?dāng)U展點(diǎn)的應(yīng)用,下文Spring容器的啟動(dòng)流程圖展開(kāi)其內(nèi)容的相關(guān)資料,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • @Conditional注解的使用場(chǎng)景和源碼解析

    @Conditional注解的使用場(chǎng)景和源碼解析

    這篇文章主要介紹了@Conditional注解的使用場(chǎng)景和源碼解析,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,如果滿足條件,則將Bean注冊(cè)進(jìn)IOC中,如果不滿足條件,則不進(jìn)行注冊(cè),需要的朋友可以參考下
    2023-11-11
  • 6種SpringBoot中自定義starter的方式介紹

    6種SpringBoot中自定義starter的方式介紹

    在SpringBoot生態(tài)中,starter是一種特殊的依賴,它能夠自動(dòng)裝配相關(guān)組件,簡(jiǎn)化項(xiàng)目配置,本文將詳細(xì)介紹6種不同的自定義starter開(kāi)發(fā)方法,有需要的可以了解下
    2025-04-04
  • SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合)

    SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合)

    本篇文章主要介紹了SpringMVC之簡(jiǎn)單的增刪改查示例(SSM整合),這個(gè)例子是基于SpringMVC+Spring+Mybatis實(shí)現(xiàn)的。有興趣的可以了解一下。
    2017-03-03
  • SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn)

    SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn)

    本文主要介紹了SpringBoot指標(biāo)監(jiān)控的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • SpringBoot實(shí)現(xiàn)多租戶架構(gòu)

    SpringBoot實(shí)現(xiàn)多租戶架構(gòu)

    在SpringBoot中可以通過(guò)多數(shù)據(jù)源和動(dòng)態(tài)路由來(lái)實(shí)現(xiàn)多租戶機(jī)制,本文主要介紹了SpringBoot實(shí)現(xiàn)多租戶架構(gòu),具有一定的參考價(jià)值,感興趣的可以里哦啊接一下
    2024-03-03
  • Java JDK11的下載與安裝教程

    Java JDK11的下載與安裝教程

    這篇文章主要介紹了Java JDK11的下載與安裝,本文以win10為例給大家講解win10系統(tǒng)下載安裝jdk11的教程,需要的朋友可以參考下
    2023-05-05
  • SpringBoot的ResponseEntity類返回給前端具體講解

    SpringBoot的ResponseEntity類返回給前端具體講解

    這篇文章主要給大家介紹了關(guān)于SpringBoot的ResponseEntity類返回給前端的相關(guān)資料,ResponseEntity是Spring框架中用于封裝HTTP響應(yīng)的類,可以自定義狀態(tài)碼、響應(yīng)頭和響應(yīng)體,常用于控制器方法中返回特定數(shù)據(jù)的HTTP響應(yīng),需要的朋友可以參考下
    2024-11-11

最新評(píng)論

昂仁县| 涞源县| 屏东县| 余干县| 彭泽县| 新建县| 安远县| 太保市| 保康县| 丽江市| 辽源市| 冕宁县| 贵定县| 湟中县| 崇礼县| 陆河县| 定西市| 广德县| 马山县| 嘉义县| 大安市| 盘锦市| 湘阴县| 信阳市| 永州市| 龙泉市| 秭归县| 榆中县| 综艺| 朝阳市| 桓台县| 保德县| 平阳县| 吴堡县| 诸暨市| 确山县| 湘潭市| 绥阳县| 康保县| 正阳县| 邳州市|