首先需要明确下面的知识点:
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 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...
使用 `new` 关键字创建 `String` 对象时,如 `String s = new String("abc");`,内存分配过程如下: - 首先,JVM 会检查 **常量池** 中是否已经存在一个等于 `"abc"` 的字符串对象。 - 如果不存在,则在 **常量池*...
实际上创建了两个 String 对象,一个是”abc”对象,存储在常量空间中,一个是使用 new 关键字为对象 s 申请的空间。 二、字符串的常见操作 字符串的常见操作包括 charAt 方法、compareTo 方法、concat 方法等。 ...
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
这里,`c` 引用了由 `new` 关键字创建的一个新 `String` 对象,尽管其内容与 `a` 和 `b` 相同,但 `a == c` 返回 `false`,因为它们指向不同的内存位置。然而,`a.equals(c)` 返回 `true`,因为它们的内容确实是相同...
数字、字符串、布尔、null、undefined 属于原始资料类型,而Number、String、Boolean属于包装类型,通过new Number 创建的是包装类型的派生对象。所以两者是不等的。 直接赋值为基本类型之后的使用过程如下: 1、...
使用new关键字创建的字符串会在堆内存中创建一个新的对象,即使常量池中已有相同的字符串,也会生成新的实例。 3. **StringBuilder/StringBuffer**:`StringBuilder sb = new StringBuilder().append("Hello")....
` 这种方式显式地使用了`new`关键字来创建对象。 2. **内存分配差异**:简化语法实际上利用了Java的字符串常量池机制,使得相同的字符串仅被创建一次并存储于常量池中,从而节省了内存资源。相比之下,使用`new ...
当我们创建一个 String 对象时,JAVA 虚拟机(JVM)首先会在字符串池中查找是否已经存在了该对象,如果存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则创建新的对象,并将其加入字符串池中。 ...
第一种形式用 new() 来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象。第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,...
java面试的疑惑剪辑 博文链接:https://z-jq1015.iteye.com/blog/248599
对于`c`,`new String("xyz")`会创建一个新的`String`对象在堆中。同样,`d`也会在堆中创建一个新的`String`对象,尽管常量池中已有"xyz"。 3. `String s1 = new String("xyz"); String s2 = new String("xyz"); ...
2. 使用 `new String()` 关键字创建 `String` 对象时,会在堆中创建一个新对象,并且如果是通过字符串常量初始化,还会在常量池中创建一个相同的字符串对象。 3. 当比较两个由 `new String()` 创建的对象时,即使...
String s = new String("abc"); String s1 = "abc"; String s2 = new String("abc"); ``` 这里,`s`和`s2`都是在堆中创建的新对象,它们各自独立,与常量池中的"abc"对象不同。而`s1`直接引用了常量池中的"abc"对象...
包装类型的字符串是指通过 `new` 关键字创建的字符串,例如 `a = new String("abc")`。这种类型的字符串是对象,可以调用方法。 为什么 `a = "abc"` 和 `a = new String("abc")` 不等?这是因为它们属于不同的类型...
当创建一个新的 String 对象时,Java 会首先在 String.Pool 中查找是否已经存在该字符串,如果存在则返回该字符串的引用,否则创建一个新的字符串对象。 五、String 对象的应用 String 对象是 Java 中最基本的数据...
因此,即使两个通过`new String()`创建的`String`对象具有相同的值,它们也会有不同的对象引用。 #### 三、String 比较 Java中有两种主要的方式来比较`String`对象: 1. **使用“==”运算符**:这种方法比较的是...
面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 ...String s1 = new String("abc");这句话创建了几个
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);...
然而,如果使用`new`关键字创建`String`,则会在堆中创建新对象,即使值相同: ```java String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3 == s4); // 输出false,因为s3和s4...