java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象
public class Demo02 {
public static void main(String[] args) {
String s1 ="abc";
String s2 = "abc" ;
if( s1 == s2 )
System.out.println("s1,s2 refer to the same object");
else
System.out.println("trouble"); } }
输出结果为:s1,s2 refer to the same object
可以看出指向了一个对象,即文字池中保存了一个对象。
二、String s = new String("abc")实际上是"abc"本身就是文字池中的一个对象,在运行 new String()时,把文字池即pool中的字符串"abc"复制到堆中,并把这个对象的引用交给s,所以创建了两个String对象,一个在pool中,一个在堆中。下面看这个程序,创建了几个对象。
public class Demo03 {
public static void main(String[] args) {
String s1 = new String("abc") ;
String s2 = new String("abc") ;
if( s1 == s2 ){ //不会执行的语句}
System.out.println("在堆中创建了一个对象"); }
else{
System.out.println("在堆中创建了两个对象");
} } }
输出结果为:在堆中创建了两个对象
可知在堆中创建了两个对象,但是在文字池中有一个对象,所以共创建了三个对象。
三、再看下一个例子:
public class Demo04 {
public static void main(String[] args) {
String s = new String("abc");
s = "cba"; System.out.println(s);
}
}
输出结果为:
String s = new String("abc")并不是给s赋值,而是把字符串"abc"的引用交给s持有,现在把s指向字符串"cba","cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba
参考:http://blog.csdn.net/java2000_net/article/details/3681385
相关推荐
使用 `new` 关键字创建 `String` 对象时,如 `String s = new String("abc");`,内存分配过程如下: - 首先,JVM 会检查 **常量池** 中是否已经存在一个等于 `"abc"` 的字符串对象。 - 如果不存在,则在 **常量池*...
数字、字符串、布尔、null、undefined 属于原始资料类型,而Number、String、Boolean属于包装类型,通过new Number 创建的是包装类型的派生对象。所以两者是不等的。 直接赋值为基本类型之后的使用过程如下: 1、...
当我们创建一个 String 对象时,JAVA 虚拟机(JVM)首先会在字符串池中查找是否已经存在了该对象,如果存在,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则创建新的对象,并将其加入字符串池中。 ...
java面试的疑惑剪辑 博文链接:https://z-jq1015.iteye.com/blog/248599
接下来,我们通过几个例子来具体分析`String`对象的内存分配: 1. `String a = "abc"; String b = "abc";` 在这种情况下,"abc"首先会被放入常量池中。当创建`a`和`b`时,它们都指向常量池中的同一个"abc"对象,...
System.out.println("创建了几个对象?两个,一个\"hello\"字符串对象,在方法区的常量池;一个s对象,在堆内存。"); String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true System....
2. **new关键字**:通过`new`关键字创建一个新的字符串对象: ```java String str2 = new String("abc"); ``` 这种方式会在堆内存中创建一个新的对象,并不存储于字符串常量池中。即使两个对象包含相同的字符...
本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串比较、以及 `new` 关键字在创建 `String` 对象时的影响。 #### 一、字符串常量池的理解 首先,我们需要理解字符串...
创建了几个对象,为什么? 答案:创建了两个对象。"abc" 本身创建在常量池中,通过 new 又创建在堆中。String str = new String("abc"); 这一语句创建了两个对象:一个是常量池中的 "abc",另一个是堆中的 String ...
### JAVA面试题解:String创建了几个对象? 在JAVA面试中,经常会出现关于`String`对象创建的问题。本文将深入探讨“一行代码创建了多少个`String`对象?”这一经典问题,通过对具体示例的分析,逐步揭示其背后的...
` 这行代码会创建几个String对象。答案是两个。`"abc"`在Java中是一个字面量,它在运行时会被自动放入字符串池。`new String("abc")`则会创建一个新的String对象,因为它是通过new关键字调用了String类的构造函数。...
使用`new String("abc")`会创建一个新的`String`对象,首先在文字池中查找是否存在"abc",如果存在,则从池中复制一份到堆内存中,然后返回这个新对象的引用。这意味着,`new String("abc")`会创建两个对象:一个在...
### Java中的比较运算符==与equals()方法 在Java编程语言中,经常需要对变量进行...- 使用`new`关键字创建对象时,即使内容相同,也可能得到不同的对象引用。 了解这些概念对于编写高效、可靠的Java程序至关重要。
面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 类的构造方法的作用是什么?...这句话创建了几个
Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,其内容就不能更改。这使得字符串在多线程环境中成为安全的数据类型。 **创建字符串** 字符串可以通过以下几种方式创建: 1. **直接赋值:** ```...
这种不可变性带来了几个重要的优点: - 提高了多线程环境下的安全性,因为不可变对象天然具有线程安全特性。 - 提升了性能,因为JVM可以缓存这些不变的字符串,避免重复创建相同的字符串对象。 - 有助于提高代码...
var s = new String('abc'); var r = s.toUpperCase(); alert(s); // "abc",原始字符串未改变 alert(r); // "ABC",转换为大写的新字符串 ``` #### 字符串的常用 API ##### 字符串截取 1. **`slice`**: - `...
本讨论将深入探讨Java中字符串相关的几个关键问题,包括字符串的创建、常量池、字符串比较以及不可变性。 1. **字符串创建**: 在Java中,有多种创建字符串对象的方式。最常见的两种是通过`new`关键字和使用双引号...
**知识点概述**:在Java中,如何确定创建了多少个String对象,通常涉及到字符串常量池的概念以及字符串的创建方式。 **核心概念**: 1. **字符串常量池**:Java中有一个特殊的内存区域用来存储字符串字面量,这个...