Java:为什么new String("hello")会产生两个对象?

书上说:
当使用new String("hello"),JVM会先使用常量池来管理"hello"直接量,再调用String类的构造函数来创建一个新的String对象,新创建的String对象被保存在堆内存中。换句话中,new String("hello")一共产生了两个对象。

常量池中会保存"hello"我明白,但是这样也会产生对象?不就是把.class中的constant pool加载到了【方法区】的【运行时常量池】么?这个过程也会产生对象?

如果字符串池中没有“hello”,JVM就会在字符串池中创建一个“hello”的对象,然后new String又会在堆中创建一个对象,将"hello"拷贝到这个新创建的对象中。

在类加载的时候在堆内存中创建了一个String类型的对象来与常量池中的字面量作了映射,这个字符串叫做拘留对象,且每个字符串字面量只对应一个拘留对象,之后创建的都是根据这个对象为蓝本,但之后创建的都不是拘留对象而是普通对象了
温馨提示:答案为网友推荐,仅供参考
第1个回答  2014-12-14
一共产生2个对象 堆区中1个,常量池中1一个
如果原式是String a=new String("hello");
String a="hello";首先会到常量池中去查找,如果存在就不再分配,否则就不分配,常量池中的数据是在类编译期赋值的,也就是加载class文件时候就把它放到常量池里了。本回答被网友采纳
第2个回答  2014-12-14
你的理解偏差了。常量池跟对象并不矛盾。常量池也可以存放对象,它保存新对象的过程就是创建一个新对象的过程。“hello”本身就是一个String类型的对象,如果创建对象的过程中遇到new String(xxx)的形式(其实就是遇到new关键字的时候),jvm就会先把xxx的直接值放到常量池中(这就创建了一个String对象,只不过不是存放到堆中),等到jvm在堆中开辟好了对应的字符串空间后,就会把xxx值拷贝到堆中(又创建了一个堆中字符串对象)追问

No,常量池中保存的不是对象是字面量,是在类加载的时候在堆内存中创建了一个String类型的对象来与常量池中的字面量作了映射,这个字符串叫做拘留对象,且每个字符串字面量只对应一个拘留对象,之后创建的都是根据这个对象为蓝本,但之后创建的都不是拘留对象而是普通对象了

本回答被提问者采纳

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网