Java中值类型和引用类型的比较与问题解决
创始人
2024-12-24 13:41:20
0次

一、问题描述

前几天因为一个需求出现了Bug。说高级点也挺高级,说白点也很简单。其实也就是一个很简单的Java基础入门时候的值类型和引用类型的区别。只是开发的时候由于自己的问题,导致小问题的出现。还好突然想起来以前看过一篇对于该问题讲解的博客,才能快速定位问题的位置。防止下次再犯,顺便也就把这个当做笔记记录下来,放入自己的Bug集中。

二、值类型和引用类型的比较

这个大家应该都是没问题的,很简单。值类型比较是比较值,引用类型是比较地址。对于正常的操作来说,比较值类型我们可以直接使用 == ,引用类型就使用equals来做比较就不会出现问题。

引用类型

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

上面的测试结果很明显是true,绝对没有问题的。

值类型

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

上面的测试结果很明显是true,绝对没有问题的。

三、问题

但是问题就出现在,开发的使用为了防止出现为null的时候会被系统使用0来代替,所以就使用了Integer类型来做操作,并且在比较的时候用了 == 。这就很尴尬了,开始自测完全没出现问题,因为没到达记录数。很开心,把代码提交下班,妥妥的。但是尴尬的事情来了,测试报告出现在了邮箱里面了。

初始没问题的情况

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

结果:

当记录超过一定数的时候,出现问题

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

结果:

四、解决

后面一想,很快确定问题了。是自己的马虎,偷懒使用了 == ,造成这次问题的出现,当改为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() {

    } 

 }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...