描述字符串的類——String類
一、String類
String類的特點(diǎn):
字符串對象一旦被初始化就不會被改變
字符串定義的第一種方式——字符串常量池
字符串常量池中沒有就建立,池中有,直接用


2.字符串中的操作方法
(1)構(gòu)造方法
- String(byte[] bytes)
將一個字節(jié)數(shù)組變成字符串

- String(char[] value)
分配一個新的String,使其表示字符數(shù)組參數(shù)中當(dāng)前包含的字符序列。

- String(char[] value,int offset,int count)
取自字符數(shù)組參數(shù)一個子數(shù)組的字符
也就是:從哪開始,取幾個

(2)字符串功能
- 獲取
a) 獲取字符串中字符的個數(shù)(長度)
int length();
b) 根據(jù)位置獲取字符
char charAt(int index);
c) 根據(jù)字符獲取在字符串中的第一次出現(xiàn)的位置
int indexOf(int ch)
int indexOf(int ch,int fromIndex) //從指定位置進(jìn)行ch的查找第一次出現(xiàn)的位置
int indexOf(String str) //索引字符串
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)

d) 獲取字符串中的一部分字符串(子串)
String substring(int beginIndex int endIndex)
該子字符串從指定的beginIndex處開始,直到索引endIndex-1處的字符。
String substring(int beginIndex)

- 轉(zhuǎn)換
a) 將字符串變成字符串?dāng)?shù)組(字符串切割)
String[] split(String regex)
涉及到正則表達(dá)式

b) 將字符串變成數(shù)組
char[] toCharArray();

b) 將字符串轉(zhuǎn)換成字節(jié)數(shù)組
byte[] getBytes();

c) 將字符串中的字母轉(zhuǎn)成大小寫
String toUpperCase(); //大寫
String toLowerCase(); //小寫

d) 將字符串中的內(nèi)容進(jìn)行替換
String replace(char oldChar,char newChar);

e) 將字符串兩端的空白去除
String trim();

f) 將字符串進(jìn)行連接
String concat(String str);

- 判斷
a) 兩個字符串內(nèi)容是否相同
Boolean equals(Object obj);
忽略大小寫比較字符串內(nèi)容
Boolean equalsIgnoreCase(String str);

b)字符串中是否包含指定字符串
Boolean contains(String str);

c) 字符串是否以指定字符串開頭,是否以指定字符串結(jié)尾
Boolean startsWith(string);
Boolean endsWith(string);

- 比較
按字典順序比較兩個字符串
int compareTo(String str);
int compareToIgnoreCase(String str);//不分大小寫
相等,返回0;小于,返回小于0的值;大于,返回大于0的值。

- indexOf()方法
用于返回字符(串)在當(dāng)前字符串中首次出現(xiàn)的索引位置。不存在返回-1
lastIndexOf()方法
用于從當(dāng)前字符串的末尾開始向前查找首次出現(xiàn)的規(guī)定的字符(串)
吃幾個大栗子
1.字符串?dāng)?shù)組排列
/*1.給定一個字符串?dāng)?shù)組,按照字典順序進(jìn)行從小到大的排列
{"nba","abc","vba","zz","qq","haha"}
*/
/*
* 思路:
* 1.對數(shù)組排序??梢杂眠x擇/冒泡。
* 2.for嵌套和比較及換位。
* 3.字符串對象比較。
* */
public class StringPractise {
public static void main(String[] args) {
String[] arr = { "nba", "abc", "vba", "zz", "qq", "haha" };
printArray(arr);
sortString(arr);
printArray(arr);
}
private static void sortString(String[] arr) {
for (int i = 0; i < arr.length; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i].compareTo(arr[j]) > 0)// 字符串比較用compareTo
swap(arr, i, j);
}
}
}
private static void swap(String[] arr, int i, int j) {
String temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
private static void printArray(String[] arr) {
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i != arr.length - 1)
System.out.print(arr[i] + ",");
else
System.out.println(arr[i] + "]");
}
}
}

2.子串的次數(shù)
/*一個子串在整串中出現(xiàn)的次數(shù)
* "nbaernbatynbauinbaopnba"
*
* 思路:
* 1.要找的子串是否存在,如果存在獲取其出現(xiàn)的位置。用indexOf
* 2.找到了,記錄出現(xiàn)的位置并在剩余的字符串中繼續(xù)查找該子串,
* 而剩余字符串的起始位置是出現(xiàn)位置+子串的長度。
* 3.以此類推,通過循環(huán)完成查找,如果找不到就是-1,
* 并對i每次找到用計數(shù)器記錄
* */
public class StringPractise2 {
public static void main(String[] args) {
String str = "nbaernbatynbauinbaopnba";
String key = "nba";
int count = getKeyStringCount(str, key);
System.out.println("count=" + count);
}
public static int getKeyStringCount(String str, String key) {
// 1.定義計數(shù)器
int count = 0;
// 2.定義變量,記錄key出現(xiàn)的位置
int index = 0;
while ((index = str.indexOf(key)) != -1) {
str = str.substring(index + key.length());
count++;
}
return count;
}
}
第二種方法
public class Stringdemo {
public static void main(String[] main){
String str = "nbaernbatynbauinbaopnba";
String key = "nba";
int count = 0;
int index = 0;
while(index != -1){
index = str.indexOf(key,index+key.length());
count++;
}
System.out.println(count);
}
}
這個在數(shù)據(jù)結(jié)構(gòu)中叫匹配模式!

3.最大相同的子串。
/*
* 3.兩個字符串中最大相同的子串
* "qwerabcdtyuiop"
* "xabcdvbn"
*
* 思想:
* 1.取最大字符串,先看短的字符串是否在長的字符串中
* 如果存在,短的那個字符串就是最大字符串
* 2.如果不是,就將短的子串進(jìn)行長度遞減的方式去子串,再在長串中判斷是否存在
* 如果存在就找到了!
* */
public class StringPractise3 {
public static void main(String[] args) {
String s1 = "qwerabcdtyuiop";
String s2 = "xabcdvbn";
String s = getMaxSubstring(s1, s2);
System.out.println("s=" + s);
}
public static String getMaxSubstring(String s1, String s2) {
for (int i = 0; i < s2.length(); i++) {
for (int a = 0, b = s2.length() - i; b != s2.length() + 1; a++, b++) {
String sub = s2.substring(a, b);
//System.out.println(sub);//打印得到字符串(見小栗子)
if(s1.contains(sub))
return sub;
}
}
return null;
}
}


4.去除兩端空白
/*
* 4.模擬一個trim功能一致的方法.去除字符串兩端的空白
*
* 思路
* 1.定義兩個變量
* 一個作為從頭開始判斷字符串空格的角標(biāo)。start++
* 一個作為從尾開始判斷字符串空格的角標(biāo)。end--
* 2.判斷到不是空格為止,去頭尾之間的字符串即可
* */
public class StringPractise4 {
public static void main(String[] args) {
String s = " ab c ";
s = myTrim(s);
System.out.println("-" + s + "-");
}
public static String myTrim(String s) {
int start = 0;
int end = s.length() - 1;
while (start <= end && s.charAt(start) == ' ') {
start++;
}
while (start <= end && s.charAt(end) == ' ') {
end--;
}
return s.substring(start, end + 1);
}
}

二、StringBuffer(字符串緩沖區(qū))
StringBuffer:就是字符串緩沖區(qū)
用于存儲數(shù)據(jù)的容器
特點(diǎn)
1.長度可變
2.可以存儲不同類型的數(shù)據(jù)
3.最終要轉(zhuǎn)成字符串進(jìn)行使用
4.可以對字符串進(jìn)行修改StringBuffer是一個容器,所具備的功能:
增刪改查 C(create)U(update)R(read)D(delete)
1.添加:
StringBuffer append(data)


StringBuffer insert(index,data)

2.刪除:
StringBuffer delete(start,end)
包含頭,不包含尾
StringBuffer deleteCharAt(int index)
刪除指定位置的元素


3.查找:
char charAt(index);
int indexOf(string);
int lastIndexOf(string);
4.修改:
替換
StringBuffer replace(start,end,string);
void setCharAt(index,char);


- 其他方法
截取長度
StringBuffer setLength();

內(nèi)容反轉(zhuǎn)
StringBuffer reverse()

三、StringBuilder
StringBuilder和StringBuffer的功能一樣,用法一樣
不同的是
StringBuffer:是線程同步的。通常用于多線程
StringBuilder:是線程不同步的。通常用于單線程,提高效率
最后再給你個栗子吃
/*
* 將1個int數(shù)組變成字符串
* 用String做
* */
public class StringPractise {
public static void main(String[] args) {
int[] arr = { 3, 2, 1, 4, 8 };
String s = arrayToString(arr);
System.out.println(s);
}
public static String arrayToString(int[] arr) {
String str = "[";
for (int i = 0; i < arr.length; i++) {
if (i != arr.length - 1)
str += arr[i] + ",";
else
str += arr[i] + "]";
}
return str;
}
}
上述方法會產(chǎn)生無數(shù)個常量
/*
* 將1個int數(shù)組變成字符串
* 用StringBuilder來做
* */
public class StringBuilderPractise {
public static void main(String[] args) {
int[] arr = { 3, 2, 1, 4, 8 };
String s = arrayToString_2(arr);
System.out.println(s);
}
public static String arrayToString_2(int[] arr) {
StringBuilder sb = new StringBuilder();
sb.append("[");
for (int i = 0; i < arr.length; i++) {
if (i != arr.length - 1)
sb.append(arr[i] + ",");
else
sb.append(arr[i] + "]");
}
return sb.toString();
}
}
此方法只會產(chǎn)生一個數(shù)組
因此建議用容器
