-------参考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对象常用的属性与方法 在JavaScript中,`String`对象是用于表示和操作文本的强大工具。它提供了许多内置的方法来帮助我们处理字符串数据。本文将详细介绍`String`对象的一些常用属性和方法,并通过示例...
此程序是向大家展示js脚本中string对象的基本应用
`org.json`库提供了一个名为`JSONObject`的类,可以将`String`转换为JSON对象。首先,确保你的项目中已添加了`org.json`的依赖,例如在Maven项目中添加以下依赖: ```xml <groupId>org.json <artifactId>json ...
在上述代码中,`s5`的值为`"hello world"`,但整个过程只创建了一个`StringBuilder`对象和最后的`String`对象。这比使用`+`运算符进行字符串拼接更高效,尤其是在循环中。 总的来说,理解`String`对象在编译期和...
86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点....
String 对象是 Java 中最常用的对象之一,它用于存储字符串类型的数据。 在 Java 中,Object 对象有一个非常重要的方法,即 equals() 方法。该方法用于比较两个对象是否相等。对于基本数据类型,equals() 方法比较...
// 转换为String对象 ``` 4. **intern() 方法**: `String`类的`intern()`方法用于获取常量池中的字符串引用。如果常量池中已存在该字符串,则返回其引用;否则,将字符串添加到常量池并返回引用。例如: ```...
在JavaScript中,Prototype是一个库,它扩展了JavaScript的内置对象,包括String对象。这里的“Prototype String对象”是指Prototype库为JavaScript原生的String对象添加的一些额外功能,主要是为了增强字符串处理的...
CString和string对象的相互转化问题 CString对象和string对象是两种不同的字符串类型,它们之间的转化是非常重要的。本文将详细介绍CString和string之间的转化问题,以及它们的用法。 一、CString和string之间的...
对String创建几个对象代码详解,包括字符串相加,对象相加等等
### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...
### 创建string对象过程的内存分配详解 #### 一、引言 在Java中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。`String` 对象的创建涉及复杂的内存分配机制,特别是在Java虚拟机 (JVM) 的环境中...
读入未知数目的string对象.cpp
在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`String` 类拥有其独特之处,比如它是不可变的(final),这保证了字符串一旦创建便...
最后,需要破除一个错误的理解,即使用String.intern()方法不能将一个String对象保存到一个全局String表中。如果具有相同值的Unicode字符串已经在这个表中,那么String.intern()方法将返回该表中的字符串常量的引用...
当我们创建一个 String 对象时,JAVA 虚拟机(JVM)首先会在字符串池中查找是否已经存在了该对象,如果存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则创建新的对象,并将其加入字符串池中。 ...
对于`c`,`new String("xyz")`会创建一个新的`String`对象在堆中。同样,`d`也会在堆中创建一个新的`String`对象,尽管常量池中已有"xyz"。 3. `String s1 = new String("xyz"); String s2 = new String("xyz"); ...
直接赋值方式将直接在栈中创建一个 String 对象,而使用 new 关键字方式将在堆中创建一个 String 对象。 String 对象的比较 在 Java 中,对 String 对象进行比较有两种方式: 1. 使用 `==` 运算符:`str1 == str2...
首先,`length`属性是String对象的核心属性之一,它表示字符串中字符的数量。例如,`"Hello, world!".length`将返回13,因为这个字符串有13个字符。 接下来,String对象提供了一系列方法用于格式化和展示文本。如`...