`
collegeyuan
  • 浏览: 31500 次
  • 性别: Icon_minigender_2
  • 来自: 上海
文章分类
社区版块
存档分类
最新评论

String s = new String("abc");创建了几个String对象?

阅读更多
首先需要明确下面的知识点:
1、引用变量与对象的区别;
2、字符串文字"abc"是一个String对象;
3、文字池(pool of literal strings)和堆(heap)中的字符串对象。

一、引用变量与对象
A aa;
这个语句声明一个类A的引用变量aa[我们常常称之为句柄],而对象一般通过new创建。所以题目中s仅仅是一个引用变量,它不是对象。

二、Java中所有的字符串文字[字符串常量]都是一个String的对象

有人[特别是C程序员]在一些场合喜欢把字符串"当作/看成"字符数组,这也没有办法,因为字符串与字符数组存在一些内在的联系。事实上,它与字符数组是两种完全不同的对象。

System.out.println("Hello".length());
char[] cc={'H','i'};
System.out.println(cc.length);

三、字符串对象的创建
由于字符串对象的大量使用(它是一个对象,一般而言对象总是在heap分配内存),Java中为了节省内存空间和运行时间(如比较字符串时,==比equals()快),在编译阶段就把所有的字符串文字放到一个文字池(pool of literal strings)中,而运行时文字池成为常量池的一部分。文字池的好处,就是该池中所有相同的字符串常量被合并,只占用一个空间。

下面利用一个程序实例,来演示相同的字符串占用同一个空间:

import java.util.*;
import java.io.*;
public class Test{
public static void main(String args[]){
  String s1=”abc“;

  String s2=”abc“;   
  System.out.println(s1==s2);
}
}
上面的程序段执行时会输出true,这表明s1和s2占用相同的内存空间。此时便可以回答第一个问题了,String s="abc"定义了一个或0个对象。定义s1时pool中还没有"abc",所以它定义了一个对象"abc"并将其放入到pool中;定义s2时pool中已经有"abc"了,所以它定义了0个对象。(注:在采用这种形式的表达式定义s时,他只在pool中定义对象,不会在heap中定义)

四、第二个问题的答案

首先将结论告诉读者,String s=new String("abc")定义了两个或者一个对像。

下面对其进行分析,依然用一个小程序来演示:

import java.util.*;
import java.io.*;
public class Test{
public static void main(String args[]){
  String s1=new String("abc");
  String ss1="abc";
  String s2=new String("abc");
  String ss2="abc";
 
  System.out.println(s1==s2);
  System.out.println(ss1==ss2);
}
}

这个程序会依次输出False和true;对于s1,对其定义时pool中没有"abc",String s1=new String("abc")会先后在pool中和heap中定义"abc",所以它创建了两个对象;而对于s2,它只在heap中定义了一个"abc",所以它创建了一个对象;而对于ss1和ss2,他们定义的时候pool中已经有了"abc",所以定义了0个对象。
分享到:
评论

相关推荐

    String.txt

    String b =new String("abc"); //创建字符串方式2 System.out.println(a==b); //false,内存地址不相等 String c =new String("abc"); String d =new String("abc"); System.out.println(c==d...

    创建string对象过程的内存分配:

    使用 `new` 关键字创建 `String` 对象时,如 `String s = new String("abc");`,内存分配过程如下: - 首先,JVM 会检查 **常量池** 中是否已经存在一个等于 `"abc"` 的字符串对象。 - 如果不存在,则在 **常量池*...

    java String 使用详解

    实际上创建了两个 String 对象,一个是”abc”对象,存储在常量空间中,一个是使用 new 关键字为对象 s 申请的空间。 二、字符串的常见操作 字符串的常见操作包括 charAt 方法、compareTo 方法、concat 方法等。 ...

    String类创建对象问题

    ### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...

    String中==与equals区别验证

    这里,`c` 引用了由 `new` 关键字创建的一个新 `String` 对象,尽管其内容与 `a` 和 `b` 相同,但 `a == c` 返回 `false`,因为它们指向不同的内存位置。然而,`a.equals(c)` 返回 `true`,因为它们的内容确实是相同...

    浅析为什么a=”abc” 不等于 a=new String(“abc”)

    数字、字符串、布尔、null、undefined 属于原始资料类型,而Number、String、Boolean属于包装类型,通过new Number 创建的是包装类型的派生对象。所以两者是不等的。 直接赋值为基本类型之后的使用过程如下: 1、...

    Java String 字符串创建理解 equels和\"==\" 差异

    使用new关键字创建的字符串会在堆内存中创建一个新的对象,即使常量池中已有相同的字符串,也会生成新的实例。 3. **StringBuilder/StringBuffer**:`StringBuilder sb = new StringBuilder().append("Hello")....

    String类详解!

    ` 这种方式显式地使用了`new`关键字来创建对象。 2. **内存分配差异**:简化语法实际上利用了Java的字符串常量池机制,使得相同的字符串仅被创建一次并存储于常量池中,从而节省了内存资源。相比之下,使用`new ...

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    当我们创建一个 String 对象时,JAVA 虚拟机(JVM)首先会在字符串池中查找是否已经存在了该对象,如果存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则创建新的对象,并将其加入字符串池中。 ...

    String型的不可变性

    第一种形式用 new() 来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象。第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,...

    new String(\"abc\")创建几个对象的解释

    java面试的疑惑剪辑 博文链接:https://z-jq1015.iteye.com/blog/248599

    String对象的内存分析

    对于`c`,`new String("xyz")`会创建一个新的`String`对象在堆中。同样,`d`也会在堆中创建一个新的`String`对象,尽管常量池中已有"xyz"。 3. `String s1 = new String("xyz"); String s2 = new String("xyz"); ...

    12基础篇之第十二(String的基本用法).docx

    2. 使用 `new String()` 关键字创建 `String` 对象时,会在堆中创建一个新对象,并且如果是通过字符串常量初始化,还会在常量池中创建一个相同的字符串对象。 3. 当比较两个由 `new String()` 创建的对象时,即使...

    String字符串比较1

    String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); ``` 这里,`s`和`s2`都是在堆中创建的新对象,它们各自独立,与常量池中的"abc"对象不同。而`s1`直接引用了常量池中的"abc"对象...

    浅析为什么a="abc" 不等于 a=new String("abc")

    包装类型的字符串是指通过 `new` 关键字创建的字符串,例如 `a = new String("abc")`。这种类型的字符串是对象,可以调用方法。 为什么 `a = "abc"` 和 `a = new String("abc")` 不等?这是因为它们属于不同的类型...

    深入探讨Java中的String类.pdf

    当创建一个新的 String 对象时,Java 会首先在 String.Pool 中查找是否已经存在该字符串,如果存在则返回该字符串的引用,否则创建一个新的字符串对象。 五、String 对象的应用 String 对象是 Java 中最基本的数据...

    Java String对象的经典问题

    因此,即使两个通过`new String()`创建的`String`对象具有相同的值,它们也会有不同的对象引用。 #### 三、String 比较 Java中有两种主要的方式来比较`String`对象: 1. **使用“==”运算符**:这种方法比较的是...

    java 面对对象编程.pdf.zip

    面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 ...String s1 = new String("abc");这句话创建了几个

    java面试题122道基础题

    String s=new String("abc"); System.out.println(s); String s1="abc"; String s2=new String("abc"); System.out.println(s==s1);//false System.out.println(s==s2);//false System.out.println(s1==s2);...

    JAVA_String

    然而,如果使用`new`关键字创建`String`,则会在堆中创建新对象,即使值相同: ```java String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3 == s4); // 输出false,因为s3和s4...

Global site tag (gtag.js) - Google Analytics