Java基础:(String,StringBuffer,StringBuilder的区别) 以及 (== 和 equals 的区别)

执行速度:StringBuilder > StringBuffer > String

1. String:是不可变的,但是为什么我们能重新赋值了?其实是在我们赋值的时候,String创建了新的对象,并且把指向的地址改为新的对象的地址,才会造成我们认为它重新赋值的错觉

2. StringBuffer,StringBuilder:是可变的,都是在原字符上操作
区别:
StringBuffer是线程安全,适用于多线程
StringBuilder是线程不安全,适用于单线程

Question:

public class Test{
	public void a(){
		String s1 = "张三";
		String s2 = "张三";
		String s3 = new String("张三");
		String s4 = new String("张三");
		
		System.out.println(s1 == s2); //true
		System.out.println(s2 == s3); //false
		System.out.println(s3 == s4); //false
	}
}

解:
String s1 = “张三” 是一种非常特殊的形式,和new 有本质的区别。

它是java中唯一不需要new 就可以产生对象的途径。

以String s="abcd"的形式赋值在java中叫直接量,它是在常量池中而不是象new一样放在堆中。

这种形式的字符串,在JVM内部发生字符串拘留,即当声明这样的一个字符串后,JVM会在常量池中先查找有没有一个值为"张三"的对象,如果有,就会把它赋给当前引用.即原来那个引用和现在这个引用指向了同一对象, 如果没有,则在常量池中新创建一个"张三",下一次如果有String s1 = “张三”;又会将s1指向"张三"这个对象,即以这形式声明的字符串,只要值相等,任何多个引用都指向同一对象.


==:基本类型比较值,引用类型比较引用对象地址
equals:一般用来比较String类型的值是否相等


参考:

String和StringBuffer的具体区别?
MrBoringBigFish - 优美的讲解equals和==的区别
享元模式
pt666 - 堆和栈的概念和区别
Latiny - Java 基本数据类型 及 == 与 equals 方法的区别

你可能感兴趣的:(java)