- String s1=new String(“abc”)创建了几个对象?
我们知道在内存中有栈、堆、常量池
那么就好说了。
1.现在栈中创建一个String s1
2.然后常量池中创建"abc"
3.new String 就是在堆中创建一个对象
4.将常量池"abc"拿出来赋值给堆的new String 再将堆的地址传给String s1
常量池”abc“ 和 new String 是两个对象
2.S1="abc“;S2=“abc”
s1==s2?
s1.equals(s2)?
两个都是ture
- ==可以比较基本数据类型和引用类型变量
基本数据类型的变量,则直接比较其存储的 “值”是否相等
引用类型比较的是地址,String是引用型比较地址 abc的地址为同一个。 - .equals比较的是对象
将当前对象(S1)和(S2)比较,当两个字符串一样时才返回ture
3.s1=new String(“abc”); s2=“abc”
s1==s2?
s1.equals(s2)?
==是false
equals为 ture
- == 由上题知,引用类型比较的是地址。s1的地址为堆内存地址,s2为常量池地址
4.s1=“a”+“b”+“c”; s2=“abc”
s1==s2?
s1.equals(s2)?
还是两个ture
这里很多人会有疑问了。== 不应该是false么
这里涉及到JAVA的常量优化机制
在编译时s1=“abc”,当到了s2时,常量池中有”abc“直接用
所以 s1 == s2 是同一地址返回ture
5.s1=“ab”;s2"abc";
s3=s1+“c”
s3==s2?
s3.equals(s2)?
false ture
字符串拼接是通过tostring完成的,即s3的地址为toString的地址