Java基礎知識_day8_(String,StringBuilder,StringBuffer)
1. String類
String 類代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作爲此類的實例實現;
字符串是常量;它們的值在創建之後不能更改;
字符串的本質是一個字符數組.
1.1 String類構造方法
String(String original):把字符串數據封裝成字符串對象;
String(char[] str):把字符數組的數據封裝成字符串對象;
String(char[] value,int index,int count):把字符數組中的一部分數據封裝成字符串對象,index是開始的索引值,count是字符的個數;
public String(byte[] bytes):通過使用平臺的默認字符集解碼指定的byte數組,構造一個新的String.該構造方法會先將整形數轉換爲字符,然後將字符組合成爲一個字符串.
注意事項
# 注意事項:
字符串是一種較爲特殊的引用數據類型,直接輸出字符串對象輸出的是該對象中的數據;
# 通過構造方法和直接賦值方式創建的字符串對象區別:
構造方法創建的字符串對象是在堆內存中該對象指向方法區中常量池中的具體的字符串,直接賦值創建的字符串對象是在方法區的常量池.
# ==:比較的是兩個值是否相等;
基本數據類型是比較的類型的值是否相等;
引用數據類型是比較的類型的地址值是否相等;
案例代碼
public class StringDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "hello";
// s1和s2指向方法區中常量池中的同一個字符串對象,所以輸出的地址值相同
System.out.println((s1==s2)); // true
s1 = "helloWorld";
// 將s1的值重新賦值,相當於是在常量池中重新創建一個字符串對象,則結果是false
System.out.println((s1==s2)); // false
// 由於s1指向的字符串對象發生改變,但是s2還是指向之前的那個字符串,所以s2輸出結果不變
System.out.println(s2); // hello
String s3 = new String("hello");
String s4 = s3;
// 將s4也指向堆內存中那個字符串對象,則此時s3和s4的地址值相等
System.out.println(s3==s4); // true
// 將s3指向一個新的字符串,相當於是s3指向了常量池中的字符串對象
s3 = "helloworld";
// s3指向常量池中的字符串對象,s4是指向堆內存中的字符串實體,通過實體再指向常量池中的字符串
// 則s3和s4的地址值不同
System.out.println(s3==s4); // false
// s3和s4指向的字符串對象不同,則輸出的字符串不同
System.out.println(s3); // helloworld
System.out.println(s4); // hello
byte[] bys = { 97, 98, 99, 100, 101 };
String s = new String(bys);
System.out.println(s); // abcde
System.out.println(s.length()); // 5
/*
* 字符串拼接: 字符串如果是變量相加,是先開闢內存空間,再進行拼接;
* 字符串如果是常量相加,是先將字符串拼接,然後在方法區的常量池中進行查找,如果有就直接返回,否則創建.
*/
String s1 = "hello";
String s2 = "world";
String s3 = "helloworld";
System.out.println(s3 == s1 + s2); // false
System.out.println(s3.equals(s1 + s2)); // true
System.out.println(s3 == "hello" + "world"); // true
System.out.println(s3.equals("hello" + "world")); // true
}
}
1.2 String類的判斷功能
boolean equals(Object obj):比較兩個字符串的內容是否相同,其中參數可以是任意object的子類對象;
boolean equalsIgnoreCase(String str):比較兩個字符串的內容是否相同,忽略大小寫;
boolean startsWith(String str):判斷字符串對象是否以指定的str開頭;
boolean endsWith(String str):判斷字符串對象是否以指定的str結尾;
public boolean contains(String s):判斷大的字符串中是否包含小字符串s,如果有返回true;
public boolean isEmpty():當且僅當length()爲0時返回true;
注意:字符串的值爲空(s="")和空字符串(字符串對象爲空,s=null)是不同概念.
1.3 String類的獲取功能
int length():獲取字符串的長度,就是字符的個數;
char charAt(int index):獲取指定索引處的字符,索引值必須存在,否則會報索引越界異常;
int indexOf(String str):獲取字符串str在字符串對象中首次出現的索引,如果不是單個字符,則返回str中第一個字符的索引,如果不存在返回-1;
String substring(int start):從Start索引處截取到結束的子串;
String substring(int start, int end):從Start(包含)索引處截取到end索引(不包含)爲止的子串;
public int indexOf(int ch,int fromIndex)返回在此字符串中第一次出現指定字符處的索引,從指定的索引開始搜索;
public int indexOf(String str,int fromIndex):返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始.
案例代碼
public class StringDemo3 {
public static void main(String[] args) {
String s = "HelloSomnus";
// int length()
System.out.println(s.length());
// char charAt(int index)
System.out.println(s.charAt(7)); // m
// System.out.println(s.charAt(12)); // java.lang.StringIndexOutOfBoundsException異常
// int indexOf(String str)
System.out.println(s.indexOf("S")); // 5
System.out.println(s.indexOf("Som")); // 5 是str字符串首字母首次出現的索引
System.out.println(s.indexOf("h")); // -1表示字符串不存在
// String substring(int start)
System.out.println(s.substring(5)); // Somnus
// System.out.println(s.substring(13)); // java.lang.StringIndexOutOfBoundsException異常
// String substring(int start, int end)
System.out.println(s.substring(5, 8)); // Som,包含開始索引,不包含結束索引
}
}
1.4 String類轉換功能
char[] toCharArray():把字符串轉換爲字符數組;
String toLowerCase():把字符串轉換爲小寫字符串;
String toUpperCase():把字符串轉換爲大寫字符串;
public byte[] getBytes(String charsetName):將字符串轉換爲字節數組;
public static String valueOf(char[] data):將字符數組轉換爲字符串(靜態方法);
public static String valueOf(int i):返回int參數的字符串表示形式.該表示形式恰好是單參數的Integer.toString方法返回的結果;
public String concat(String str):將指定字符串連接到此字符串的結尾.如果參數字符串的長度爲0,則返回此String對象.
案例代碼
public class StringDemo4 {
public static void main(String[] args) {
String s = "helloWorld";
// char[] toCharArray()
char[] chs = s.toCharArray();
for (int i = 0; i < chs.length; i++) {
System.out.println(chs[i]);
}
// String toLowerCase()
String s1 = s.toLowerCase();
System.out.println(s1);
// String toUpperCase()
String s2 = s.toUpperCase();
System.out.println(s2);
}
}
1.5 String類的其他功能
// 替換
public String replace(char oldChar,char newChar):返回一個新的字符串,它是通過用newChar替換此字符串中出現的所有oldChar得到的;
public String replace(String target,String replacement)使用指定的字面值替換序列替換此字符串所有匹配字面值目標序列的子字符串;
// 比較:
public int compareTo(String anotherString):按字典順序比較兩個字符串,如果參數字符串等於此字符串,則返回值0;如果此字符串按字典順序小於字符串參數,則返回一個小於0的值;如果此字符串按字典順序大於字符串參數,則返回一個大於0的值;
// 去除
String trim():取出字符串兩端的空格,返回字符串對象;
// 分割
String[] split(String str):按照指定str分割字符串,結果爲字符串數組.
案例代碼
public class StringDemo5 {
public static void main(String[] args) {
String s = "aabbcc";
String[] s1 = s.split("b"); // 按照b字符進行分割
System.out.println(s1.length);
for (int i = 0; i < s1.length; i++) {
System.out.println(s1[i].length());
System.out.println(s1[i]);
}
}
}
2. StringBuilder類
StringBuilder:是一個可變長的字符串,屬於字符串緩衝區類.
StringBulider也是一種較爲特殊的引用數據類型,直接輸出的是該對象中的數據;
String與StringBuilder的區別
String的內容是固定的(在常量池中一旦生成無法改變);
StringBuilder是可變長度的字符串;
String使用+做字符串拼接時會產生較多的中間字符串,效率較低並浪費空間.
2.1 StringBuilder類構造方法
StringBuilder():構造一個不帶任何字符的字符串生成器,其初始容量爲 16 個字符;
StringBuilder(String str):構造一個字符串生成器,並初始化爲指定的字符串內容.
2.2 StringBuilder類成員方法
public int capacity():返回當前容量(容器的理論容量).容量指可用於最新插入字符的存儲量,超過這一容量便需要再次分配;
public int length():返回長度(字符數),已經存儲的字符個數;
public StringBuilder append(任意類型):將參數追加到此對象值得後面,返回其本身.
2.3 String與StringBuilder之間的轉換
# StringBuilder --> String: StringBuilder對象通過其toString方法轉換爲String對象.
# String --> StringBuilder:通過StringBuilder的構造方法可以得到String對象.
2.4 案例代碼
public class StringBuilderDemo {
public static void main(String[] args) {
// 空參構造方法
StringBuilder sb1 = new StringBuilder();
System.out.println(sb1.capacity()); // 16初始化時分配的容量
System.out.println(sb1.length()); // 空字符,代表當前沒有存儲字符
// 有參構造方法,將初始值設爲指定字符串
StringBuilder sb2 = new StringBuilder("hello");
System.out.println(sb2.capacity()); // 21代表當前的容量,總會有16個字節的空餘空間
System.out.println(sb2.length()); // 5代表當前存儲的字符個數
// public StringBuilder append(任意類型),返回值爲其本身,故可以鏈式編程
sb2.append("world");
sb2.append(12.34);
System.out.println(sb2); // helloworld12.34
sb2.append("somnus").append(3.14).append(true);
System.out.println(sb2); // helloworld12.34somnus3.14true
// public StringBuilder reverse()
sb2.reverse();
System.out.println(sb2); // eurt41.3sunmos43.21dlrowolleh
}
}
3. StringBuffer類
Stringbuffer:線程安全的可變字符序列.一個類似於 String 的字符串緩衝區.但不能修改.
雖然在任意時間點上它都包含某種特定的字符序列,但通過某些方法調用可以改變該序列的長度和內容.
3.1 StringBuilder類構造方法
public StringBuffer():構造一個其中不帶字符的字符串緩衝區,其初始容量爲16個字符;
public StringBuffer(int capacity):構造一個不帶字符,但具有指定初始容量的字符串緩衝區;
public StringBuffer(String str):構造一個字符串緩衝區,並將其內容初始化爲指定的字符串內容.該字符串的初始容量爲16加上字符串參數的長度.
3.2 StringBuffer類的添加功能
public StringBuffer append(String str):將指定的字符串追加到此字符序列,按順序追加String變量中的字符,此序列將增加該變量的長度.如果str爲null,則追加4個字符 "null".
public StringBuffer insert(int offset,String str):將字符串插入此字符序列按順序將String參數中的字符插入此序列中的指定位置,將該位置處原來的字符向後推,此序列將增加該參數的長度.如果str爲null,則向此序列中追加4個字符"null".
3.3 StringBuffer類的刪除功能
public StringBuffer deleteCharAt(int index):移除此序列指定位置上的char,返回本身.
public StringBuffer delete(int start,int end):移除此序列的子字符串中的字符,該子字符串從指定的start處開始,一直到索引end-1處的字符,如果不存在這種字符,則一直到序列尾部.如果start等於end,則不發生任何更改,返回本身.
3.4 StringBuffer類的獲取功能
public String substring(int start):返回一個新的String,它包含此字符序列當前所包含的字符子序列;
public String substring(int start,int end):返回一個新的String,它包含此序列當前所包含的字符子序列.該子字符串從指定的start處開始,一直到索end-1處的字符.
3.5 StringBuffer類的其他功能
// 獲取長度
public int length():返回長度(字符數)。
public int capacity():返回當前容量.容量指可用於最新插入的字符的存儲量,超過這一容量就需要再次進行分配.
// 替換
public StringBuffer replace(int start,int end,String str):使用str替換從Start開始到end-1處的字符串,如果替換的長度不等於str的長度,則先將原始字符串中Start開始到end-1處的字符刪除,將str字符添加到Start索引處.返回本身.
// 反轉功
public StringBuffer reverse():將此字符序列用其反轉形式取代,返回本身.
4. String,StringBuilder和StringBuffer的區別
# String是長度不可變的,後兩者的內容是可以變的;
# StringBuffer是線程安全,數據安全,效率低;
# StringBuilder是線程不安全的,數據不安全,效率高.
5. String,StringBuilder和StringBuffer類型變量作爲參數傳遞的區別
# String作爲形式參數傳遞:效果和基本類型傳遞相同;
# StringBuilder和StringBuffer作爲形式參數:
* 使用=賦值時,形參的改變不影響實參;使用具體的方法操作時,形參的改變會影響實參的改變.
案例代碼
public class MyStringBuffer {
public static void main(String[] args) {
// String作爲參數
String s1 = "hello";
String s2 = "world";
System.out.println(s1+"..."+s2); // hello...world
method1(s1, s2);
System.out.println(s1+"..."+s2); // hello...world
// StringBuffer作爲參數
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("World");
System.out.println(sb1+"..."+sb2); // hello...World
method(sb1,sb2);
System.out.println(sb1+"..."+sb2); // hello...WorldWorld
}
// String作爲參數
public static void method1(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
// StringBuffer作爲參數
public static void method(StringBuffer sb1, StringBuffer sb2) {
// StringBuffer作爲參數
sb1 = sb2; // 進行=賦值時,實參的值不會改變
sb2.append(sb2); // 使用方法進行操作會改變實參的值
}
}