第一期:Java面试 - 100题,梳理各大网站优秀面试题。大家可以跟着我一起来刷刷Java理论知识

[005] - JavaSE面试题(五):String类

第1问:String、StringBuffer、StringBuilder 的区别?

  • 都是final类,都不允许被继承
  • String长度是不可变的,StringBuffer和StringBuilder长度是可变的。
  • StringBuffer是线程安全的,StringBuilder是线程不安全的,但他们两个中的所有方法都是相同的,StringBuffer在StringBuilder的方法之上加了synchronized修饰,保证线程安全。
  • StringBuilder比StringBuffer拥有更好的性能。
  • 如果一个String类型的字符串,在编译时就可以确定是一个字符串常量,则编译完成之后,字符串会自动拼接成一个常量。此时String的速度比StringBuilder和StringBuffer的性能更好。

第2问:String str="aaa" 与 String str=new String("aaa")一样吗?

  • 不同,内存分配的方式不同。
  • String str="aaa",创建了1个对象,创建的"aaa"是常量,jvm将其分配在常量池中;
  • String str=new String("aaa"),创建了2个对象,一个是在常量池中,一个在堆内存中。

第3问:String str="aa" ,String s="bb" ,String aa=aa+s; 一共创建了几个对象?

  • 一共有2个引用,3个对象;
  • "aa"与"bb"都是常量,常量的值不能改变,当执行字符串拼接的时候,会创建一个新的常量"aabb",将其存到常量池中。

第4问:String s = "Hello"; s = s + " world!"; 这两行代码执行后,原始的 String 对象中的内容到底变了没有?

没有。

因为 String 被设计成不可变(immutable)类,所以它的所有对象都是不可变对象。在这段代码中,s 原先指向一个 String 对象,内容是 "Hello",然后我们对 s 进行了“+”操作,那么 s 所指向的那个对象是没有发生变化的。这时,s 不指向原来那个对象了,而指向了另一个 String 对象,内容为"Hello world!",原来那个对象还存在于内存之中,只是 s 这个引用变量不再指向它了。

结论,如果经常对字符串进行各种各样的修改,或者说,不可预见的修改,那么使用 String 来代表字符串的话会引起很大的内存开销。因为 String 对象建立之后不能再改变,所以对于每一个不同的字符串,都需要一个 String 对象来表示。这时,应该考虑使用 StringBuffer 类,它允许修改,而不是每个不同的字符串都要生成一个新的对象。并且,这两种类的对象转换十分容易。同时,如果要使用内容相同的字符串,不必每次都 new 一个 String。例如要在构造器中对一个名叫 s 的 String 引用变量进行初始化,把它设置为初始值,应当这样做:

public class Demo {  private String s;  ...  s = "Initial Value";  ...}

而非s = new String("Initial Value");

后者每次都会调用构造器,生成新对象,性能低下且内存开销大,并且没有意义,因为 String 对象不可改变,所以对于内容相同的字符串,只要一个 String 对象来表示就可以了。也就说,多次调用上面的构造器创建多个对象,他们的 String 类型属性 s 都指向同一个对象。

上面的结论还基于这样一个事实:

  • 对于字符串常量,如果内容相同,Java 认为它们代表同一个 String 对象。
  • 而用关键字 new 调用构造器,总是会创建一个新的对象,无论内容是否相同。
  • 至于为什么要把 String 类设计成不可变类,是它的用途决定的。其实不只 String,很多 Java 标准类库中的类都是不可变的。在开发一个系统的时候,我们有时候也需要设计不可变类,来传递一组相关的值,这也是面向对象思想的体现。
  • 不可变类有一些优点,比如因为它的对象是只读的,所以多线程并发访问也不会有任何问题。
  • 当然也有一些缺点,比如每个不同的状态都要一个对象来代表,可能会造成性能上的问题。所以 Java 标准类库还提供了一个可变版本,即 StringBuffer。

第5问:判断下面代码的执行结果

String s1 = new String("abc");    String s2 = "abc";System.out.println(s1 == s2);   //falseSystem.out.println(s1.equals(s2));   //true

原因:s1记录的是堆内存中对象的地址,s2记录的是常量池中的地址

String s1 = "a" + "b" + "c";String s2 = "abc";System.out.println(s1 == s2);        //true    System.out.println(s1.equals(s2));   //true    

原因:java中有常量优化机制,编译时就把 "a" + "b" + "c"变成“abc”赋值给s1

String s1 = "ab";String s2 = "abc";String s3 = s1 + "c";System.out.println(s3 == s2);            //falseSystem.out.println(s3.equals(s2));       //true

原因:因为s1是一个变量,jvm运行的时候不认为s3="abc",也就是无法使用常量池。因此s3会重新创建一个对象。

string s = new string(“xyz“);创建了几个对象_「005」-JavaSE面试题(五):String类相关推荐

  1. 工作10年后,再看String s = new String(xyz) 创建了几个对象?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 转自:艾小仙 这个问题相信每个学习java的同学都不陌生, ...

  2. String s = new String(xyz);创建了几个对象?

    两个或一个都有可能 . "xyz"对应一个对象,这个对象放在字符串常量池,常量"xyz"不管出现多少遍,都是常量池中的那一个. new String每写一遍,就 ...

  3. new string(abc)创建了几个对象_面试题系列第2篇:new String()创建几个对象?有你不知道的...

    Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...

  4. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  5. 以下创建了几个对象_面试题系列第2篇:new String()创建几个对象?

    Java面试题系列:将面试题中比较经典和核心的内容写成系列文章持续在公众号更新,可巩固基础知识,可梳理底层原理,欢迎大家持续关注[程序新视界].本篇为面试题系列第2篇. 常见面试问题 下面代码中创建了 ...

  6. code iban 是有什么组成_「面试」new String(abc)和abc有什么区别?反编译看看原理吧...

    以下内容均由本人独立完成,希望你看完之后能有更多更深入的了解,欢迎关注➕- 在学习String类之前先看看如下的代码块 public String gets1() { return "&qu ...

  7. java创建一个不可变对象_使用不可变对象创建值对象

    java创建一个不可变对象 在回答我最近的文章中AutoValue:生成的不可变的值类 , 布兰登认为,这可能是有趣的,看看如何AutoValue比较项目Lombok和Immutables和凯文借调这 ...

  8. java字符串底层实现_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

  9. java创建一个不可变对象_如何在Java中创建不可变类?

    java创建一个不可变对象 Today we will learn about the immutable class in Java. What are immutable classes? The ...

最新文章

  1. libcurl下载限速编程调研
  2. json的序列化与反序列化
  3. 一个「PPT」框架,让超大模型调参变简单:清华刘知远、黄民烈团队力作
  4. java使用HttpClient传输json格式的参数
  5. 存储过程编写经验和优化措施
  6. linux5.5内核,一条命令就可以升级到Linux 5.5内核或Linux 5.5以上版本
  7. Android 高级自定义View实战
  8. QEMU,一个快速的和便捷的动态翻译器(论文译文)
  9. Contiki OS 开发快速入门
  10. vim显示行号、语法高亮、自动缩进的设置
  11. WiFi已攻占世界 芯片原厂、模组方案商盘点
  12. Java内存泄漏、性能优化、宕机死锁的N种姿势
  13. android包内存放视频,Android性能优化:手把手教你如何让App更快、更稳、更省(含内存、布局优化等)...
  14. liferay mysql driver_Liferay更改数据库(oracle,mysql)
  15. cmd修改服务器命令,修改服务器的ip地址的命令行
  16. Phinx - 数据库迁移及版本控制介绍(内含中文文档翻译)
  17. MySql学习笔记【二、库相关操作】
  18. 关于Lattic Diamond软件安装不成功问题(license问题)
  19. Siemens M65...
  20. 电商系统中商品模型与类目体系设计

热门文章

  1. linux ls mv,04_Linux目录文件操作命令1(mv ls cd...)_我的Linux之路
  2. zabbix监控redis
  3. yarn 更新_【HDFS篇13】HA高可用 --- YARN-HA集群配置
  4. spine纹理解包 黑底_“包治百病”是真理,这些小众包真的很治愈系
  5. html音乐播放器代码自动,html5 css3音乐播放器代码
  6. 微型计算机中 i o接口位于6,北语15秋计算机基础作业1
  7. php把buffer转化为图片_信息流广告 | 信息流广告怎么做?如何提高转化?
  8. springboot整合activemq加入会签,自动重发机制,持久化
  9. vue 父向子组件传递数据,子组件向父组件传递数据方式
  10. NVisionXR_iOS教程十 —— 加载视频控件