java-JAVA 自动装箱Integer i1=100 的问题

问题描述

JAVA 自动装箱Integer i1=100 的问题

Integer i1=100;
Integer i2=100;

这个时候的i1和i2是不是同一个对象?指向同一块内存?
为什么我修改i1的值 i1=101;
这个时候的i2的值会发生改变吗

解决方案

当然不会,因为是值类型。
你永远不要指望能用两个变量共享一个值类型
除非你将它定义成引用类型的一个成员变量,然后去使用这个引用类型。

解决方案二:

多说几句,
Integer i1=100;
Integer i2=100;
因为是值类型,这两个变量保存在不同的内存,各自有100这个值。
i2 = i1;
因为是值类型,所以会把i1的值复制给i2,之后它们还是倆
Object o1 = i1;
此时i1被装箱了
Object o2 = o1;
没错它们是指向一个引用
o1 = 123;
123被装箱,o1指向新的对象,和o2分离
i2 = o2;
o2被拆箱,i2得到的是o2拆箱的值,复制给i2
你可以看出无论怎么绕,都不能对一个值类型共享两个变量

解决方案三:

小白真多。一个个说的和真的似的。

解决方案四:

你这种是需要编译器实现的时候做的优化。取决于实现。
比如python这种情况就会都指向同一个引用。

解决方案五:

这是基本数据类型,是值类型,各是各的,互不影响

解决方案六:

我记得在一个小范围内,都指的一个
好像

解决方案七:

这时候i1,i2应该是指向的同一块内存,但是你修改i1之后,i1和i2就不是指向的同一块内存了,你直接用==判断不就可以了吗

解决方案八:

 Integer i1=100;
Integer i2=100;
这样装箱是指向同一个Integer的,如果自己想看看源码,可以看一下valueof里面的源码。java在初始化时IntegerCache初始化了-128-127的所有整数对象,所有装箱时如果数值在这个范围内,相同的数值是同一个对象。

整型对象是不可修改的。赋值新值就是新装箱,也就是新对象。
比如
Integer i1=100;
Integer i2= new Integer(100);就是两个不同的对象,new是不走装箱的,是在堆中建立新对象。

解决方案九:

Integer i1=100;Integer i2=100;这时i1==i2的,是指向同一个内存的。对包装类的自动装箱、自动拆箱也是一种语法糖, Java的new Integer操作,当参数值在【-128,127】之间时,new操作返回的对象是有缓存的,所以i1和i2引用的内存一样的。当你把i1=101后,i1指向新的地址,而i2仍然指向原来的地址,所以不会影响。
可以参考该文章:http://blog.csdn.net/wojiushiwo945you/article/details/39212679

时间: 2024-09-01 14:13:07

java-JAVA 自动装箱Integer i1=100 的问题的相关文章

java中自动装箱的问题

package wrapper; public class WrapperDemo { public static void main(String[] args) { Integer a=new Integer(5); Integer b=new Integer(5); System.out.println(a==b); System.out.println(a.equals(b)); /* false true */ Integer c=127;//属于自动装箱 Integer d=127;

[jjzhu学java]之自动装箱的陷阱

自动装箱.拆箱的陷阱 装箱与拆箱 java语言中为每种基本数据类型(int,float,double-)都提供了与之对应的包装器类型(Integer,Float,Double).从java se5之后就开始提供了自动装箱的特性.想要得到一个数值为2016的Integer时,只需要如下的赋值语句: //Integer a = Integer.valueOf(2016); Integer a = 2016; 该语句就会自定根据=右边的数值创建相应的Integer,这个过程就是自动装箱. 拆箱与装箱是

jdk1.5新特性4之自动装箱和自动拆箱与享元模式

  一 基本概念 1 装箱 把基本类型用它们相应的引用类型包装起来,使其具有对象的性质.如int-->Integer,float-->Float. 自动装箱 Integer a = 100,编译器调用的是static Integer valueOf(int i)                2 拆箱 和装箱相反,将引用类型的对象简化成值类型的数据 自动拆箱 int b = new Integer(100); int c = a +2;   二 是否相等 例一 Integer a = new

深入剖析Java中的装箱和拆箱

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: Integer i = new I

深入剖析Java中的装箱和拆箱(转)

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 以下是本文的目录大纲: 一.什么是装箱?什么是拆箱? 二.装箱和拆箱是如何实现的 三.面试中相关的问题 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE

Java中的装箱和拆箱深入理解_java

自动装箱和拆箱问题是Java中一个老生常谈的问题了,今天我们就来一些看一下装箱和拆箱中的若干问题.本文先讲述装箱和拆箱最基本的东西,再来看一下面试笔试中经常遇到的与装箱.拆箱相关的问题. 一.什么是装箱?什么是拆箱? 在前面的文章中提到,Java为每种基本数据类型都提供了对应的包装器类型,至于为什么会为每种基本数据类型提供包装器类型在此不进行阐述,有兴趣的朋友可以查阅相关资料.在Java SE5之前,如果要生成一个数值为10的Integer对象,必须这样进行: 复制代码 代码如下: Intege

java 自动装箱拆箱实现方法

java 自动装箱拆箱实现方法 什么是自动装箱拆箱 基本数据类型的自动装箱(autoboxing).拆箱(unboxing)是自j2se 5.0开始提供的功能.  一般我们要创建一个类的对象的时候,我们会这样: class a = new class(parameter); 当我们创建一个integer对象时,却可以这样: integer i = 100; (注意:不是 int i = 100; ) 实际上,上面那句代码相当于:integer i = new integer(100); 此即基本

Java学习之自动装箱和自动拆箱源码分析

自动装箱(boxing)和自动拆箱(unboxing) 首先了解下Java的四类八种基本数据类型 基本类型 占用空间(Byte) 表示范围 包装器类型 boolean 1/8 true|false Boolean char 2 -128~127 Character byte 1 -128~127 Byte short 2 -2ˆ15~2ˆ15-1 Short int 4 -2ˆ31~2ˆ31-1 Integer long 8 -2ˆ63~2ˆ63-1 Long float 4 -3.403E38

java基础:合法转换与自动装箱、拆箱

问题描述 java基础:合法转换与自动装箱.拆箱 Short y = 100; int z = y; 这两句代码编译正确,但为什么呢?是y先拆箱成short,然后合法转换成int吗? short y1 = 100; Integer z1 = y1; 而这两句代码编译报错,如果按照上面的逻辑,可以y1先合法转换int,然后自动装箱成Integer呀? 解决方案 涉及到隐式转换. 对非引用类型赋值的时候,对基本数据类型会进行自动拆箱,然后可以隐式转换为大类型: 如第一种. 而引用类型则是先装箱再赋值