专栏首页java工会String三姐妹你所不知道的坑!

String三姐妹你所不知道的坑!

String、Stringbuilder、StringBuffer

◆ ◆ ◆ ◆

这三个的比较会被经常问到,常常跟优化沾边,一般准备过的同学都不会有太大问题。但是在小明同学工作一年跳槽,去面试阿里的时候,被一个面试官埋了个小坑,至今印象深刻。

String

◆ ◆ ◆ ◆

三个基本特点:

1.不变性:String对象一旦生成,则不能再对它进行改变。String的这个特性可以泛化成不变(immutable)模式,即一个对象的状态在对象被创建后就不再发生变化。主要作用在于一个对象需要被多进程共享,并且频繁访问时,可以省略同步和锁等待时间,从而增加系统性能

2.针对常量池的优化:当两个String对象有用相同的值时,他们只引用常量池中的同一个拷贝。当一个字符串反复出现时,可以大幅度节省内存空间。

如以上程序,我们很容易直到结果是true,false,true.具体的内存分配方式如下图:

3.类的final化:即不可能有任何子类,会提高安全性。

StringBuffer和StringBuilder

◆ ◆ ◆ ◆

由于String对象不可变,所以在修改操作时,会频繁创建新的对象,性能相对较差,于是就产生了StringBuffer和StringBuilder,如:

StringBuilder str = new StringBuilder(1024);

str.append("aaa");

str.append("bbb");

str.append("ccc");

其中str对象始终是一个。

StringBuffer和StringBuilder的差别就是,StringBuffer是线程安全的

StringBuilder是非线程安全的

需要关注的是,由于它们的对象是可变的,在创建的时候最好先预估量级,赋初值,避免一直扩容。

具体面试时使用

◆ ◆ ◆ ◆

当年掌握到这里就去面试了,阿里的面试官问了小明同学它们三个的差别以及使用场景,然后又问了下面的问题:

String str = "aaa"+"bbb"+"ccc"+“ddd”;

这句代码的生成情况是什么:

小明同学回答:

首先“aaa”和“bbb”,生成“aaabbb”,然后在生成"aaabbbccc",最后是“aaabbbcccddd”;

答案是对的!

接下来问了个至今印象深刻的问题!

循环五万次

String str = "aaa"+"bbb"+"ccc"+“ddd”;

StringBuilder str = new StringBuilder(max);

str.append("aaa");

str.append("bbb");

str.append("ccc");

str.append("ddd");

哪个时间更快?

当时小明同学脑中是觉得String会创建很多对象,然后再拼接,肯定是第一个慢!

之后面试官露出一个诡异的笑容……告诉我,第一个时间快,并且速度接近为0!

当时我就震惊了!

这是为什么呢!

看看下面的结果:

这个是在idea里面写的

这个是编译后用反编译软件打开的。

结果就是:

java在编译的时候,对于静态字符串的连接操作,就已经在编译时合成了一个单独的字符串了。

StringBuilder则需要如实调用,所以时间长。

以上就是String的坑!

再补充一点,如果是String的变量的累加,那又是怎么样的呢?

String str1 = "aaa";

String str2 = "bbb";

String str3 = "ccc";

String str4 = "ddd";

String str = str1+str2+str3+str4;

这样和StringBuilder的比,哪个更快呢?

结果是:性能差不多!

因为在编译的时候,最后一句会被编译成

String str = (new StringBuilder(String.valueOf(str1))).append(str2).append(str3).append(str4).toString();

就是编译时,就已经做过处理了,这些看起来很慢的代码,实际并不慢。

本文分享自微信公众号 - java工会(javagonghui),作者:小明同学

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-01-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java设计模式-建造者模式

    三哥
  • Java爬虫Get校花网所有美女图片

    三哥
  • 美团云计算方面面试题

    三哥
  • java常见面试题之String

    招聘季节分享一些干货,这篇推文分享在面试中遇到的String类的面试题,算是面试中的常客,有问题请指出,谢过...

    爱敲代码的猫
  • Java工具集-文字(WordUtils)

    cwl_java
  • Day43:左旋转字符串

    思路一:   直接用暴力法,从开始截取n位,放到字符串后方。我们用java实现该思路:

    stefan666
  • python str转bool方法

    py3study
  • Python3 与 C# 基础语法对比(String专栏)

    Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

    逸鹏
  • Python3 与 C# 基础语法对比(String专栏)

    Python3 与 C# 基础语法对比:https://www.cnblogs.com/dotnetcrazy/p/9102030.html

    逸鹏
  • lang3 的 split 方法误用

    apache 的 lang3 是我们开发常用到的三方工具包,然而对这个包不甚了解的话,会产生莫名其秒的 bug ,在这里做下记录。

    haifeiWu

扫码关注云+社区

领取腾讯云代金券