java入门包装类-Integer
来源:互联网 发布:淘宝日本人占多少股份 编辑:程序博客网 时间:2024/05/16 17:21
package day10_9;public class IntegerDemo { public static void main(String[] args) { Integer i3 = 100; Integer i4 = 100; System.out.println(i3==i4); Integer i5 =1000; Integer i6 =1000; System.out.println(i5 == i6); }}
以上代码运行结果为:
truefalse
对于上面的结果是比较意外的,对于以上java文件编译生成的class文件进行反编译得到以下代码
public class IntegerDemo { public static void main(String[] args) { Integer i3 = Integer.valueOf(100); Integer i4 = Integer.valueOf(100); System.out.println(i3==i4); Integer i5 =Integer.valueOf(1000); Integer i6 =Integer.valueOf(1000); System.out.println(i5 == i6); }}
这里我们可以看到对于Integer的对象在初始化时会调用Integer的valueOf方法。那么valueOf方法是如何实现的,我们先看看下面的代码
public static Integer valueOf(int i) { if(i>= IntegerCache.Low && i<=IntegerCache.high) { return IntegerCache.cache[i+(-IntegerCache.Low)]; return new Interger(i); }}
我们可以看到,如果我们初始化的值i在IntegerCache.Low和IntegerCache.high之间的话,此时返回的是一IntegerCache方法中cache数组中的已有的数值,如果初始化的值不在IntegerCache.Low和IntegerCache.high中的话,那么就会在堆内存中开辟新的内存,而此时i5或者i6指向的就是新开辟内存的地址。现在我们看看IntegerCache方法
private static class IntergerCache{ static final int Low = -128; static final int high; static final Integer cache[]; /*static { int h = 127; String integerCacheHighProValue = sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high"); if(integerCacheHighProperty != null) { try { int i = parseInt(integerCacheHighProperty); i = Math.max(i, 127); h = Math.min(i, Integer.MAX_VALUE-(-Low)-1); } catch(NumberFormatException nfe) { } }*/这一块代码表示很明白 cache = new Integer[(high-Low)+1]; int j = Low; for(int k = 0;k<cache.length;k++) { cache[k] = new Integer(j++); } assert IntegerCache.high>=127; }}
根据知乎的清浅池塘的理解就是当我们初始化的值在-128到127之间,如果第一个对象如i3的初始化为100,i4此时的初始化也为100,因此,i4这个 对象就不会新开辟一个内存空间,这样一来,i3和i4指向的就是同一个内存地址,因此在用i3==i4比较时返回的是true,而i5和i6因为初始化值超过了127,因此属于i5和i6的指向的内存地址是不一样的。
再看下面的代码
public class IntegerDemo { public static void main(String[] args) { Integer i3 = 100; Integer i4 = 100; System.out.println(i3.equals(i4)); Integer i5 =100000000; Integer i6 =100000000; System.out.println(i5.equals( i6)); }}
我们这里使用的是equals(object obj)方法,此时比较的就是两个对象存储的值是否相同。在Integer类中的equals方法如下:
public boolean equals(Object obj){ if(obj instanceOf Integer){ return value == ((Integer)obj).intValue(); } return false;}
从上面我们可以看到Integer的equals方法比较的是对象的值,而非引用传递的值
阅读全文
0 0
- java入门包装类-Integer
- JAVA 包装类中的Integer
- Java包装类Integer比较
- JAVA API 包装类 Integer
- Java包装类入门
- JAVA包装类Integer的使用
- JAVA之包装类Integer详解
- java包装类——Integer
- Java包装类的缓存Integer
- java基础之Integer包装类
- Java 包装类Integer的值比较
- java 包装类之Integer -Character
- Integer包装类
- Integer包装类
- Integer包装类
- 【java】-- 调戏Integer 包装与解包装
- 我被Java包装类教育了(Long和Integer)
- 学习笔记 - java Integer包装类的缓存机制
- 二维数组中的查找 (剑指Offer 第 1 题)
- springmvc过滤器简单实例
- 性能优化
- java内部类
- EEPROM和flash的区别 及 nor flash和nand flash
- java入门包装类-Integer
- Personal-Traning题解(一)
- 「Caffe架构+5.5万行代码+芯片每秒6万亿次浮点运算」这是AMD深度学习的开源战略
- 大家好,这是香港科技大学PyTorch四日速成教程
- 详解Android中AsyncTask的使用
- 插入排序(java实现)
- springmvc 拦截器 防止重复提交表单
- 1059. C语言竞赛(20)
- CPU三级缓存