Java的值类型和引用类型

1、问题描述

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

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

  这个你们应该都是没问题的,很简单。值类型比较是比较值,引用类型是比较地址。对于正常的操做来讲,比较值类型咱们能够直接使用 == ,引用类型就使用equals来作比较就不会出现问题。面试

引用类型 

1     /**
2  * 测试Integer 3      */
4     public static void test_Integer(){ 5         Integer number_01 = 10; 6         Integer number_02 = 10; 7  System.out.println(number_01.equals(number_02)); 8     }

 

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

                                                                  

 

值类型

1     /**
2  * 测试int 3      */
4     public static void test_Int(){ 5         int number_01 = 10; 6         int number_02 = 10; 7         System.out.println(number_01 == number_02); 8     }

 

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

                                                                    

3、问题

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

初始没问题的状况

1     /**
2  * 测试Integer 3      */
4     public static void test_Integer(){ 5         Integer number_001 = 10; 6         Integer number_002 = 10; 7         System.out.println(number_001 == number_002); 8     }

 

结果:3d

                                                                     

 

 

 

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

1     /**
2  * 测试Integer 3      */
4     public static void test_Integer(){ 5         Integer number_001 = 128; 6         Integer number_002 = 128; 7         System.out.println(number_001 == number_002); 8     }

 

结果:日志

                                                                    

4、解决

后面一想,很快肯定问题了。是本身的马虎,偷懒使用了 == ,形成此次问题的出现,当改成equals就能够妥妥的回家了。开始自测没问题主要仍是由于Integer 的缓存搞的事情。扒拉到Integer的源码,发现里面用了缓存机制,对-128~127的值作了缓存,若是在这个值区间内使用==来作比较的话,比较的就是值了,因此才形成开始觉得没问题,后面运行了一段时间后就出现问题了。当不在值区间内就必须使用equals来完成比较。code

 1 private static class IntegerCache {  2         static final int low = -128;  3         static final int high;  4         static final Integer cache[];  5 
 6         static {  7             // high value may be configured by property
 8             int h = 127;  9             String integerCacheHighPropValue =
10                 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); 11             if (integerCacheHighPropValue != null) { 12                 try { 13                     int i = parseInt(integerCacheHighPropValue); 14                     i = Math.max(i, 127); 15                     // Maximum array size is Integer.MAX_VALUE
16                     h = Math.min(i, Integer.MAX_VALUE - (-low) -1); 17                 } catch( NumberFormatException nfe) { 18                     // If the property cannot be parsed into an int, ignore it.
19  } 20  } 21             high = h; 22 
23             cache = new Integer[(high - low) + 1]; 24             int j = low; 25             for(int k = 0; k < cache.length; k++) 26                 cache[k] = new Integer(j++); 27 
28             // range [-128, 127] must be interned (JLS7 5.1.7)
29             assert IntegerCache.high >= 127; 30  } 31 
32         private IntegerCache() {} 33     }

 

5、总结

当初面试的时候这种东西应该是背的倒背如流,绝对能够应对面试。可是一旦开发起来就是各类问题都出现了,并且这种东西还不会报出错日志,纯属开发问题。归总来讲仍是本身的水平不够,还须要继续提升。下次要防止这种低级问题的出现,很尴尬。一样也是对本身学的东西要融汇贯通,而不是每学一个单独的知识点就够了,没有起到联通的效果。源码扒拉一下仍是会加深本身的印象。orm

相关文章
相关标签/搜索