首页 > 试题广场 >

以下哪种JAVA的变量表达式使得变量a和变量b具有相同的内存

[不定项选择题]
以下哪种JAVA的变量表达式使得变量a和变量b具有相同的内存引用地址(  )
  • String a = "hello"; String b = "hello";
  • Integer a; Integer b = a;
  • int a = 1; Integer b = new Integer(1);
  • int a = 1; Integer b = 1;
首先结论:
(1)int与Integer、new Integer()进行==比较时,结果永远为true
(2)Integer与new Integer()进行==比较时,结果永远为false
(3)Integer与Integer进行==比较时,看范围;在大于等于-128小于等于127的范围内为true,在此范围外为false。

下面是解析过程:
1.Integer与int比较时,Integer会有拆箱的过程,我们可以看看拆箱的代码:
直接返回的就是value,因此int与Integer以及new Integer()进行  ==比较时结果都是true。
2.Integer a=n时,如果n大于等于-128小于等于127时,会直接从IntegerCache中取,不在这个范围内,会new一个对象,所以Integer与new Integer进行 ==比较时,结果都是false。
3.Integer与Integer比较,需要看范围,如果在-128~127(包含-128,不包含127)范围内,因为都是从IntegerCache中取值,所以相等;若不在这个范围内,则都要去new一个对象,所以结果为false。

附上计算结果:



关于D选项,我想单独回答一下:
D选项我认为是错误的,a==b结果虽然结果是true,但是要注意的是,这是一个int与Integer的比较,Integer会进行拆箱,拆箱的结果是int型的,这就相当于两个int型之间的比较,而基本数据类型之间的比较,比较的是数值,所以结果是true,但并不表示两者的内存地址相等。个人看法,如有错误,欢迎指出。
编辑于 2020-03-16 10:55:48 回复(22)
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
==
A对  指向常量池里的"hello"。
B对  题中没说声明的a是局部变量。
C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。
D错  原因同C
编辑于 2019-09-09 14:37:50 回复(7)
<p>基本数据类型,如果声明在方法内,则存储在方法栈中,如果在类内声明,则存储在堆中;如果是引用类型,则声明在方法中时,通过方法栈指向堆,声明在类中时存储在堆中,指向值存储区域</p>
发表于 2020-05-13 18:48:01 回复(1)

A选项应该正确,B选项 Integer a 应该初始化。
int和任意Integer都是同一地址                        
Integer只在127范围内才是同地址,超出就false              
integer()与Integer,Integer()无论什么数范围 都不同地址
发表于 2019-06-13 18:07:57 回复(3)
D 内存地址一致(identityHashCode可查)。但因基本数据类型没有引用概念,所以内存引用地址不一致。
发表于 2022-07-10 21:46:41 回复(0)
默认基本类型属于局部变量,地址在栈区;
对象的引用地址存储在堆区,不使用new则不分配空间,实行浅拷贝。
发表于 2022-05-24 19:25:36 回复(0)
怎么说

发表于 2020-02-11 09:22:52 回复(3)
注意局部的基本数据类型的变量只能存放在虚拟机栈中,而引用数据类型则在堆中有相应的引用。
发表于 2019-11-25 02:27:03 回复(0)
正确答案A B

发表于 2019-09-11 11:40:50 回复(1)
记录大佬题解:
基本数据类型,如果声明在方法内,则存储在方法栈中,如果在类内声明,则存储在堆中;如果是引用类型,则声明在方法中时,通过方法栈指向堆,声明在类中时存储在堆中,指向值存储区域。
----
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
==
A对  指向常量池里的"hello"。
B对  题中没说声明的a是局部变量。
C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。
D错  原因同C
---
1. 基本数据类型:boolean,char,byte,short,int,long,float,double)之间使用==,比较的是它们的数值,复合数据类型之间使用==,比较的是它们在内存中的存放地址,对于String对象的值的比较,可以使用equals()
2. int 与 Integer之间的比较涉及到自动装箱和自动拆箱,最后比较的还是int值。int==integer总是true
3. Integer与Integer进行==比较时,看范围;在大于等于-128小于等于127的范围内为true,
在此范围外为false,java虚拟机缓存了Integer、Byte、Short、Character、Boolean包装类在-128~127之间的值,如果取值在这个范围内,会从int常量池取出一个int并自动装箱成Integer,超出这个范围就会重新创建一个。
4. Integer a=n时,如果n大于等于-128小于等于127时,会直接从IntegerCache中取,不在这个范围内,会new一个对象,所以Integer与new Integer进行 ==比较时,结果都是false。
new Integer总会在堆创建对象,并且在范围内可以取IntegerCache并自动装箱。但是Integer a=n 要不将a指向常量池,要不超过范围则新疆对象,所以比较他们的引用地址总是不同。
5. 在方法中声明的变量可以是基本类型的变量,也可以是引用类型的变量。 
(1)当声明是基本类型的变量的时,其变量名及值(变量名及值是两个概念)是放在方法栈中 
(2)当声明的是引用变量时,所声明的变量(该变量实际上是在方法中存储的是内存地址值)是放在方法的栈中,该变量所指向的对象是放在堆类存中的。
6. 同样在类中声明的变量即可是基本类型的变量 也可是引用类型的变量 
(1)当声明的是基本类型的变量其变量名及其值放在堆内存中的 
(2)引用类型时,其声明的变量仍然会存储一个内存地址值,该内存地址值指向所引用的对象。引用变量名和对应的对象仍然存储在相应的堆中.
7. 在方法中定义的非全局基本数据类型变量的具体内容是存储在栈中的,只要是引用数据类型变量,其具体内容都是存放在堆中的,而栈中存放的是其具体内容所在内存的地址,所以不要说这种模棱两可的话,基本数据类型就没有引用地址。

编辑于 2022-07-04 12:03:36 回复(0)
int 直接存储的是值,而integer是地址
发表于 2020-09-29 14:51:20 回复(0)
B选项,编译都没过呀。。。。
发表于 2019-06-25 08:10:34 回复(2)
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。 int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法 == A对  指向常量池里的&quot;hello&quot;。 B对  题中没说声明的a是局部变量。 C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。 D错  原因同C int 是基本数据类型,包装类是引用数据类型
编辑于 2021-11-02 23:33:50 回复(0)
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
==
A对  指向常量池里的"hello"。
B对  题中没说声明的a是局部变量。
C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。
D错  原因同C
发表于 2020-12-31 15:51:13 回复(0)
int 在栈,Integer 在方法区或者堆怎么可能地址相同
发表于 2020-12-08 16:53:18 回复(0)
基本数据类型没有引用概念,所以和包装类内存引用地址不一致。
基本数据类型和包装类用==比较时,比较的是值,包装类会自动拆箱
发表于 2022-08-24 15:31:46 回复(0)
链接:https://www.nowcoder.com/questionTerminal/a40182696d5d46c2be753074f3330d84
来源:牛客网
基本数据类型,如果声明在方法内,则存储在方法栈中,如果在类内声明,则存储在堆中;如果是引用类型,则声明在方法中时,通过方法栈指向堆,声明在类中时存储在堆中,指向值存储区域。
----
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。
int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法
发表于 2022-08-20 17:38:29 回复(0)
内存引用地址,是指栈中存放的地址,来指向堆中的某个位置。 int 是基本类型,数据直接存放在栈中,不存在内存引用地址的说法 == A对  指向常量池里的"hello"。 B对  题中没说声明的a是局部变量。 C错  int a =1;并不指向堆中,它只有值,没有引用地址,Integer b =new Integer(1);指向堆中地址为1的位置。 D错  原因同C
发表于 2022-03-30 15:28:37 回复(1)
这道题cd是对的吧,是int a又不是integer a ,int与integer比较一定是对的,因为integer自动拆箱啊
发表于 2020-02-09 22:46:00 回复(3)
null也算相同的内存引用吧,哈哈
发表于 2020-01-30 12:13:47 回复(1)