java菜鸟面试之String(二)

1.String, StringBuffer , StringBuilder区别

1.1 长度是否可变

String 不可变

StringBuffer 和 StringBuilder 可变

1.2 是否线程安全

String 不可变,因此是线程安全的
StringBuilder 不是线程安全的

StringBuffer 是线程安全的,内部使用 synchronized 来同步

在stackoverflow 上大神的回答如下:


大概的意思:

可变性差异:

String不可变的,如果你试图改变它们的值,那么另一个对象被创建,StringBufferStringBuilder可变的,所以他们可以改变它们的值。

线程安全差异:

StringBufferStringBuilder之间的差异在于是否是线程安全的。所以当应用程序只需要在单个线程中运行时,最好使用它StringBuilderStringBuilderStringBuffer更有效率

2.String 字符串为什么不可变

2.1 可以缓存 hash 值

因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。


2.2 String Pool 的需要

如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。


2.3. 安全性

String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。


2.4. 线程安全


String 不可变性天生具备线程安全,可以在多个线程中安全地使用。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值