1)判断String类型的 s1 和 s2 是否相等
equals() 方法比较的是字符串的内容~所以结果是 true 很好理解,至于 str1==str2 的结果也是 true ,是因为在 Java 的内存的方法区中有一块区域叫做常量池,str1 =“abc” 时,常量池中没有 “abc”,所以就 new 一个 “abc” 当运行 str2 = “abc” 时,常量池中存在 “abc” ,系统就会把 常量池中的 “abc” 的引用直接给 str2 所以 str1==str2 的结果为 true,因为它们的引用是一样的~
2)判断String类型的 s1 和 s2 是否相等
这个和上一题很像,但是 str1 是 new string() ,在 Java 中,new 一个对象就会在内存的堆中开辟一块空间,然后把引用赋值给 str1 ,一个是堆中的引用,一个是常量池中的引用所以,str1==str2 的结果为 false~~
3)判断String类型的 s1 和 s2 是否相等
这个 str1==str2 为何为 true 小伙伴们知道吗?嘿嘿因为在Java中有一种叫做常量优化的机制,我们在赋值的时候 “a”,“b”,“c”都是常量,系统及直接把 abc 赋值给 str1 了,这时候常量池中也就存在 “abc” 了,所以str1==str2
4)判断String类型的 s1 和 s2 是否相等
那么这里呢?通过查找API我们可以得到这样一段话~ 『Java 语言提供对字符串串联符号("+")以及将其他对象转换为字符串的特殊支持。字符串串联是通过 StringBuilder(或 StringBuffer)类及其 append 方法实现的。字符串转换是通过 toString 方法实现的...』
也就是说当执行 str3=str1+c 的时候,首先在堆中生成一个StringBuilder(或StringBuffer)对象,然后把 ab 和 c 连接在一起 ,再利用 toString 方法生成一个 “abc”的字符串 再来进行比较..str2 的 “abc” 在常量池中,str3 在堆中所以为false~
原文地址:https://www.cnblogs.com/cmyBlog/p/9796896.html