Bootstrap
之前在C#中可以任何情况使用==来比较两个字符串,在Java中有些数情况不可以用==来比较。之前就被坑了。本文就来介绍一下他们之间有什么区别和不同。

1、双等号(==)

==是比较引用是否相等,判断他们是否是同一个对象。

2、.equals()

equal()判断他们是否是值相等,逻辑上的相等。

Objects.equals() 方法调用之前必须要判断对象是否是null(JDK7)。

String.contentEquals(CharSequence cs) 比较String与CharSequence是否等(Java 1.5)

3、String str="abc" 和String str = new String("abc")创建字符串区别

String str="abc"创建字符串,如果String常量池中有个字符串,则str就指向"abc"内存象地址,多次声明"abc",内存中只会有一个"abc"。

String str = new String("abc")创建字符串,不管String常量池中是否有个字符串,都会重新分配,然后str指向它。内存中可能会有两个不同内存地址的"abc"。

4、字符串比较

如果只是比较两个字符的值,应该用Objects.equals(),而==只能用判断临时字符串是否等。下面看下示例代码,

//比较两个值一样的字符串
new String("test").equals("test") // --> true 
//比较字符串值一样,但不同的对象
new String("test") == "test" // --> false 
//比较字符串值一样,但不同的对象
new String("test") == new String("test") // --> false 
//临时字符串,他们是相同的对象,编译器会临时中间字符串有优化,相同值只会在String池中存一份。
"test" == "test" // --> true 
"test" == "te" + "st" // --> true
//最好这样调用,如果字符串对象是null,也不会报错。
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true