JAVA Integer值的范围
2024-09-03 05:17:05
原文出处:http://hi.baidu.com/eduask%C9%BD%C8%AA/blog/item/227bf4d81c71ebf538012f53.html
package com.test;
public class Test {
public static void main(String []args) {
Integer a = 100;//此处若使用new,则==值必为false
Integer b = 100;
System.out.println(a==b);//true
Integer c = 150;
Integer d = 150;
System.out.println(c==d);//false
}
}
这是什么原因呢?
1。java在编译的时候 Integer a = 100; 被翻译成-> Integer a = Integer.valueOf(100);
2。比较的时候仍然是对象的比较
3。在jdk源码中
public static Integer valueOf(int i) {
final int offset = 128;
if (i >= -128 && i <= 127) { // must cache
return IntegerCache.cache[i + offset]; //符合值范围时候,进入也创建好的静态IntergerCache,i+offset的值表示去取cache数组中那个下标的值
}
return new Integer(i); //当不符合-128 127值范围时候。记住用的:new,开辟新的内存空间,不属于IntergerCache管理区
}
而
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1]; //开辟-128到127的内存区。有0的位置哦
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128); //为内存区的数组每个对象赋值
}
}
这边是java为了提高效率,初始化了-128--127之间的整数对象,所以在赋值在这个范围内都是同一个对象。
再加一句
Integer a = 100;
a++;
//这边a++是新创建了一个对象,不是以前的对象。
public static void main(String []args) {
Integer a = 100;
Integer b = a;//此时b指针指向值为100的堆地址 即a的堆地址,a==b成立
a++;//此时a指向的值发生变化为101,a指针指向101的堆地址。而b任然指向100
System.out.println(a==b);//false
}
最新文章
- Zabbix 3.0 安装笔记
- c# winform 火狐浏览器 查看cookie
- 使用tomcat7创建异步servlet
- codeforces 615D - Multipliers
- android 的异步任务
- 用urllib2实现一个下载器的思路
- Photon的log使用
- Linux下apache的停止、开启、重启
- getActionBar().setTitle(); Java.lang.NullPoint异常解决方案
- 两种计算和输出n内5要么9除尽互惠
- 模仿c的字符转整数函数 atoi
- bingo 跨action异步获取参数
- discuz 添加板块失败解决办法
- loadrunner提高篇-场景设计实践
- sqlserver与mysql中vachar(n)中遇到的坑
- SpringMVC框架(四)文件的上传下载,上下文路径
- Go 语言函数
- MYSQL—— 基础入门,select 查询涉及到的关键字组合详解(进阶篇)
- IDEA 出现错误:找不到或无法加载主类
- SharePoint REST API - 列表和列表项