“+” 是怎么连接字符串的?(JDK1.7及以上)

总结:

使用 “+” 连接字符串时,实际上是使用临时创建的StringBuilder对象来辅助完成的。
对于编译时常量,在编译后直接计算出字符串的值,而不会在运行时创建临时的StringBuilder对象来完成字符串连接。
在循环中对String对象进行连接,应该直接使用StringBuilder代替 “+”,这样可以提高性能。
注意: 当使用运算符 “+” 连接字符串时,如果两个操作数都是编译时常量,则在编译时期就会计算该字符串的值,而不会在运行时创建StringBuilder对象。


final String s = "abc";
String x = "abc" + "def"; // 两个操作数都是常量,运行时不会创建StringBuilder对象
String y = s + "def"; // s和"def"都是编译时常量,不会创建StringBuilder对象,实际上x和y指向同一个对象,即"abcdef"
String z = y + "abc"; // y是变量,则在运行时会创建StringBuilder对象

不可修改的String对象

<1> 问:String对象一经创建,不能修改,为什么?

因为String类是final类型的,无法继承该类。

其所有的成员变量都是private的,并且没有提供修改私有成员变量的公有(public)方法
对String对象的操作都没有修改当前对象,而是新创建一个对象

<2> 问:把String对象设计成不可修改有什么好处吗?

最大好处就是可以实现资源共享,多线程操作时,具有线程安全性。

总结三点:

  • String类是final类型的,其对象一旦创建,不可修改。
  • String类那些看似修改字符序列的方法实际上都是返回新创建的String对象,而不是修改自身对象。
  • String对象不可改变,因此具有线程安全性,可自由实现共享。

String类的内部实现
在String类内部,使用一个字符数组char[]来维护字符序列。

private final char value[];

问:String的最大长度是多少?

String的最大长度也就是字符数组char[]的最大长度,理论上为int类型的最大值,即2147483647,实际上,一般可获取的最大值小于理论最大值。

申请一个int最大值长度字符数组:

char c = new char[Integer.MAX_VALUE]; // 报错

报错:一个char类型占用2字节,Integer.MAX_VALUE个char类型接近于4GB大小,申请这么大一块连续内存空间,导致内存溢出。
//加入Java开发交流君样:756584822一起吹水聊天

分析:Java中的对象是分配在堆上的,默认的堆空间的最大值是256MB,在理想的情况下,只要我们将最大Java堆设置的足够大,就可以申请到最大的字符长度,即Integer.MAX_VALUE。

java -Xmx1G com.fan.fragmentlearning.str.StringDemoMain – 设置Main方法最大Java堆

String常量池

<1> 什么是String常量池?

String常量池是String类内部私有的,能够自动将String字面常量加入其中。
起初,常量池是空的,当程序中出现String字面常量时,会在常量池中搜索是否存在该String对象,即使用String类的equals方法来判断,如果不存在,就将这个字面常量加入常量池中,并返回该对象;否则直接返回常量池中的对象。

<2> String字面常量和String常量表达式都会加入常量池中。

<3> 满足什么条件才算是String常量表达式呢?

即就是在编译的时候就可以确定其值的String类型表达式。编译器的原则是:能在编译期间计算的,就不会留到运行时再去计算。

第一种: 表达式全部由String字面常量拼接

String s = "a" + "b" + "c";

第二种: 表达式由String字面常量,基本类型字面常量,final修饰的String引用,final修饰的基本数据类型任意组合组成。

String s = "a" + 5; // String常量表达式final String str = "a";
String s = "bc" + str; // String常量表达式final int num = 5;
String s = "a" + num; // String常量表达式String s = str + num; // String常量表达式

<4> intern方法 - 拘留字符串

如果需要将某个String对象加入常量池中,就可以调用intern方法来完成,这个操作也称作拘留字符串。
系统自动将String字面常量与String常量表达式的字符串值加入常量池中,也是通过调用intern方法来实现的。

要点总结:

String类维护一块特殊的区域,称为常量池。因为String对象是不可改变的,因此没有必要创建两个相同的String对象。只需将String对象加入常量池,在需要的时候取出,这样即可实现String对象的共享。
在程序中出现String编译时常量(String字面常量与String常量表达式),会自动调用intern方法,如果常量池中含有相等的String对象(使用String类的equals方法来判断),则直接返回常量池中的对象;否则将对象加入常量池中并返回该对象。
对于运行时创建的String对象(非String编译时常量),会分配到堆中,系统不会自动调用intern方法拘留该对象,不过我们依然可以自行调用该对象的intern方法对该对象进行拘留。

最后,祝大家早日学有所成,拿到满意offer

面试字节我被String类的问题给问死了!相关推荐

  1. 【Java5】String类,StringBuilder类,ArrayList类,Object类(toString,equals,hashCode)

    文章目录 1.String类:字符串常量在Java中不属于基本数据类型, 而是引用/类类型 1.1 使用:new String(...) 1.2 判断:equals函数是用来比较两个对象是否相等 1. ...

  2. 阿里最新面试必备项之Java的String类,持续更新中!

    最新腾讯面试必备项之Java的String类,持续更新中! 1.1 String的特性 String类:代表字符串.Java程序中的所有字符串字面值(如"abc")都作为此类的实例 ...

  3. C++面试中string类的一种正确写法

    C++ 的一个常见面试题是让你实现一个 String 类,限于时间,不可能要求具备 std::string 的功能,但至少要求能正确管理资源.具体来说: 能像 int 类型那样定义变量,并且支持赋值. ...

  4. Java · 认识 String 类(上)· 创建字符串 · 字符串比较相等 · 字符串常量池 · 字符串不可变 · 字符字节与字符串

    目录 一.创建字符串 二.字符串比较相等 三.字符串常量池 3.1 直接赋值的内存情况 3.2 采用构造方法的内存情况 四.理解字符串不可变 五.字符.字节与字符串 5.1 字符与字符串 5.2 字节 ...

  5. 学习笔记——String类常用方法(字符、字节、比较、查找、替换、拆分、截取、结构、格式化、连接、入池、驱除空格、长度计算、大小写转换等)

    1.字符串与字符 在jdk1.9之前提供string数组实现了包装处理,在String类里面提供相应的转换处理方法,这些方法包含构造方法与普通方法两类. public String​(char[] v ...

  6. String类中的面试常考点

    String类 常用方法介绍 String类是Java最常用的API,它包含了大量处理字符串的方法,比较常用的有: char charAt(int index):返回指定索引处的字符: String ...

  7. java --String类解决面试问题

    2019独角兽企业重金招聘Python工程师标准>>> 1.概述 字符串对象是一种特殊的对象.String类是一个不可变的类..也就说,String对象一旦创建就不允许修改 Stri ...

  8. C++面试中string类的一种正确简明的写法

    本文首发于酷壳网 http://coolshell.cn/articles/10478.html 先说说程序员(应届生)面试的一般过程,一轮面试(面对一到两个面试官)一般是四.五十分钟,面试官会问两三 ...

  9. 【JavaSE】String类详解含面试经典

    目录 一.初识String类 二.String类的常用方法 2.1 字符串的构造 2.2 String对象的比较 2.2.1 ==比较是否引用同一个对象 2.2.2 boolean equals(Ob ...

最新文章

  1. 自动驾驶高清地图问题的研究
  2. 史上最详细版Centos6安装详细教程
  3. [ C++ ] 理解const
  4. 微型计算机2013年10月下,微型计算机及接口技术2013年10月真题试题(04732)
  5. java file.canexecute_Java File canExecute()用法及代碼示例
  6. 四十二、ETL工具Kettle的转换步骤
  7. Homestead安装 PHP Redis 扩展
  8. 爬取淘宝评论以及词云图
  9. List集合去重的三种方法
  10. 预充电电路工作原理_变频器整流回路 为什么要预充电电路-工业支持中心-西门子中国...
  11. html控制变量范围,加入控制变量后结果悲催了?!
  12. 制作FlappyBird时出现的一些问题
  13. Sdkman运行时INTERNET NOT REACHABLE问题和解决
  14. 偏光显微镜研究聚合物的球晶形态
  15. SpringMVC笔记(4):RESTFul详解
  16. Excel 数据透视表教程大全之 04 按日期分组(教程含样本数据)
  17. 【小白破解电脑密码】忘记电脑开机密码了,怎么办?
  18. SAP 能不能撤销已冲销的凭证?能的话怎么操作?
  19. 全国大学生计算机等级考试计算机二级python真题复习链接
  20. Duplicate File Finder for Mac(重复文件查找工具)

热门文章

  1. Docker的部署-包括网关服务(Ocelot)+认证服务(IdentityServer4)+应用服务
  2. 微软推出了Cloud Native Application Bundles和开源ONNX Runtime
  3. 有关C# 8.0、.NET Framework 4.8与NET Standard 2.1的一个说明
  4. .NET Core中的CSV解析库
  5. ASP.NET Core缓存静态资源
  6. .NET Core 2.0迁移技巧之MemoryCache问题修复
  7. .NET Core 2.0 的dll实时更新、https、依赖包变更问题及解决
  8. 深刻理解:C#中的委托、事件
  9. 30分钟掌握 C#6
  10. rest_framework10:base64补充/修改头像