「Java:常量池」修訂間的差異

imported>Soleverlee
(以“常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括...”为内容创建页面)
 
imported>Soleverlee
行 21: 行 21:
 
i4=i5+i6 true
 
i4=i5+i6 true
 
</pre>
 
</pre>
 +
Java为了提高性能提供了和String类一样的对象池机制,当然Java的八种基本类型的包装类(Packaging Type)也有对象池机制。Integer i1=40;Java在编译的时候会执行将代码封装成Integer i1=Integer.valueOf(40);
 +
<source lang="java">
 +
/* ...
 +
* This method will always cache values in the range -128 to 127,
 +
* inclusive, and may cache other values outside of this range.
 +
*/
 +
public static Integer valueOf(int i) {
 +
assert IntegerCache.high >= 127;
 +
if (i >= IntegerCache.low && i <= IntegerCache.high)
 +
return IntegerCache.cache[i + (-IntegerCache.low)];
 +
return new Integer(i);
 +
}
 +
</source>
 +
 
*参考文章 http://www.cnblogs.com/DreamSea/archive/2011/11/20/2256396.html
 
*参考文章 http://www.cnblogs.com/DreamSea/archive/2011/11/20/2256396.html
 
[[Category:Programe]]
 
[[Category:Programe]]

於 2016年4月19日 (二) 11:05 的修訂

常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量,如String s = "java"这种申明方式;当然也可扩充,执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。

蛋疼的Integer

Integer i1 = 40;
Integer i2 = 40;
Integer i3 = 0;
Integer i4 = new Integer(40);
Integer i5 = new Integer(40);
Integer i6 = new Integer(0);

System.out.println("i1=i2   \t" + (i1 == i2));
System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));
System.out.println("i4=i5   \t" + (i4 == i5));
System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));
i1=i2   	true
i1=i2+i3	true
i4=i5   	false
i4=i5+i6	true

Java为了提高性能提供了和String类一样的对象池机制,当然Java的八种基本类型的包装类(Packaging Type)也有对象池机制。Integer i1=40;Java在编译的时候会执行将代码封装成Integer i1=Integer.valueOf(40);

/* ...
 * This method will always cache values in the range -128 to 127,
 * inclusive, and may cache other values outside of this range.
 */
public static Integer valueOf(int i) {
	assert IntegerCache.high >= 127;
	if (i >= IntegerCache.low && i <= IntegerCache.high)
		return IntegerCache.cache[i + (-IntegerCache.low)];
	return new Integer(i);
}