下面这条语句一共创建了多少个对象:String s=“a“+“b“+“c“+“d“;

String s="a"+"b"+"c"+"e" 总共创建了几个对象? 问:String s="a"+"b"+"c"+"e" 总共创建了几个对象 ? 答案:1个   当我看到这个问题的时候,我的答案是错的,当我查阅资料后最终确认答案是1个。然后经过了大量的测试,最终答案是1个对象。 测试:    String s1="a"; String s2=s1+"b"; String s3="a"+"b"; System.out.println(s2=="ab"); S 阅读详情

最近看到许多类似的帖子,大致意思如下:

问题1: String s = “a” + “b” + “c” + “d” + “e”; 问此语句共创建了几个对象?
答:就创建了一个

解析:String s = “a” + “b” + “c” + “d” + “e”;
赋值符号右边的"a"、“b”、“c”、“d”、“e"都是常量
对于常量,编译时就直接存储它们的字面值而不是它们的引用
在编译时就直接将它们连接的结果提取出来变成了"abcde”
该语句在class文件中就相当于String s = “abcde”
然后当JVM执行到这一句的时候, 就在String pool里找
如果没有这个字符串,就会产生一个


问题2:如果改成 String s = a+b+c+d+e; 呢,又是几个了?
(就是说上面是因为 “a”、“b”、“c”、“d”、"e"都是常量,但如果是变量呢? )
答:是3个对象,但只有一个String对象。

由于编译器的优化,最终代码为通过StringBuilder完成:

StringBuilder builder = new StringBuilder(); 
builder.append(a); 
builder.append(b); 
builder.append(c); 
builder.append(d); 
builder.append(e); 
String s = builder.toString(); 

我们先看看StringBuilder的构造器

public StringBuilder() {
    super(16);
}
//看下去
AbstractStringBuilder(int capacity) {
     value = new char[capacity];
}

可见,分配了一个16字节长度的char数组

我们看看append的整个过程
(注意:源代码我从各个类进行了整合,他们实际上不在一个类里面的)

  public StringBuilder append(String str) {
    super.append(str);
    return this;
  }

  public AbstractStringBuilder append(String str) {
    if (str == null)
      str = "null";
    int len = str.length();
    if (len == 0)
      return this;
    int newCount = count + len;
    if (newCount > value.length)
      expandCapacity(newCount);
    str.getChars(0, len, value, count);
    count = newCount;
    return this;
  }

  public void getChars(int srcBegin, int srcEnd, char dst[], int dstBegin) {
    if (srcBegin < 0) {
      throw new StringIndexOutOfBoundsException(srcBegin);
    }
    if (srcEnd > count) {
      throw new StringIndexOutOfBoundsException(srcEnd);
    }
    if (srcBegin > srcEnd) {
      throw new StringIndexOutOfBoundsException(srcEnd - srcBegin);
    }
    System
        .arraycopy(value, offset + srcBegin, dst, dstBegin, srcEnd - srcBegin);
  }

可见,我们的代码不会超过16个,所以不会出现扩展value的情况。
而append里面使用了arraycopy的复制方式,也没有产生新的对象。

最后,我们再看StringBuilder的 toString()方法:

public String toString() {
    // Create a copy, don't share the array
    return new String(value, 0, count);
  }
//这里通过前面的数组生成了一个新的String。

大家注意那个默认的16容量,如果题目出现了总长度超过16,则会出现如下的再次分配的情况

  void expandCapacity(int minimumCapacity) {
    int newCapacity = (value.length + 1) * 2;
    if (newCapacity < 0) {
      newCapacity = Integer.MAX_VALUE;
    } else if (minimumCapacity > newCapacity) {
      newCapacity = minimumCapacity;
    }
    value = Arrays.copyOf(value, newCapacity);
  }

  public static char[] copyOf(char[] original, int newLength) {
    char[] copy = new char[newLength];
    System
        .arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
  }

可见,expand容量时,增加为当前(长度+1)*2。
注意:这里用了Arrays的方法,注意不是前面的 System.arraycopy方法哦。这里产生了一个新的copy的char数组,长度为新的长度。

总结:三个对象分别为
1 StringBuilder
2 new char[capacity]
3 new String(value,0,count);

如果说String对象,则为1个。


作者:老紫竹

第1章 Java基础(三) 白话Java面试题 阅读详情

相关推荐

IPD(集成产品开发)管理之道

IPD,是集成产品开发(Integrated Product Development)的缩写,它是集成了众多管理模型和理论、众多企业最佳管理实践的一整套体系,可以帮助企业快速响应市场变化、缩短产品上市时间、减少资源浪费、提高生产力,最终取得商业成功。IPD的思想最早来源于美国PRTM公司出版的《产品及生命周期优化法》一书中,该书详细描述了IPD模式所包含的各个方面。但IPD在中国的普及,源于IBM和华为的推行使用。IPD作为一套先进的产品研发管理模式,其成功的基础是功能部门和各团队之间的密切配合。

钢镚·真的博客 2712

牛客网Java专项练习笔记

抽象类: 1.抽象类可以实现接口,且抽象类可以继承自抽象类; 2.抽象类指abstract修饰的类,可以包含也可不包含抽象方法; 3.抽象类和接口都不能实例化。 接口: 1.接口声明和外部类是一致的,都只能是public或default,注:default默认为public; 2.接口可以继承接口; 3.接口不能被实例化; 4.接口必须为public abstract,...

weixin_34190136的博客 311

保姆级避坑指南:用Keil和J-Flash搞定凌思微LE5010蓝牙芯片的首次程序下载

本文提供了一份详细的保姆级避坑指南,帮助开发者使用Keil和J-Flash工具完成凌思微LE5010蓝牙芯片的首次程序下载。文章重点解决了算法文件混淆、协议栈漏烧和仿真器连接异常等常见问题,并详细介绍了开发环境配置、协议栈烧录和下载接口的物理层奥秘,助力开发者高效完成蓝牙开发任务。

weixin_28739079的博客 467

String str = "a"+"b"+"c"+"d";一共创建了几个对象?

前一段时间我参加了我们学校的招聘会,然后有个面试人员就问了我String str = "a"+"b"+"c"+"d"共创建了几个对象。平时我知道String类型的字符串可以叠加,但这个底层原理却有些模糊。当时就想这是字符串的叠加啊,肯定只创建了一个对象。信心满满的回答了一个对象,结果面试官说肯定不止一个。我回来就百度了,结果百度的答案分两种,一种创建了7个对象,一个创建了一个对象,而且理由都很充分

findblackhorse的博客 1万+

SystemVue 链路预算、仿真分析步骤

使用SystemVue进行链路预算、频谱分析等,相对ADS更全面。

BeCourageable的博客 3833

Zemax API 与 Python 的独立应用程序

Zemax 提供了多个 python 示例代码,位于 Documents\Zemax\ZOS-API Sample Code\Python。使用以下代码,它们保存在 ZOS 文件目录中:/Documents\Zemax\Samples\API\Python。此代码块定位已安装的 OpticStudio 版本,确定根目录,创建命名空间和类,加载局部变量。如果定义的镜头需要一些特殊的编辑,例如反转,一种快速方法是从位于编程选项卡的 ZOS-API 语法帮助中找到相应的命令。重新运行整个代码块,镜头方向会改变。

jkh920184196的博客 1977

String s = "a" +"b" + "c" + "d";这条语句创建了几个对象?

这条语句只创建了一个对象,因为对于字符串常量直接相加的表达式,编译器在编译期间会进行优化,直接将其编译成常量相加的结果。所以只创建了一个String对象。

衣带渐宽终不悔,为伊消得人憔悴。 2440

单片机多级菜单的简单实现

单片机多级菜单的简单实现 多级菜单的思路 最近想把stm32上的oled显示屏做的好看一些,于是动手写了写一个多级菜单,思路很简单,每个页面用单独的函数封装好,每个功能也是用单独的函数进行封装,用了3个按键,两个切换键,一个确定键。 首先来看看用啥判断页面的(这偷个懒,希望没人打我) //页面标志位 uint8_t s1 = 0; //主页面功能号 uint8_t s2 = 0; //主次页面判断标志位 uint16_t s3 = 1; //次页面功能号 主页面的显示函数,这是个很枯燥的一

qq_43940175的博客 7604

【Java面试题】18 java中数组有没有length()方法?string没有lenght()方法?下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d";...

数组没有length()这个方法,有length的属性。String有有length()这个方法。 int a[]; a.length;//返回a的长度 String s; s.length();//返回s的长度 java中数组没有length()方法,求数组的长度可以使用数组的length属性。 int[] arr={1,2,3,4,5};int length1=arr.leng...

weixin_30258901的博客 285

告别OFDM卡顿:用MATLAB手把手仿真AFDM波形,搞定高铁、无人机通信的时变信道难题

本文详细介绍了如何使用MATLAB仿真AFDM波形,解决高铁和无人机通信中的时变信道难题。通过仿射变换技术,AFDM在多普勒频移严重的场景下表现优异,显著提升通信质量。文章包含参数配置、波形生成、性能对比等实战内容,适合通信工程师和研究人员参考。

weixin_27014595的博客 318

Simulink开发项1000例实战专栏--实例161:基于Simulink实现电动汽车电机驱动系统的建模与仿真

通过上述步骤,我们成功实现了基于Simulink的电动汽车电机驱动系统的建模与仿真。该系统能够全面评估电机驱动系统的性能,验证控制策略的有效性,并通过优化设计提高车辆的动力性和效率。引入智能预测:结合人工智能技术,实现更智能的控制策略。扩展功能:增加对多种电机类型的支持,提升系统通用性。实验验证:将仿真模型应用于实际硬件,进行实验验证,评估其在实际工况下的表现。

xiaoheshang_123的博客 189

Java随笔Day2

字符串基础 1.下面语句共创建了几个对象? String s=“a”+“b”+“c”+“d”+“e”; 答:创建了一个对象。该语句在class文件中,相当于String s=“abcde”.当JVM执行到这一句话时,就在String pool里找,如果没有这个字符串,就会产生一个对象。String的内部结构是StringBuilder实现的。所以没有生成“ab” “abc”等对象s引用在堆栈里,肯...

weixin_43539606的博客 265

第51节:cesium 范围查询(含源码+视频)

cesium 范围查询

qq_29384639的博客 1497

Java笔试面试题(四)

每日一句:我既不悲观,也不乐观,只是每天早上睁开眼睛迎接新的一天,一个人努力过下去 1. 下面这条语句一共创建了多少个对象:String s = "a"+"b"+"c"+"d";  对于如下代码: String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b"; System.out.

Tumbler 395

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

备份3

一、Java基础 41、 String字符串 41.1、 下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d" ? 41.2、 String s=new String("xyz");创建了几个对象?有什么不同? 41.3、 ==和equals的区别 51.4、StringBuffer和StringBuilder的区别 52、 Java集合类 52.1、 Collect...

gongxun344的博客 812

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

面试题之String s="a"+"b"+"c"+"d";

今天遇到了一个面试题的选择,我当时真的没怎么在意,其实挺好玩的。 1.这条语句String s="a"+"b"+"c"+"d";一共创建了多少个对象() A.1 B.4 C.6 D.7 这道题放在了第一题 没动脑子数了数 感觉是八个 但是没有选项 又数了数 难道是五个 还是没有选项 然后我就选了B... 纯属瞎写了(主要是谁没事这么声明变量啊) 我的...

weixin_30439131的博客 617

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

共创建了多少个对象:String s="a"+"b"+"c"+"d";

String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b"; System.out.println(s2 == "ab"); System.out.println(s3 == "ab");

QueenJade的收录 2907

Java String对象的问题 String s=“a“+“b“+“c“+“d“ 变态问题

Java String对象的问题 String s="a"+"b"+"c"+"d" 1, String s="a"+"b"+"c"+"d"创建了几个对象(假设之前串池是空的) 2,StringBuilder sb = new StringBuilder(); String a = "a"; String b = "b"; String c = "c"; String d = "d...

夏安的博客 1161

String s=new String("xyz")及String s="a"+"b"+"c"+"d";创建几个String对象的问题

首先让我们了解几个概念: 栈:由JVM分配区域,用于保存线程执行的动作和数据引用。 堆:由JVM分配的,用于存储对象等数据的区域。 常量池constant pool :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.这是一个特殊的共享区域,可以在内存中共享的不经常改变的东西,都可以放在这里。 进入正题: String a = "abc";① St...

qq_36617684的博客 1024

这条语句一共创建了多少个对象 String s = "a"+"b"+"c"+"d";

javac 编译可以对 字符串常量直接相加的表达式进行优化, 不必要等到运行期去进行加法运算处理, 而是在编 译时去掉其中的加号, 直接将其编译成一个这些常量相连的结果。 题目中的第一行代码被编译器在编译时优化后, 相当于直接定义了一个”abcd”的字符串, 所以, 上面的代码应该只创建了一个 String 对象。

必以璀璨惊世人 3063

String s="a"+"b"+"c"+"d";一共创建了几个对象

只创建了一个String对象 String s1 = "a"; String s2 = s1 + "b"; String s3 = "a" + "b"; System.out.println(s2 == "ab"); System.out.println(s3 == "ab"); 第一条语句打印的结果为false,第二条语句打印的结果为true 这说明javac编译可以对字符串常

奋斗、 1万+

java面试题:new String(“abc“)创建几个对象;String a=“abcd“,String b=new String(“abcd“),String c=“ab“+“cd“区别

java面试题:new String(“abc“)创建几个对象;String a=“abcd“,String b=new String(“abcd“),String c=“ab“+“cd“区别

qq_44700578的博客 1428
上一篇: 枚举enum在switch中的用法
下一篇: java.lang.SecurityException: Prohibited package name:java.xxx.xxx.xxx
Xxacker的Latitude
博客等级 码龄9年 64粉丝 107原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值