微信号:CodePush

介绍:为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源;提供最新最全的编程学习资料:PHP、Objective-C、Java、Swift、C/C++函数库、.NET Framework类库、J2SE API等等.并不定期奉送各种福利.

Java面试题—字符串

2018-02-11 10:24 程序员大咖

点击上方“程序员大咖”,选择“置顶公众号”

关键时刻,第一时间送达!


如果明天你要参加一场面试,面试官有个题目是:说说String/StringBuffer/StringBuilder它们之间的区别?你会怎么回答呢?(脑补一下答案)今天,小编就来和大家详细聊聊字符串String/StringBuffer/StringBuilder,告诉你怎样完美的回答以上面试官的问题,希望对你有帮助。



考点分析

这个题目也是考查字符串相关的。对于这个题目,我们通过阅读源码来验证我们的答案。


上图主要显示String/StringBuilder/StringBuffer的UML结构。


为什么要引入其它两种字符串处理类?

说白了就是提高字符串连接效率。在大部分情况下,字符串的拼接速度为:StringBuilder>StringBuffer>String。

String是不可变的,因此每次对其操作改变其变量值,其实是生成一个新的对象,然后将变量引用指向新对象;因此速度慢。

StringBuffer则不同,对其操作即直接操作对象指向的引用,无需产生新对象,速度很快;它是线程安全的,在维护多线程的同步等也会消耗一点性能。

StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。


是否线程安全?

String 字符串常量(线程安全)。StringBuffer 字符串变量(线程安全)。StringBuilder 字符串变量(非线程安全)。

String 是不可变的,StringBuffer/StringBuilder 是可变的;String/StringBuffer是线程安全的,StringBuilder是非线程安全的。


这里引入来一个新的问题,了解String.intern()方法吗?


String.intern()查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用。因此在用String进行字符串拼接时,会产生很多临时变量。建议多使用StringBuffer/StringBuilder。


存放在什么地方?


String是存放在常量池,在编译期已经被确定了。new String()不是字符串常量,它有自己的地址空间,存放在堆空间。而其它两个都存放在堆空间。



  • http://mp.weixin.qq.com/s/ZOKUMpcJHZ2IhG7QlIFArw

  • 程序员大咖整理发布,转载请联系作者获得授权

【点击成为Python大神】

 
程序员大咖 更多文章 程序员,你能真正掌握多少编程技术? 当亲戚问你工资,程序猿如何作答,简直不能再机智 黑客是如何发现女朋友出轨的 重磅!谷歌突然宣布!百度、滴滴懵了 华为年终分红曝光!应届生最高20万,老员工最高300万
猜您喜欢 以Xp0intCTF的so fun为例利用Zjdroid安卓脱壳步骤(以及排查出错问题) HULK虚拟化平台(奥创)--OpenStack跨版本升级实践 百度MTC在第三届中国移动互联网测试开发大会上发布iOS远程真机调试解决方案 关键七步,用Apache Spark构建实时分析Dashboard kubernetes在测试中的应用实践