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

最近有遇到相关面试题,记录一下。
java中String s = new String("abc")创建了几个对象?!
答案是两个,现在我们具体的说一下:
String s = new String("abc");
首先我们要明白两个概念,引用变量和对象,对象一般通过new在堆中创建,s只是一个引用变量。
所有的字符串都是String对象,由于字符串文字的大量使用,java中为了节省时间,在编译阶段,会把字符串文字放在文字池中,文字池的一个好处就是可以把相同的字符串合并,占用一个空间,我们可以用==判断一下两个引用变量是否指向了一个地址即一个对象。
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 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 static void main(String[] args){
String s = new String("abc");
s = "cba";
System.out.println(s);
}
输出结果为:cba
String s = new String("abc")是把文字池即pool中的字符串"abc"复制到堆中,s=并不是给s赋值,而是把堆中的"abc"对象的引用交给s持有,现在把s指向字符串pool中的"cba"对象,"cba"的引用地址把"abc"的引用地址覆盖,所以输出结果为cba。

引自:(https://www.cnblogs.com/zhoushengbing/p/3198375.html)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 从网上复制的,看别人的比较全面,自己搬过来,方便以后查找。原链接:https://www.cnblogs.com/...
    lxtyp阅读 1,359评论 0 9
  • String类和正则表达式 今天的主要内容 Scanner类概述Scanner获取数据出现的小问题及解决方案 St...
    须臾之北阅读 1,953评论 0 3
  • 本文是我自己在秋招复习时的读书笔记,整理的知识点,也是为了防止忘记,尊重劳动成果,转载注明出处哦!如果你也喜欢,那...
    波波波先森阅读 855评论 1 6
  • 前言 RTFSC (Read the fucking source code )才是生活中最重要的。我们天天就是要...
    二毛_coder阅读 466评论 1 1
  • java中String的常用方法 1、length()字符串的长度 例:char chars[]={'a','b'...
    赤赤有名阅读 2,103评论 0 10