Java Integer值范围问题
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
}
}
打印结果很显然。
但是如果换成 128 > var >= -128 之外的整数就打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
对于127--128没有多大关系,但是在这范围之外就影响性能了吧,就像StringBuffer VS String一样了
Java Integer值范围问题相关推荐
- java Integer值比较
所有相同类型的包装类对象之间的值比较,应该使用equals方法比较. –来自阿里巴巴java开发手册. 先看个简单实例: public static void main(String[] args)t ...
- java integer 值传递_在java中String,对象,Integer(包装类型的)关于引用传递仍是值传递...
场景: 你们都知道基本的数据类型,int,float等等这种是按值传递的.可是对于String,对象,Integer是怎样传递呢?java 原理知识: 若是参数类型是原始类型,那么传过来的就是这个参数 ...
- JAVA Integer值比较问题
文章目录 1.概述 1.概述 今天项目中很多地方用Integer比较 实体类中 private Integer entityId; 然后比较 basEntityInDb.getEntityId() = ...
- Java Integer取值范围是多少呢?
转自: Java Integer取值范围是多少呢? 下文笔者将使用实验的方式,讲述Integer类的取值范围,如下所示: Integer同int类型取值一致其取值范围是从-2147483648 至 2 ...
- java integer的范围_java integer的取值范围是什么?
Java Integer取值范围 Integer类取值和 int 类型取值一致,取值范围是从-2147483648 至 2147483647 ,包括-2147483648 和 2147483647. ...
- java integer int 比较_java Integer和int之间的比较问题是什么?
展开全部 java Integer和int之间e68a84e8a2ad3231313335323631343130323136353331333365633864==的比较问题.求解释 public ...
- 【java】java Integer 缓存 一定是 -128~127 吗
1.概述 我们都知道 java Integer是有缓存的,缓存范围是 -128~127.但是这个值是一定的吗? 不一定.看源码.缓存大小居然可以改变 /*** Cache to support the ...
- 享元模式在 Java Integer 中的应用
我们先来看下面这样一段代码.你可以先思考下,这段代码会输出什么样的结果. Integer i1 = 56; Integer i2 = 56; Integer i3 = 129; Integer i4 ...
- java integer long 转换_java - 将Integer转换为Long
java - 将Integer转换为Long 我需要使用反射来获取字段的值. 碰巧我并不总是确定该字段的数据类型是什么. 为此,为了避免一些代码重复,我创建了以下方法: @SuppressWarnin ...
最新文章
- Spring.NET学习笔记9——打造简易的依赖注入框架(练习篇) Level 100
- Unity热更新技术整理
- Boost:基于Boost的阻塞udp回显服务器
- c++primer书上习题date类的部分源代码(待整理)
- 蛋白粉有什么作用?搭配这些食物帮助提升免疫力!
- tcp与udp的socket编程,udp代码实现客户端服务端,tcp代码实现客户端服务端(单线程、多线程、多进程分别实现),三次握手
- Linux内核构建与开发
- BZOJ2879 [Noi2012]美食节
- jsarraybufferdaya释放_聊聊JS的二进制家族:Blob、ArrayBuffer和Buffer
- 概率算法(随机化算法)
- cad抛物线曲线lisp_cad画缓和曲线lisp程序(1)
- 视频剪辑的方法,视频裂变
- 小布助手对话短文本语义匹配
- HTTPS之SNI介绍与Nginx多域名支持
- 快乐二级域名分发程序-美化版源码
- android 阅读模式吗,在Android或iOS上使用阅读模式来查看网页 | MOS86
- Word设置二级标题的编号后,第二章下的二级标题的编号仍为1.X
- 遥控车库门常见故障的处理方法
- Python C/S 网络编程(二)之 UDP 实现英汉词典查询小程序
- 基于C#开发一款益智类一笔画小游戏