String、StringBuilder、StringBuffer

本文详细解析了Java中String、StringBuilder和StringBuffer的区别与使用场景,包括它们在内存分配、效率和线程安全方面的特性,以及如何在实际开发中选择合适的字符串操作工具。

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

一,

      String   字符串常量;

      StringBuilder 字符串变量;

      StringBuffer  字符串变量;

单从字面的意思可知,String是“字符常量”,是不可变的对象,可能有人会不同意,因为:

package string;

public class StringN {
	
	public static void main(String[] args) {
		String s="aa";
		System.out.println(s);
		s="bb";
		System.out.println(s.toString());
	}
}
输出结果:

aa
bb
变量s明明已经改变了。表面上是改变了,实际上第二个s已经不是第一个s了;JVM对这段代码的解释:先创建一个对象s,赋值“aa”

。执行s=“bb”时,再创建一个新的对象s,赋值“bb”。因此每一次赋值都是在创建新的对象。因此说String对象是不可变的,也因此效

率很低。


在效率方面:StringBuilder》StringBuffer》String;

StringBuffer相对StringBuilder来说是线程安全的。通常我们使用字符串操作,都是在单线程中,因此推荐使用StringBuilder。


二,

    字符串缓冲池:

package string;

public class StringN {
	
	public static void main(String[] args) {
		String s0=new String("abc");
		String s1="abc";
		String s2=new String("abc");
		
		System.out.println(s0==s1);
		System.out.println(s0==s2);
		System.out.println(s1==s2);
	}
}
输出结果:

false
false
false

    String s0=new String("abc");代码执行流程是:现在String pool中查找有没有值为“abc”的对象,没有就在String pool中创建

一个值为“abc”的对象,然后在利用new 的方式在有创建了一个值为“abc”的对象;这个对象放在内存堆中,s0引用指向堆中的对象。

    String s1=“abc”;在String Pool中查找有没有值为“abc”的对象,没有就在String pool中创建。有就直接将String pool中对象

赋值给s1;

    String s2=new String("abc");与第一行代码是一样的。

因此三个值都不一样。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值