我知道堆的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");
}结果是Both point to same object,当我尝试
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");
}输出为Both point to different object
对于char,我尝试了相同的方法,结果是相似的。那么,我的问题是,我们是否为所有原始类型(如int、char )都提供了池?当我们实际使用new ()创建具有相同内容的对象时,就像上面提到的第二种情况一样,对象是克隆并存储在相同的池区域中,还是在池之外?
发布于 2013-05-24 14:23:43
在你的帖子里有这么多误解,甚至很难开始解释。买本像样的书。就目前而言,一些可能对你有帮助的事实:
new,您将绕过池;因此,执行new String("ala")总是会创建一个新的字符串对象;您不能更改new的语义;Integer.valueOf),它们将在某种程度上使用池实例(将Integers、Floats等的所有可能值集中在一起是不可行的或有益的)。发布于 2013-05-24 14:23:11
原语不是对象。它们可以直接存储在生成的代码中。
在第二个代码块中,您测试的是值相等,而不是两个对象是相同的。
int firstInt = 5;
int secondInt = 5;
if(firstInt == secondInt)
{
System.out.println("Both point to same object");
// NO - neither point to an object -- their alues are the same.
}通过显式使用Integer.valueOf(int),您可以在多个引用之间共享相同的Integer对象,这可能会为多个调用返回相同的对象。
发布于 2013-05-24 14:24:14
如果你试着
if (Integer.valueOf(2) ==Integer.valueOf(2))你会得到true。
使用Integer firstInt = new Integer(2),您可以创建一个新的局部变量,即!=到使用Integer secondInt = new Integer(2)创建的另一个局部变量。String类型也是如此。
这背后的原因是==检查变量的相等性。变量可能是不同的(==结果在false中),尽管它们指向两个“相同”的对象。在这个上下文中,同样的情况意味着obj1.equals(obj2)返回true。
如果要将primitve类型的对象表示形式和StringS存储在PermGen中,则不要使用new关键字,即Integer firstInt = 2;,String firstString= "whatevs";,因为关键字new在堆上创建对象。
https://stackoverflow.com/questions/16737078
复制相似问题