String与StringBuffer及StringBuilder 讨论

就标题而言,我们先来讨论讨论String与StringBuffer及StringBuilder的区别。

String  内容不可变的,而StringBuffer   StringBuilder 内容都是可变的。

StringBuffer是线性安全的,但是效率低。

 StringBuilder是线性不安全的,但是效率高。

 

StringBuffer 与数组有什么区别​?​

两者都可以看作容器来撞入其他数据,但是StringBuffer的最终数据是一个字符串数据,

而数组可以放置多种数据,但必须是同一种数据。

 

形参问题

我们看下面一段代码,来是分析结果--->


public class StringDemo {
	public static void main(String[] args) {
		String s1 = "Hello";
		String s2 = "World";
		
		System.out.println(s1 + "----" + s2);
		change(s1, s2);
		System.out.println(s1 + "----" + s2);
		
		StringBuffer s3 = new StringBuffer(s1);
		StringBuffer s4 = new StringBuffer(s2);
		
		System.out.println(s3 + "----" + s4);
		change(s3, s4);
		System.out.println(s3 + "----" + s4);

	}

	public static void change(String s1, String s2) {
		s1 = s2;
		s2 = s1+s2;
	}
	public static void change(StringBuffer s3, StringBuffer s4) {
		s3 = s4;
		s3 = s3.append(s4);
	}
	

}

---------建议自己思考一下结果。

结果:

Hello----World
Hello----World
Hello----World
Hello----WorldWorld

看到结果,是否与自己想到的相同,如果不同,让我来看看​为啥子不同?​

加断点调试:

进入方法,进入22行​,看结果,发现s1 变了:

 

切换到​main方法,发现s1 没有变化:

继续走,走到第二个change方法​,查看结果​:

发现结果是:Hello----World。

原因在于String 在形式参数中 在这里是一个常量,所以内容不会变化​。

我们继续走​,进入change方法中,观察结果:

最后s4 结果变化了。

原因在于s3 = s4 的时候是引用,所以s3.append(s4)其实相当于s4.append(s4),所以s4 为WorldWorld。然后有 s3 = s3.append(s4);即相当于s3 = s4了,不会产生那个影响。

 

最后为啥​s3 没有发生变化呢?与上面一样了在形式参数中 在这里是一个常量​。

 

​嗯大概就是这个样子了!

若有​错误,欢迎留言指导!​!​

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
StringStringBufferStringBuilder都是用于处理字符串的类,它们之间的区别如下: 1. 可变性:String 类是不可变的,即一旦创建,它的值无法改变。每次对 String 进行修改时,都会创建一个新的 String 对象。而 StringBufferStringBuilder 类是可变的,可以直接对其进行修改,而不会创建新的对象。因此,在需要频繁修改字符串的情况下,使用 StringBufferStringBuilder 会更高效。 2. 线程安全性:String 类是线程安全的,因为它的不可变性可以保证多个线程同时访问时不会出现竞争条件。而 StringBuffer 是线程安全的,它的方法都使用了 synchronized 关键字进行同步。而 StringBuilder 是非线程安全的,不提供同步操作,适用于单线程环境。 3. 性能:由于 String 是不可变的,每次修改都会创建一个新的对象,这会带来一定的性能开销。而 StringBufferStringBuilder 是可变的,可以直接在原有对象上进行修改,避免了频繁创建对象的开销。在性能要求较高的场景下,使用 StringBufferStringBuilder 会比 String 更合适。 根据具体的需求,选择适合的类来处理字符串。如果字符串不需要修改或线程安全性很重要,则使用 String 类;如果需要频繁修改字符串且线程安全性要求较高,则使用 StringBuffer;如果需要频繁修改字符串且不涉及多线程环境,则使用 StringBuilder

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值