[快乐开发] 谁能告诉我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);
	}
Global site tag (gtag.js) - Google Analytics