java-Integer类型做 == 运算的装箱问题

问题描述

Integer类型做 == 运算的装箱问题
public void boxingTest() {
Integer i1 = 17;
Integer i2 = 17;
Integer i3 = 137;
Integer i4 = 137;

System.out.println(i1 == i2);
System.out.println(i3 == i4);
}

解释下System.out.println(i1 == i2)输出true的原因:
当包装器类型进行“==”比较时,i3会调用Integer.valueOf自动装箱基本数据类型为包装器类型。

解释有点看不懂,i1i2本来就是包装器类型,调用integer.valueof输出的还是integer类型,为何最后输出是true?

解决方案

1.== 比较的是对象的引用
当且仅当比较的两个引用指向同一对象才返回true 。

2.Integer i = XXX
看看Integer 的源代码就知道了,**其实就是Integer 把-127-128 之间的每个值都建立了一个对应的Integer 对象,类似一个缓存。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。**
Integer i = XXX ,就是Integer i = Interger.valueOf(XXX) 首先判断XXX 是否在-127-127 之间,如果是直接return 已经存在的对象,否则就只能new 一个了。

** 所以第一个输出true第二个为false**

解决方案二:
觉得一楼说的不错…不过楼主不懂的话,可以这样理解就好了,,不管你怎样声明一个int类型,只要是在-128到127之间,地址都是一样的,除此之外别的都不一样,就行了,等你道行深了…自然而然就明白了

时间: 2024-09-19 22:18:53

java-Integer类型做 == 运算的装箱问题的相关文章

java中Double类型的运算精度丢失的问题 (小数点多出99999999999999)

 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错.  首先贴一个使用的代码: /** * 将double类型数据转为字符串(如将18.4转为1840,如果需要1840.0,把int强转去掉即可) * @par

java-求大神 指点 boolean类型能做运算么

问题描述 求大神 指点 boolean类型能做运算么 public class Test01 { public static void main(String[] args) { // double y=2.5; // y=y+3; boolean true ; System.out.println(true+1); } } 这个有语法错误么 解决方案 没定义变量吧 应该是不对的 解决方案二: 不行有语法错误的 boolean true ;这样应该是 boolean str=true ;true

误差-Java的double类型在运算时,结果有的时候不能精确显示。我知道是进制导致的。

问题描述 Java的double类型在运算时,结果有的时候不能精确显示.我知道是进制导致的. 下图讲解,我懂. 但是,在做题的时候............. 才发现,我也只能确定0.1不能被精确显示,具体该如何解这样的题呢? 其实我进一步思考了.我以为就看尾数是不是5.比如0.5.0.05.因为2的-x次方的尾数都是5.是5就能精确显示,不是就不能.但是后来发现.................计算误差"> 说明不能只靠最终结果来判断...............那该怎么判断啊? 问题补充

Java中涉及byte、short和char类型的运算操作

运算 Java中涉及byte.short和char类型的运算操作首先会把这些值转换为int类型,然后对int类型值进行运算,最后得到int类型的结果.因此,如果把两个byte类型值相加,最后会得到一个int类型的结果.如果需要得到byte类型结果,必须将这个int类型的结果显式转换为byte类型.例如,下面的代码会导致编译失败: class BadArithmetic {      static byte addOneAndOne() {        byte a = 1;        by

Java基础 Integer类型比较疑惑

问题描述 Java基础 Integer类型比较疑惑 求解释,为何输出都是 true ? 感谢 public static void main(String[] args) { Integer int1 = new Integer(1); Integer int2 = new Integer(1); System.out.println(int1 >= int2); //true System.out.println(int1 <= int2); //true } 解决方案 int1 和 int

java中的double运算

Java中的简单浮点数类型float和double不能够进行运算.不光是Java,在其它很多编程语言中也有这样的问题.在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误.现在终于理解为什么要有BCD码了. 这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的. 在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有.现在让我们看看如何解决这个问题. 四舍五入 我们的第一个反应是做四舍五入.Ma

java基本类型的包装集作为参数传递的是值而不是引用

问题描述 java基本类型的包装集作为参数传递的是值而不是引用 java基本类型的包装集作为参数传递的是值而不是引用,可以解释下,为什么是这样的吗?结果我已经知道了 解决方案 说到值传递,无非就是和引用传递以及地址传递相对来说的. 引用传递,行参记录的是实参的地址.值传递,行参是实参的copy. 对于java来说,行参存的就是实参内部的值(虽然这个值是对象的地址,但不是实参的地址) 解决方案二: 这个integer对象有其特殊性,在该类中是final类型.所以并不能改变 解决方案三: 因为基本类

java-我懂!是进制的问题导致Java的double型运算结果显示有精度问题,但是!!

问题描述 我懂!是进制的问题导致Java的double型运算结果显示有精度问题,但是!! 20C 但是,做笔试的时候,遇到这样一道题:下列表达式中,可以得到精确结果的是哪些?A.double d1 = 3.0-2.6:B.double d2 = 2.5*1.5:C.double d3 = 3.0-2.5:D.double d4 = 1.0-0.6:E.double d5 = 4.015*100:F.double d6 = 4.015*10: 实在是遇到这样的挫科的题目,我临场时该怎么解噜?!总不

Java表达式类型自动提升

[一道经典的Java面试题] short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错? 答案是:前者错,后者对.相信不管是否经历过java面试过,大家一定对这道题很熟悉.因为这道题确实太经典了,以至于成为了基本每个老师都会拿出来,当作课堂例题来讲.要说清这道题,首先看看java表达式类型转换规则. [java表达式类型转换] java是一门强类型语言,不仅每个变量具有指定的数据类型,它的表达式也有指定的数据类型.因此在不同类型之间进行