前言
細(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ù)影響