JAVA面试题----------String、StringBuilder和StringBuffer

本文详细解析了Java中的String、StringBuilder及StringBuffer的区别与应用场景。重点介绍了它们的内部实现机制,包括线程安全性、效率对比以及字符串拼接时的性能表现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String

是java中的引用数据类型,String类是一个final类,不可以被继承,底层使用char数组实现的,因为数组被final修饰所以不可以动态的改变对象的值,是字符串常量,那么显然是线程安全的

 String s1="hello";

String s1="world";

如上不是改变了s1的值,而是s1指向了新的地址,"hello"还在常量池中

字符串的拼接

 String s1="hello";

String s2="world";

String s3=s1+s2;

或者String s3=new String("hello")+new String("word")

就需要创建3个对象,空间浪费,效率慢,而使用那两个类就可以用append方法

new StringBuilder().append("hello").append("world")

只需要创建一个对象,效率快

区别于String s="hello"+"world";这样效率是最快的,因为JVM根本认为就是String s="helloworld";

StringBuilder和StringBuffer都继承自AbstractStringBuilder

StringBuilder

线程不安全,效率高,数组初始容量是16,数组动态扩容,如果长度超过了字符串存储空间大小就需要进行扩容,它会重新分配内存,创建一个更大的数组,这个数组的容量是原来的 2 倍 + 2 的大小,并将原先的数组复制过来,再丢弃旧的数组,扩容方法在AbstractStringBuilder中

StringBuffer

线程安全,效率低,数组初始容量是16,数组动态扩容,如果长度超过了字符串存储空间大小就需要进行扩容,它会重新分配内存,创建一个更大的数组,这个数组的容量是原来的 2 倍 + 2 的大小,并将原先的数组复制过来,再丢弃旧的数组

基本原则:如果要操作少量的数据,用String ;单线程操作大量数据,用StringBuilder ;多线程操作大量数据,用StringBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值