重走一次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)操作。
相关文章推荐
- C语言中内存分布及程序运行中(BSS段、数据段、代码段、堆栈)
- 关于PHP堆栈与列队的学习
- JavaScript调用堆栈及setTimeout使用方法深入剖析
- Go语言的队列和堆栈实现方法
- Android调用堆栈跟踪实例分析
- WindowManagerService服务是如何以堆栈的形式来组织窗口
- JavaScript把数组作为堆栈使用的方法
- Python记录详细调用堆栈日志的方法
- python实现堆栈与队列的方法
- Go语言用map实现堆栈功能的方法
- 深入JVM剖析Java的线程堆栈
- Java使用Deque实现堆栈的方法
- C 堆栈,运行时类型挷定
- 怎样学习java,漫谈java学习之路
- 设置jdk环境变量时lib中的rt.jar ,dt.jar ,tool.jar是什么,作用是什么
- 关于“堆栈”
- 汇编调用c函数为什么要设置栈
- Java 集合系列11之 Hashtable详细介绍(源码解析)和使用示例
- 学习日志---treemap
- java基础知识笔记