中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中值類型和引用類型比較的示例分析

發布時間:2021-08-04 10:22:49 來源:億速云 閱讀:128 作者:小新 欄目:編程語言

小編給大家分享一下Java中值類型和引用類型比較的示例分析,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

值類型和引用類型的比較

這個大家應該都是沒問題的,很簡單。值類型比較是比較值,引用類型是比較地址。對于正常的操作來說,比較值類型我們可以直接使用 == ,引用類型就使用equals來做比較就不會出現問題。

引用類型

/**
  * 測試Integer
  */
 public static void test_Integer(){
  Integer number_01 = 10;
  Integer number_02 = 10;
  System.out.println(number_01.equals(number_02));
 }

上面的測試結果很明顯是true,絕對沒有問題的。

Java中值類型和引用類型比較的示例分析  

值類型

/**
  * 測試int
  */
 public static void test_Int(){
  int number_01 = 10;
  int number_02 = 10;
  System.out.println(number_01 == number_02);
 }

上面的測試結果很明顯是true,絕對沒有問題的。

Java中值類型和引用類型比較的示例分析

問題

但是問題就出現在,開發的使用為了防止出現為null的時候會被系統使用0來代替,所以就使用了Integer類型來做操作,并且在比較的時候用了 == 。這就很尷尬了,開始自測完全沒出現問題,因為沒到達記錄數。很開心,把代碼提交下班,妥妥的。但是尷尬的事情來了,測試報告出現在了郵箱里面了。

初始沒問題的情況

/**
  * 測試Integer
  */
 public static void test_Integer(){
  Integer number_001 = 10;
  Integer number_002 = 10;
  System.out.println(number_001 == number_002);
 }

結果:

Java中值類型和引用類型比較的示例分析

當記錄超過一定數的時候,出現問題

/**
  * 測試Integer
  */
 public static void test_Integer(){
  Integer number_001 = 128;
  Integer number_002 = 128;
  System.out.println(number_001 == number_002);
 }

結果:

Java中值類型和引用類型比較的示例分析

解決

后面一想,很快確定問題了。是自己的馬虎,偷懶使用了 == ,造成這次問題的出現,當改為equals就可以妥妥的回家了。開始自測沒問題主要還是因為Integer 的緩存搞的事情。扒拉到Integer的源碼,發現里面用了緩存機制,對-128~127的值做了緩存,如果在這個值區間內使用==來做比較的話,比較的就是值了,所以才造成開始以為沒問題,后面運行了一段時間后就出現問題了。當不在值區間內就必須使用equals來完成比較。

private static class IntegerCache {
    static final int low = -128;
    static final int high;
    static final Integer cache[];

    static {
      // high value may be configured by property
      int h = 127;
      String integerCacheHighPropValue =
        sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
      if (integerCacheHighPropValue != null) {
        try {
          int i = parseInt(integerCacheHighPropValue);
          i = Math.max(i, 127);
          // Maximum array size is Integer.MAX_VALUE
          h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
        } catch( NumberFormatException nfe) {
          // If the property cannot be parsed into an int, ignore it.
        }
      }
      high = h;

      cache = new Integer[(high - low) + 1];
      int j = low;
      for(int k = 0; k < cache.length; k++)
        cache[k] = new Integer(j++);

      // range [-128, 127] must be interned (JLS7 5.1.7)
      assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

以上是“Java中值類型和引用類型比較的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

厦门市| 道真| 东莞市| 三穗县| 靖州| 宜宾市| 祁东县| 全椒县| 中超| 隆子县| 开封县| 吕梁市| 马龙县| 丽水市| 临夏县| 阳城县| 北海市| 祥云县| 襄垣县| 葫芦岛市| 得荣县| 庄浪县| 阿克陶县| 同江市| 大悟县| 青铜峡市| 苍南县| 德安县| 汝城县| 长泰县| 丹阳市| 利津县| 滕州市| 浦东新区| 南汇区| 体育| 县级市| 巴中市| 沾益县| 和龙市| 南和县|