首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在堆的PermGen区域,我们有所有原语类型的池吗?

在堆的PermGen区域,我们有所有原语类型的池吗?
EN

Stack Overflow用户
提问于 2013-05-24 14:15:28
回答 5查看 1.8K关注 0票数 4

我知道堆的PermGen区域中字符串池的概念。所以当我们做这样的事情

代码语言:javascript
复制
String firstString = "Stack";
String secondString = "Stack";

两个引用firstStringsecondString都指向池中的同一个对象。但是,对于类型为int的变量,我也尝试了同样的方法。

代码语言:javascript
复制
    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,当我尝试

代码语言:javascript
复制
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,我尝试了相同的方法,结果是相似的。那么,我的问题是,我们是否为所有原始类型(如intchar )都提供了池?当我们实际使用new ()创建具有相同内容的对象时,就像上面提到的第二种情况一样,对象是克隆并存储在相同的池区域中,还是在池之外?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-05-24 14:23:43

在你的帖子里有这么多误解,甚至很难开始解释。买本像样的书。就目前而言,一些可能对你有帮助的事实:

  • 字符串不是原始类型,
  • 没有基本类型池,因为不能引用基元类型(说它们只保存在堆栈上的答案是完全错误的!)
  • 如果您使用new,您将绕过池;因此,执行new String("ala")总是会创建一个新的字符串对象;您不能更改new的语义;
  • 如果您想使用可用池,在对象上使用工厂方法(比如Integer.valueOf),它们将在某种程度上使用池实例(将IntegersFloats等的所有可能值集中在一起是不可行的或有益的)。
票数 11
EN

Stack Overflow用户

发布于 2013-05-24 14:23:11

原语不是对象。它们可以直接存储在生成的代码中。

在第二个代码块中,您测试的是值相等,而不是两个对象是相同的。

代码语言:javascript
复制
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对象,这可能会为多个调用返回相同的对象。

票数 1
EN

Stack Overflow用户

发布于 2013-05-24 14:24:14

如果你试着

代码语言:javascript
复制
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上创建对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16737078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档