在 Java 中,字符串被作為 String 類(lèi)型的對(duì)象處理装黑。String 類(lèi)位于 java.lang 包中副瀑。默認(rèn)情況下,該包被自動(dòng)導(dǎo)入所有的程序恋谭。
Java 中字符串的不變性
String 對(duì)象創(chuàng)建后則不能被修改糠睡,是不可變的,所謂的修改其實(shí)是創(chuàng)建了新的對(duì)象箕别,所指向的內(nèi)存空間不同铜幽。
注意:
- 一旦一個(gè)字符串在內(nèi)存中創(chuàng)建滞谢,則這個(gè)字符串將不可改變串稀。如果需要一個(gè)可以改變的字符串,我們可以使用StringBuffer或者StringBuilder狮杨。
- 每次 new 一個(gè)字符串就是產(chǎn)生一個(gè)新的對(duì)象母截,即便兩個(gè)字符串的內(nèi)容相同,使用 ”==” 比較時(shí)也為 ”false” ,如果只需比較內(nèi)容是否相同橄教,應(yīng)使用 ”equals()” 方法清寇。
String 類(lèi)的常用方法
1喘漏、獲取
1.1 獲取字符串的長(zhǎng)度
length();
1.2 獲取指定位置的字符
char charAt(int index);
1.3 獲取指定字符的位置。如果不存在返回 -1华烟。
int indexOf(int ch);
// 返回第一次找到的字符角標(biāo)
int indexOf(int ch,int fromIndex);
// 返回從指定位置開(kāi)始第一次找到的角標(biāo)
int indexOf(String str);
// 返回第一次找到的字符串角標(biāo)
int indexOf(String str,int fromIndex);
int lastIndexOf(int ch);
int lastIndexOf(int ch,int fromIndex);
int lastIndexOf(String str);
int lastIndexOf(String str,int fromIndex);
1.4 獲取子串
String substring(int start);
// 從 start 位開(kāi)始翩迈,到 length()-1 為止.
String substring(int start,int end);
// 從 start 開(kāi)始到 end 為止。 //包含 start 位盔夜,不包含end 位负饲。
substring(0,str.length());
// 獲取整串
2、判斷
boolean contains(String substring);
// 字符串中是否包含指定的字符串
boolean startsWith(string);
// 字符串是否以指定字符串開(kāi)頭
boolean endsWith(string);
// 字符串是否以指定字符串結(jié)尾
boolean equals(string);
// 覆蓋了 Object 中的方法喂链,判斷字符串內(nèi)容是否相同返十。
boolean equalsIgnoreCase(string) ;
// 判斷字符串內(nèi)容是否相同,忽略大小寫(xiě)
3椭微、轉(zhuǎn)換
3.1 通過(guò)構(gòu)造函數(shù)將字符數(shù)組或者字節(jié)數(shù)組轉(zhuǎn)成字符串
new String(char[]);
// 將字符數(shù)組轉(zhuǎn)成字符串洞坑。
new String(char[],offset,count);
// 將字符數(shù)組中的一部分轉(zhuǎn)成字符串。
3.2 通過(guò)字符串中的靜態(tài)方法蝇率,將字符數(shù)組轉(zhuǎn)成字符串
static String copyValueOf(char[] );
static String copyValueOf(char[],int offset,int count);
static String valueOf(char[]);
static String valueOf(char[],int offset,int count);
3.3 將基本數(shù)據(jù)類(lèi)型或者對(duì)象轉(zhuǎn)成字符串
static String valueOf(char);
static String valueOf(char[] data)
static String valueOf(char[] data, int offset, int count)
static String valueOf(boolean);
static String valueOf(double);
static String valueOf(float);
static String valueOf(int);
static String valueOf(long);
static String valueOf(Object);
3.4 將字符串轉(zhuǎn)成大小寫(xiě)
String toLowerCase();
String toUpperCase();
3.5 將字符串轉(zhuǎn)成數(shù)組
char[] toCharArray();
// 轉(zhuǎn)成字符數(shù)組迟杂。
byte[] getBytes();
// 可以加入編碼表。轉(zhuǎn)成字節(jié)數(shù)組本慕。
3.6 將字符串切割成子字符串?dāng)?shù)組逢慌。
String[] split(String regex, int limit);
3.7 將字符串進(jìn)行內(nèi)容替換。 注意:修改后變成新字符串间狂,并不是將原字符串直接修改攻泼。
String replace(oldChar,newChar);
String replace(oldstring,newstring);
3.8
String concat(string);
// 對(duì)字符串進(jìn)行追加。
String trim();
// 去除字符串兩端的空格
int compareTo();
// 如果參數(shù)字符串等于此字符串鉴象,則返回值 0忙菠;如果此字符串按字典順序小于字符串參數(shù),則返回一個(gè)小于 0 的值纺弊;如果此字符串按字典順序大于字符串參數(shù)牛欢,則返回一個(gè)大于 0 的值。
友情提示:
- 使用 substring(beginIndex , endIndex) 進(jìn)行字符串截取時(shí)淆游,包括 beginIndex 位置的字符傍睹,不包括 endIndex 位置的字符。
- 那么犹菱,“==” 和 equals() 有什么區(qū)別呢拾稳?
==: 判斷兩個(gè)字符串在內(nèi)存中首地址是否相同腊脱,即判斷是否是同一個(gè)字符串對(duì)象
equals(): 比較存儲(chǔ)在兩個(gè)字符串對(duì)象中的內(nèi)容是否一致
StringBuffer 類(lèi)
一個(gè)線(xiàn)程安全的悍抑,字符的可變序列拂盯。
當(dāng)頻繁操作字符串時(shí)磕仅,就會(huì)額外產(chǎn)生很多臨時(shí)變量。使用 StringBuilder 或 StringBuffer 就可以避免這個(gè)問(wèn)題劫恒。
構(gòu)造一個(gè)其中不帶字符的字符串緩沖區(qū)两嘴,初始容量為 16 個(gè)字符仿荆。
特點(diǎn):
- 可以對(duì)字符串內(nèi)容進(jìn)行修改拢操。
- 是一個(gè)容器杠园。
- 是可變長(zhǎng)度的。
- 緩沖區(qū)中可以存儲(chǔ)任意類(lèi)型的數(shù)據(jù)。
- 最終通過(guò) toString()方法需要變成字符串亲配。
容器通常具備一些固定的方法:
C create U update R read D delete
- 添加。
StringBuffer append(data);
// 在緩沖區(qū)中追加數(shù)據(jù)苍鲜。追加到尾部洒疚。
StringBuffer insert(index,data);
// 在指定位置插入數(shù)據(jù)油湖。 - 刪除。
StringBuffer delete(start,end);
// 刪除從 start 至 end-1 范圍的元素
StringBuffer deleteCharAt(index);
// 刪除指定位置的元素
//sb.delete(0,sb.length());
// 清空緩沖區(qū)。 - 修改矢棚。
StringBuffer replace(start,end,string);
// 將 start 至 end-1 替換成 string
void setCharAt(index,char);
// 替換指定位置的字符
void setLength(len);
// 將原字符串置為指定長(zhǎng)度的字符串 - 查找郑什。(查不到返回-1)
int indexOf(string);
// 返回指定子字符串在此字符串中第一次出現(xiàn)處的索引。
int indexOf(string,int fromIndex);
// 從指定位置開(kāi)始查找字符串
int lastIndexOf(string);
// 返回指定子字符串在此字符串中最右邊出現(xiàn)處的索引蒲肋。
int lastIndexOf(string,int fromIndex);
// 從指定的索引開(kāi)始反向搜索 - 獲取子串蘑拯。
string substring(start);
// 返回 start 到結(jié)尾的子串
string substring(start,end);
// 返回 start 至 end-1 的子串 - 反轉(zhuǎn)。
StringBuffer reverse();
// 字符串反轉(zhuǎn) - 將緩沖區(qū)中指定數(shù)據(jù)存儲(chǔ)到指定字符數(shù)組中兜粘。
void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin);
StringBuilder 類(lèi)
該類(lèi)被設(shè)計(jì)用作 StringBuffer 的一個(gè)簡(jiǎn)易替換强胰。
StringBuffer 和 StringBuilder 的區(qū)別:
- StringBuffer 線(xiàn)程安全。
- StringBuilder 線(xiàn)程不安全妹沙。
- 單線(xiàn)程操作偶洋,使用 StringBuilder 效率高。
- 多線(xiàn)程操作距糖,使用 StringBuffer 安全玄窝。
StringBuilder 和StringBuffer ,它們基本相似悍引,不同之處恩脂,StringBuffer 是線(xiàn)程安全的,而 StringBuilder 則沒(méi)有實(shí)現(xiàn)線(xiàn)程安全功能趣斤,所以性能略高俩块。
因此一般情況下,如果需要?jiǎng)?chuàng)建一個(gè)內(nèi)容可變的字符串對(duì)象,應(yīng)優(yōu)先考慮使用 StringBuilder 類(lèi)玉凯。
方法和 StringBuffer 一樣势腮;
- 創(chuàng)建一個(gè) StringBuilder 對(duì)象,用來(lái)存儲(chǔ)字符串漫仆,并對(duì)其做了追加和插入操作捎拯。這些操作修改了 str 對(duì)象的值,而沒(méi)有創(chuàng)建新的對(duì)象盲厌,這就是 StringBuilder 和 String 最大的區(qū)別署照。