10String,StringBuffer,StringBuilder(equals和==)

1String

1.1String字符串常量

  • String只有常量没有变量
    String的值放在String常量池中,并且不会被JVM释放

上栗子:

		String str1 = new String("abc");
		String str2 = new String("abc");
		System.out.println(str1==str2);		//false
		System.out.println(str1.equals(str2));	//true
		
		String str3 = "abc";
		String str4 = "abc";
		System.out.println(str3==str4);		//true
		System.out.println(str3.equals(str4));	//true

输出结果是:

false
true
true
true
疑问:str1==str2是false,而str3==str4就为true。(前者是比较引用(用了new),后者是赋值比较)。

str1.equals(str2)为true。(equals是比较引用的值)(其实equals和==本质上没区别,只是String重写了equals方法)

看内存模型解析:

解析:

str1和str2都是new出来的,所以str1和str2分别指向堆中的内存块。但注意的是String值不是在堆中的,而是在String常量池中,所以说String是常量字符串。

并且它的值是不会被释放的,而是一直停留在常量池中(就算是没有被引用夜不会被释放),例如:

		String str1 = "abc";
		str1 = "dfg";
		str1 = "ttt";
看内存:只画String常量池

执行完语句后str1最终指向了ttt,但其它的abc,dfg都还会存在内存中,不会被JVM回收。



2Stringbuffer和StringBuilder

其实这两个类都差不多,只不过一个线程安全(StringBuffer),一个线程不安全(StringBuilder),一般来说String类不会晕倒线程不安问题,建议使用StringBuilder(线程不安的速度快)

因为String是字符串,所在拼接字符串操作会产生大量内存,StringBuilder就能很好的解决这个问题

看栗子:
这段代码会拼接100次字符串就会有100块内存,但是有用的只有最后一块

	String str = "";
		for(int i=0;i<100;i++){
			//拼接字符串,这就要拼接100次
			str = str+i;
		}
		System.out.println(str);//输出结果是:01234.......99
看内存:只画了String常量池

所以就需要用StringBuilder来解决这个问题。

上栗子:

		//实例化Stb
		StringBuilder stb = new StringBuilder("");
		
		for(int i=0;i<100;i++){
			//用append()方法拼接
			stb.append(i);
		}
		
		System.out.println(stb);//输出结果是:01234.......99

所以建议在做拼接字符串处理的是用StringBUilder





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值