[快乐开发] 谁能告诉我java中的常量池和堆之间是否有交集 两者的关系是怎样的?
<>++<
2010-11-25
这个问题困扰我很久了 RTRTRT
|
|
trydofor
2010-11-26
老大,有人踢场子
http://www.360doc.com/content/10/1015/16/18042_61246603.shtml |
|
<>++<
2010-11-26
举例说明吧:
String str1 = "China"; String str2 = "China"; System.out.println(str1 == str2);//true 因为两个String的引用地址是一样的 所以比引用返回true 这个没问题 但: Integer n3 = 128; Integer n4 = 128; System.out.println(n3 == n4);//false 因为两个Integer的引用地址也都是常量池中128的内存地址 为什么比引用就返回false? (因为-128~127是存在cache中的 所以用这区间的整数举例会返回true) ---------------------------------这是为啥啊 阿九?? |
|
trydofor
2010-11-26
Integer n3 = new Integer(128);
Integer n4 = new Integer(128); System.out.println(n3 == n4);//false String str1 = new String("China"); String str2 = "China"; System.out.println(str1 == str2);//false Integer n3 = 128; Integer n4 = 128; System.out.println(n3 == n4);//false 自动装拆包. 套路: 1)*.java ==javac==》*.class ==反编译==》java 2)直接打开 *.class 感觉没必要整这么细吧,很少有项目扣这玩意。 |
|
francis.xjl
2010-11-26
http://zangxt.iteye.com/blog/440330
http://www.iteye.com/topic/821872 |
|
chenhua_xy
2010-11-26
Integer n3 n4 ->int包装类当然是对象必然存放在堆空间,只要是对象都在堆空间
字符串常量才是放在方法区的常量池的 常量池放置的是直接常量(String,integer,float point常量)和对其他字段,方法,类型的符号引用。 |
|
flashing
2010-11-27
常量池也是堆,只不过是个比较特殊的堆而已。
堆内存是可以分块的。 |
|
superheizai
2010-11-27
<>++< 写道 举例说明吧:
String str1 = "China"; String str2 = "China"; System.out.println(str1 == str2);//true 因为两个String的引用地址是一样的 所以比引用返回true 这个没问题 但: Integer n3 = 128; Integer n4 = 128; System.out.println(n3 == n4);//false 因为两个Integer的引用地址也都是常量池中128的内存地址 为什么比引用就返回false? (因为-128~127是存在cache中的 所以用这区间的整数举例会返回true) ---------------------------------这是为啥啊 阿九?? 记得读过这个答案,在core java上好像。Integer,或者Double这样的包装类,会有一个预先定义的一系列数,恶就是你所说的-128-127比较时候返回true,它这么做可以节约资源。但是其他的Integer,也就是不在-128到127之间的包装类,是不会返回true的,java的内部机制。 |
|
trydofor
2010-11-29
>(因为-128~127是存在cache中的 所以用这区间的整数举例会返回true)
这是个圈套,看你是用==还是equals,是new还是box // jdk1.4 & 6 Integer n3 = new Integer(1); Integer n4 = new Integer(1); System.out.println(n3 == n4);//false // jdk6 Integer n3 = 12; Integer n4 = 12; System.out.println(n3 == n4);//true |
|
Crusader
2010-11-29
public static Integer valueOf(int i) { final int offset = 128; if (i >= -128 && i <= 127) { // must cache return IntegerCache.cache[i + offset]; } return new Integer(i); } |