温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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