您的位置:首页 > 编程语言 > Java开发

重走一次java-堆栈之int,Integer,String定义变量

2015-11-12 17:27 459 查看
</pre>写下来是证实自己理解的最直接证明:<pre name="code" class="java">private void t1(){
Integer n1 = 10;
Integer n2 = new Integer(10);
int n3 = 10;

System.out.println(n1==n3);//true,①
System.out.println(n1==n2);//false,②
System.out.println(n2==n3);//true,③
}
private void t2(){
String s1 = "a";
String s2 = new String("a");
System.out.println(s1==s2);//false④
}
private void t3(){
Integer n4 = 300;
Integer n5 = 300;
System.out.println(n4==n5);//false⑤
}
private void t4(){
Integer n6 = 10;
Integer n7 = 10;
System.out.println(n6==n7);//true⑥
}


个人理解:

关于①

jdk1.5后引入了编译器自动装箱和拆箱机制,即:

//装箱

Integer num = 10;

//拆箱

int num1 = 10;

他们两者是等价的,首先运行的是Integer n1 = 10;他先进行拆箱操作,转换为int n1=10;

然后在内存中记下一个地址,比如0X1234,该地址指向栈中一块起始地址,空间是sizeof(10)的内存单元,申明一个变量为n1的引用,然后查找整个栈空间是否有10这个值得地址,因为栈空间是可共享的,如果有,直接指向。

如果没有,就在该地址空间中创建一个为10值,名字为num的地址。

关于②

n1指向的是在栈空间的地址,n2是经过new操作,在堆空间创建的对象,地址肯定不同。

关于③

他的比较方式应该是n3==n2.intValue();理解正确与否有待于在细看。

关于④

是一个常问的问题,s1是在栈空间创建的引用对象,s2是在栈空间创建的引用对象,但是他的值是在堆空间中。

关于⑤⑥

查看源码就知道了,Integer 默认进行拆箱和装箱的范围是-128到127,超过这个数字将进行new Integer(value)操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java基础 堆栈