-------参考Java面试解惑:究竟创建了几个对象?
问题提出:
一. String abc=new String("abc");究竟创建了几个String对象?(2个 )
把改式子分解为:
1. String abc 声明了一个变量,没产生新对象
2. = 赋值操作,也没产生新对象
3. new String 新生成了一个对象
4. ''abc" 新生成了一个对象
解释:
根据String类的构造函数:
public String(String original)
{
//other code
}
String abc=new String(“abc”);
实际等价于:
original=”abc”;然后把引用赋值给abc;
根据jdk文档:
original=”abc”;
等价于
char data[] = {'a', 'b', 'c'};
String original = new String(data);
编译器是如何操作的:
(*) JVM会先在Stack区中,创建三个char型值为'a', 'b', 'c',然后在Heap中创建一个对象original,它的值为刚刚Stack中刚刚三个char型组成的数组。
Stack区存放基本类型(即常量类型,int,char,boolean,long,short,byte,double,float),特别速度快,可以共用 比寄存器速度稍慢,比Heap快
Heap区存放对象
二.String abc=”abc”创建了几个对象 ? (1个,根据问题一的分析)
三. String abc=”abc”;
String abc1=”abc”;
创建了几个对象? (1个)
JVM维护一个String Pool(字符串池),存放运行时产生的各种字符串,Pool中存放的字符串不重复。
当String abc=”abc”代码被执行(编译)时,JVM首先在String Pool中查找是否有”abc”,如果没有,则参照(*)创建新对象,并把该对象加入到Pool中。
当执行String abc1=”abc”时,JVM在String Pool中找到有”abc”,,故直接返回其引用而不创建新的对象。
[上面的操作,使用的String的public native String intern() 调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。用代码来说明intern的用法
public class InternTest {
public static void main(String args[])
{
String abcd=new String(new char[] {'a','b','c','d'});
String abcd1=abcd.intern();//abcd用字符数组初始化的,
//String Pool中没有"abcd"对象
//创建新的对象
if(abcd==abcd1)
System.out.println("abcd1与abcd指向同一个对象");
else
System.out.println("abcd1与abcd不是指向同一个对象");
String abcd2=abcd1.intern();//String Pool中有"abcd" 不会创建新的对象
if(abcd2==abcd1)
System.out.println("abcd1与abcd2指向同一个对象");
else
System.out.println("abcd1与abcd2不是指向同一个对象");
}
}
输出结果为:
abcd1与abcd不是指向同一个对象
abcd1与abcd2指向同一个对象
分享到:
相关推荐
超全面javaweb教程28天-day3_01_js的string对象一
String对象常用的属性的方法String对象常用的属性的方法
此程序是向大家展示js脚本中string对象的基本应用
86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点....
String对象的创建问题,分为:编译期和执行期 详细的讲解String对象创建问题
对String创建几个对象代码详解,包括字符串相加,对象相加等等
string对象的操作string对象的操作
string 、对象 、json之间相互互转 ,包含jar包测试类,做了简单的,能使而已!
读入未知数目的string对象.cpp
Java String对象的经典问题,有关String类的介绍
String对象 6.4.1 String对象 1、创建String对象 在JavaScript中可以使用一对单引号或双引号将任意多个字符引起来,即生成字符型数据。这些字符型数据实际上也是构造函数String的实例,即String对象。 6.4.1 String...
CString对象和string对象的相互转化问题,以及他们呢的用法
这是一本对string应用的一本好的教材。是对它的扩展之类的。
JavaScript String 对象参考手册
创建string对象过程的内存分配&&包含多个例子,更加容易理解~~
最近在网上经常看到String对象的问题,现将String对象的内存分析进行分享
String对象一、String对象的属性(1)、length属性(2)、constructor属性(3)、prototype属性二、String对象的方法(1)、查找字符串1)、charAt()方法2)、indexOf()方法3)、lastIndexOf()方法(2)、截取字符串...
memset初始化std::string对象时,按字节顺序将std::string对象所在空间清零,破坏了std::string对象的成员结构,使Myroxy指针资源变为野指针,操作其迭代器会出现不可预知的异常,在存储字符串时可能分配了不必要的...
java中Object对象String对象的解析.pdf