我知道堆的 PermGen 区域中的字符串池的概念。所以当我们做类似的事情时
String firstString = "Stack";
String secondString = "Stack";
两个引用 firstString
和 secondString
都指向池中的同一个对象。但我对类型为 int 的变量进行了同样的尝试。
int firstInt = 5;
int secondInt = 5;
if(firstInt == secondInt) {
System.out.println("Both point to same allocated memory");
} else {
System.out.println("Both point to different allocated memory");
}
结果是都指向同一个对象
当我尝试
Integer firstInteger = new Integer(2);
Integer secondInteger = new Integer(2);
if(firstInteger == secondInteger) {
System.out.println("Both point to same object");
} else {
System.out.println("Both point to different object");
}
输出是都指向不同的对象
我对 char 进行了同样的尝试,结果是相似的。所以我的问题是我们是否为所有原始类型(如 int
、char
)提供池?当我们实际使用 new ()
创建具有相同内容的对象时,如上面提到的第二种情况,是克隆并存储在同一池区域中的对象还是在池外?
最佳答案
您的帖子中存在太多误解,甚至很难开始解释。得到一些像样的书。现在,一些可能对您有帮助的事实:
- String 不是原始类型,
- 没有原始类型池,因为不能引用原始类型(说它们只保存在堆栈中的答案是完全错误的!)
- 如果您使用
new
,您无论如何都会绕过池;所以执行new String("ala")
总是会创建一个新的 String 对象;你不能改变new
的语义; - 如果你想使用可用的池,在对象上使用工厂方法(如
Integer.valueOf
),它们将在某种程度上 - 池实例(将所有可能的池化是不可行或有益的Integers
、Floats
等的值)。
关于java - 我们是否在堆的 PermGen 区域中为所有原始类型提供了池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16737078/