前言
細(xì)節(jié)纫溃,是很重要的東西
寫代碼的時(shí)候,一些不經(jīng)意的細(xì)節(jié)韧掩,可以看出一個(gè)人是否優(yōu)雅
比如
注釋
總所周知紊浩,注釋有兩種
// 這是一個(gè)單行注釋
/*
這是一段多行注釋
*/
但是其實(shí),注釋還有一種,那就是 注釋文檔
/**
* 這是一段文檔注釋坊谁,
* 你學(xué)會(huì)了嗎
*/
文檔注釋內(nèi)容包含在/** 和 */ 之間费彼,也能注釋多行內(nèi)容,
一般用在類口芍、方法和變量上面箍铲,用來描述其作用。
注釋后鬓椭,鼠標(biāo)放在類和變量上面會(huì)自動(dòng)顯示出我們注釋的內(nèi)容
再比如 命名
- 包 package 用小寫
- 類 存放在包中 首字母大寫
今天颠猴,咱們就來打磨打磨String字符串的細(xì)節(jié),看看這里面有多少坑
正文
什么是String類
java.lang.String類代表字符串小染。
Java程序中所有字符串文字都可以被看成實(shí)現(xiàn)此類的實(shí)例翘瓮。
字符串屬于對(duì)象,Java提供了String類來創(chuàng)建和操作對(duì)象裤翩。
- 只要?jiǎng)?chuàng)建了一個(gè)String對(duì)象就不能再在修改它的值
- 操作修改某個(gè)字符串的內(nèi)容或長(zhǎng)度资盅,都將返回一個(gè)新的String對(duì)象
- 字符串即一連串的字符,這些字符都必須包含在一對(duì)英文雙引號(hào)內(nèi)
- String類為final類踊赠,不能被繼承
細(xì)節(jié)一 判斷字符串相等
我們知道呵扛,判斷相等有兩種意義上的相等,
- 值相等
- 地址相等
== :
它的作用是判斷兩個(gè)對(duì)象的地址是不是相等筐带。即今穿,判斷兩個(gè)對(duì)象是不是同一個(gè)對(duì)象。
(基本數(shù)據(jù)類型==比較的是值伦籍,引用數(shù)據(jù)類型==比較的是內(nèi)存地址)
equals() :
它的作用也是判斷兩個(gè)對(duì)象是否相等荣赶。但它一般有如下使用情況:
- 類沒有覆蓋equals()方法。則通過equals()比較該類的兩個(gè)對(duì)象時(shí)鸽斟,等價(jià)于通過“==”比較這兩個(gè)對(duì)象。
- 類覆蓋了equals()方法利诺。一般富蓄,我們都覆蓋equals()方法來兩個(gè)對(duì)象的內(nèi)容相等;若它們的內(nèi)容相等慢逾,則返回true (即立倍,認(rèn)為這兩個(gè)對(duì)象相等)。
- String默認(rèn)情況下調(diào)用equals()判斷的是值是否相等侣滩,即內(nèi)容上的相等
接下來我將通過幾個(gè)代碼來演示:
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)容還是地址寝志,都是相等的
因?yàn)椋?/p>
你永遠(yuǎn)可以相信jvm底層,相信Java背后強(qiáng)大的團(tuán)隊(duì)做的優(yōu)化
這里的字符串,沒有用new String()實(shí)例化出來
那么他就會(huì)被創(chuàng)建在字符串常量池材部,但是毫缆,常量池就這么點(diǎn),終不能誰來了都給他建一個(gè)
hello來了建hello hell來了建hell o來建o
····想peach吃呢乐导,肯定是有底層判斷過了苦丁,既然hello有了,既然兩個(gè)最終內(nèi)容都是hello物臂,那就只建一個(gè)吧
再來幾段代碼搞搞各位心態(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背后強(qiáng)大的團(tuán)隊(duì)做的優(yōu)化
怎么現(xiàn)在不行了
這個(gè)畢竟被初始化過了淘太,你后面再修改,人家也不能預(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ì)品
絕對(duì)不是我不會(huì)講官撼,咳咳
細(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";
}
}
這個(gè)就很好理解,因?yàn)槭侵祩鬟f傲绣,傳遞的是數(shù)據(jù)內(nèi)容
方法內(nèi)對(duì)這個(gè)值再怎么修改
都不對(duì)原來的變量參數(shù)影響