我們來看看以下的字串比較
void stringCompareTest(){
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
System.out.println("abc" == s1);
}
會顯示什麼呢?
1.true/false?
2.true/treue?
3.false/true?
4.false/false?
答案是2
看起來是兩個相同型別的物件(字串)值為 "abc"應該很好理解
我們來看下一個範例
void stringCompareTest(){
String o1 = new String("abc");
String o2 = new String("abc");
System.out.println(o1 == o2);
System.out.println("abc" == o1);
}
會顯示什麼呢?
1.true/false?
2.true/treue?
3.false/true?
4.false/false?
答案是4
o1 和 o2 第1個範例來講不是很像嗎?
但是差別在new 出1個物件。
以生活化的例子來說,買2片雞排1片75塊。
這2個雞排是完全獨立的2個雞排,不會是相同的。
雞排 o1 =new 雞排(75);
雞排 o2 =new 雞排(75);
相等的是價格!
可能例子不好,突然想到的XD
那 "abc" 和 o1為什麼是flase?
依據剛上面的說明大家應該可以想到,
o1是物件,而"abc"是值,所以2者不相同
那我們要怎麼做值的比較呢?
- o1.equals(o2);
- StringUtils.equals(o1,o2);
StringUtils 是1個另外的套件需要依賴注入
我們可以去這個網站下搜尋我們想要注入的套件https://mvnrepository.com/
點擊pom.xml
在中加入找的套件,如下方範例
<dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
</dependencies>
像是最一開始有說明spring web、lombok 如果沒有選到其去後續也可以另外注入
就是透過以上的方式。
說回來上方兩個方法可以進行值的比對
那回歸一下
我相信有些人可能已經混亂了
為什麼最一開始讀
String s1 = "abc";
String s2 = "abc";
s1==s2 true?
"abc" == s1 true?
"abc" == s1
這不是也是 "abc" 值和s1物件相比嗎,為什麼不是false?
String 字串這個型別比較特別,你可以想像一下他有一個 字串池(String pool)
只要 "這樣寫出來" 字串都是唯一的,不會因為你用不同的物件去接就是不同物件。
我們也可以理解成,當"這樣寫出來" 已經有1位置存放,之後不是new出來的物件。
都還是使用原來的字串(指向那個字串)。
因此"abc" 已經在String pool(字串池)然後有其他物件去接/指向它,所以直接比較都會是相同的。
像是第2個範例,因為new 出來表示有新的位置存放它。就和String pool內的""不相同了
希望這樣的說明清楚地讓大家了解這些微的差異
下一篇和大家說明一下如何進行比較
補充:
這不是一個給新手的一個教學過程,也寫的不是很完整
希望大家多多包涵囉~
主要是給自己的一個紀錄,也分享給有需要的夥伴
這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。