我們來看看以下的字串比較

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者不相同

那我們要怎麼做值的比較呢?

  1. o1.equals(o2);
  2. 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內的""不相同了

希望這樣的說明清楚地讓大家了解這些微的差異

下一篇和大家說明一下如何進行比較

補充:

這不是一個給新手的一個教學過程,也寫的不是很完整
希望大家多多包涵囉~

主要是給自己的一個紀錄,也分享給有需要的夥伴

這是一個心血來潮,產生的文章
若有喜歡或交流的部分都歡迎在下方留言,多多關照。

#java 17 #spring boot







你可能感興趣的文章

網際網路是什麼?

網際網路是什麼?

margin 與 padding 差別在哪裡?

margin 與 padding 差別在哪裡?

給自己看的 JS 進階-Closure

給自己看的 JS 進階-Closure






留言討論