JavaSE 打磨String種種細(xì)節(jié) 避坑指南

前言

細(xì)節(jié),是很重要的東西

寫代碼的時候,一些不經(jīng)意的細(xì)節(jié),可以看出一個人是否優(yōu)雅

比如

注釋

總所周知,注釋有兩種

// 這是一個單行注釋

/* 
  這是一段多行注釋
*/

但是其實,注釋還有一種,那就是 注釋文檔

/** 
 *  這是一段文檔注釋,
 *  你學(xué)會了嗎
*/

文檔注釋內(nèi)容包含在/** 和 */ 之間,也能注釋多行內(nèi)容,

一般用在類、方法和變量上面,用來描述其作用。

注釋后,鼠標(biāo)放在類和變量上面會自動顯示出我們注釋的內(nèi)容

再比如 命名

  • 包 package 用小寫
  • 類 存放在包中 首字母大寫

今天,咱們就來打磨打磨String字符串的細(xì)節(jié),看看這里面有多少坑

正文

什么是String類

java.lang.String類代表字符串。

Java程序中所有字符串文字都可以被看成實現(xiàn)此類的實例。

字符串屬于對象,Java提供了String類來創(chuàng)建和操作對象。

  • 只要創(chuàng)建了一個String對象就不能再在修改它的值
  • 操作修改某個字符串的內(nèi)容或長度,都將返回一個新的String對象
  • 字符串即一連串的字符,這些字符都必須包含在一對英文雙引號內(nèi)
  • String類為final類,不能被繼承

細(xì)節(jié)一 判斷字符串相等

我們知道,判斷相等有兩種意義上的相等,

  • 值相等
  • 地址相等

==

它的作用是判斷兩個對象的地址是不是相等。即,判斷兩個對象是不是同一個對象。

(基本數(shù)據(jù)類型==比較的是值,引用數(shù)據(jù)類型==比較的是內(nèi)存地址)

equals() :

它的作用也是判斷兩個對象是否相等。但它一般有如下使用情況:

  • 類沒有覆蓋equals()方法。則通過equals()比較該類的兩個對象時,等價于通過“==”比較這兩個對象。
  • 類覆蓋了equals()方法。一般,我們都覆蓋equals()方法來兩個對象的內(nèi)容相等;若它們的內(nèi)容相等,則返回true (即,認(rèn)為這兩個對象相等)。
  • String默認(rèn)情況下調(diào)用equals()判斷的是值是否相等,即內(nèi)容上的相等

接下來我將通過幾個代碼來演示:

package com.kzb.helloworld;

public class demo {
    public  static void main(String[] args) {
        String s1 = "hello";
        String s2 = "hell" + "o";
        System.out.println("他們內(nèi)容是否是相等的?:" + (s1.equals(s2)));
        System.out.println("他們地址是否是相等的?:" + (s1 == s2));
    }
}

很顯然,他們不管內(nèi)容還是地址,都是相等的

因為,

你永遠(yuǎn)可以相信jvm底層,相信Java背后強大的團(tuán)隊做的優(yōu)化

這里的字符串,沒有用new String()實例化出來

那么他就會被創(chuàng)建在字符串常量池,但是,常量池就這么點,終不能誰來了都給他建一個

hello來了建hello hell來了建hell o來建o

····想peach吃呢,肯定是有底層判斷過了,既然hello有了,既然兩個最終內(nèi)容都是hello,那就只建一個吧

再來幾段代碼搞搞各位心態(tài):

package com.kzb.helloworld;

public class demo {
    public  static void main(String[] args) {
//        String s1 = "hello";
        String s2 = "hell" + "o";
//        System.out.println("他們內(nèi)容是否是相等的?:" + (s1.equals(s2)));
//        System.out.println("他們地址是否是相等的?:" + (s1 == s2));

        String s3 = "hell";
        s3 = s3 + "o";
        System.out.println("s3/s2內(nèi)容是否是相等的?:" + (s3.equals(s2)));
        System.out.println("s3/s2地址是否是相等的?:" + (s3 == s2));

    }
}

納尼,說好的永遠(yuǎn)可以相信jvm底層,相信Java背后強大的團(tuán)隊做的優(yōu)化

怎么現(xiàn)在不行了

這個畢竟被初始化過了,你后面再修改,人家也不能預(yù)判到,所以呃你懂的。

還沒完,再來段代碼:

package com.kzb.helloworld;

public class demo {
    public  static void main(String[] args) {
        String str1 = "stud";
        String str2 = "I love " + str1;
        String str3 = "I love " + str1;
        System.out.println("str3/str2內(nèi)容是否是相等的?:" + (str3.equals(str2)));
        System.out.println("str3/str2地址是否是相等的?:" + (str3 == str2));
//        String s1 = "hello";
//        String s2 = "hell" + "o";
//        System.out.println("他們內(nèi)容是否是相等的?:" + (s1.equals(s2)));
//        System.out.println("他們地址是否是相等的?:" + (s1 == s2));

//        String s3 = "hell";
//        s3 = s3 + "o";
//        System.out.println("s3/s2內(nèi)容是否是相等的?:" + (s3.equals(s2)));
//        System.out.println("s3/s2地址是否是相等的?:" + (s3 == s2));
    }
}

Java妙,妙不可言,

細(xì)品,細(xì)品

絕對不是我不會講,咳咳

細(xì)節(jié)二 結(jié)合方法,傳參

package com.kzb.helloworld;

public class demo {
    public  static void main(String[] args) {

        String a = "Hello world!";
        change(a);
        System.out.println(a);
    }
    public static void  change (String a) {
        a = "no hello world";
    }
}

這個就很好理解,因為是值傳遞,傳遞的是數(shù)據(jù)內(nèi)容

方法內(nèi)對這個值再怎么修改

都不對原來的變量參數(shù)影響

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容