难道面试官想考String的什么?
面试官:说一下你知道的String、StringBuffer和StringBuilder的区别
我:其实总结说一下就行,三点不同
简单的来说:String
类中使用 final
关键字修饰字符数组来保存字符串,private final char value[]
,所以 String
对象是不可变的。
StringBuilder
与 StringBuffer
都继承自 AbstractStringBuilder
类,在 AbstractStringBuilder
中也是使用字符数组保存字符串char[]value 但是没有用 final
关键字修饰,所以这两种对象都是可变的。
- String
中的对象是不可变的,也就可以理解为常量,线程安全。
- AbstractStringBuilder
是 StringBuilder
与 StringBuffer
的公共父类,定义了一些字符串的基本操作,如 expandCapacity
、append
、insert
、indexOf
等公共方法。StringBuffer
对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder
并没有对方法进行加同步锁,所以是非线程安全的。
- 每次对 String
类型进行改变的时候,都会生成一个新的 String
对象,然后将指针指向新的 String
对象。
- StringBuffer
每次都会对 StringBuffer
对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StringBuilder
相比使用 StringBuffer
仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。
总结:
操作少量的数据: 适用String
单线程操作字符串缓冲区下操作大量数据: 适用StringBuilder
多线程操作字符串缓冲区下操作大量数据: 适用StringBuffer
面试官:有木有想过为什么String的char前面加了final,有什么好处?
我:答这个问题,你要先说final是干啥的
final关键字主要用在三个地方:变量、方法、类。
对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。
当用final修饰一个类时,表明这个类不能被继承。final类中的所有成员方法都会被隐式地指定为final方法。
使用final方法的原因有两个。第一个原因是把方法锁定,以防任何继承类修改它的含义;第二个原因是效率。在早期的Java实现版本中,会将final方法转为内嵌调用。但是如果方法过于庞大,可能看不到内嵌调用带来的任何性能提升(现在的Java版本已经不需要使用final方法进行这些优化了)。类中所有的private方法都隐式地指定为final。
final修饰有啥好处
final的关键字提高了性能,JVM和java应用会缓存final变量;
final变量可以在多线程环境下保持线程安全;
使用final的关键字提高了性能,JVM会对方法变量类进行优化;
面试官:说一下String.intern()干嘛用的?
我:去字符串常量池拿吃的
执行intern()方法时,若常量池中不存在等值的字符串,JVM就会在常量池中创建一个等值的字符串(这句话很重要),然后返回该字符串的引用。
执行intern操作时,如果常量池已经存在该字符串,则直接返回字符串引用,否则复制该堆中字符串对象的引用到常量池(堆对象引用复制到常量池)中并返回。
简单说一下常量池版本的变化
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。