1:StringBuffer(掌握)
(1)用字符串做拼接,比較耗時並且也耗內存,而這種拼接操作又是比較常見的,爲了解決這個問題,Java就提供了
一個字符串緩衝區類。StringBuffer供我們使用。
(2)StringBuffer的構造方法
A:StringBuffer()無參構造函數
B:StringBuffer(int size)指定容量的字符串緩衝區對象
C:StringBuffer(String str)指定字符串內容的字符串緩衝區對象
成員方法:
public int capacity()返回當前容量
public int length()返回當前長度(字符個數)
(3)StringBuffer的常見功能(自己補齊方法的聲明和方法的解釋)
A:添加功能
public StringBuffer append(String str):可以把任意類型數據添加到字符串緩衝區裏面,並返回字符串緩衝區本身
public class Test {
public static void main(String[] args) {
//創建一個緩衝區
StringBuffer sb=new StringBuffer();
//在已開緩衝區中添加數據,返回的是同一緩衝區地址
StringBuffer sb2=sb.append("hello");
System.out.println(sb);
System.out.println(sb2);
System.out.println(sb==sb2);
}
}
輸出:
hello
hello
true
public StringBuffer insert(int offset,String str):在指定位置把任意類型的數據插入到字符串緩衝區裏面,並返回字符串緩衝區本身
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello");
sb.insert(5, "World");
System.out.println(sb);
}
}
輸出:
HelloWorld
B:刪除功能
public StringBuffer deleteCharAt(int index):刪除指定位置的字符,並返回本身
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("World").append("Java");
System.out.println(sb);
sb.deleteCharAt(1);//刪除標號爲1的字符e
System.out.println(sb);
}
}
輸出:
HelloWorldJava
HlloWorldJava
public StringBuffer delete(int start,int end):刪除從指定位置開始指定位置結束的內容,並返回本身
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("World").append("Java");
System.out.println(sb);
sb.delete(5, 10);//左閉右開區間
System.out.println(sb);
}
}
輸出:
HelloWorldJava
HelloJava
刪除所有可以: sb.delete(0,sb.length());
C:替換功能
public StringBuffer replace(int start,int end,String str):從start開始到end用str替換
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("World").append("Java");
//將制定範圍字符替換
sb.replace(5, 10, "MarryNewYear");
System.out.println(sb);
}
}
輸出:
HelloMarryNewYearJava
D:反轉功能
public StringBuffer reverse()
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("王老五").append("Java");
System.out.println(sb);
sb.reverse();
System.out.println(sb);
}
}
輸出:
Hello王老五Java
avaJ五老王olleH
E:截取功能(注意這個返回值)
StringBuffer的截取功能:注意返回值類型不再是StringBuffer本身了
public String substring(int start)
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("王老五").append("Java");
System.out.println(sb);
String s=sb.substring(5);
System.out.println(s);//返回給新字符串,
System.out.println(sb);//原StringBuffer未改變
}
}
輸出:
Hello王老五Java
王老五Java
Hello王老五Java
public String substring(int start,int end)
public class Test {
public static void main(String[] args) {
StringBuffer sb=new StringBuffer();
sb.append("Hello").append("王老五").append("Java");
System.out.println(sb);
String s=sb.substring(5,8);//左閉右開區間截取
System.out.println(s);//返回給新字符串,
System.out.println(sb);//原StringBuffer未改變
}
}
輸出:
Hello王老五Java
王老五
Hello王老五Java
(4)StringBuffer的練習(做一遍)
A:String和StringBuffer相互轉換
String -- StringBuffer
構造方法
StringBuffer -- String
toString()方法
public class Test {
public static void main(String[] args) {
//字符串轉換爲StringBuffer
String s="123456";
//不能把字符串的值直接賦值給StringBuffer
//通過構造方法
StringBuffer sb=new StringBuffer(s);
//通過append()方法
StringBuffer sb2=new StringBuffer();
sb2.append(s);
System.out.println("sb:"+sb);
System.out.println("sb2:"+sb2);
//StringBuffer轉換爲字符串
StringBuffer buffer=new StringBuffer("hello");
//通過構造方法
String s2=new String(buffer);
//通過toString()方法
String s3=buffer.toString();
System.out.println("s2:"+s2);
System.out.println("s3:"+s3);
}
}
輸出:
sb:123456
sb2:123456
s2:hello
s3:hello
B:字符串的拼接
public class Test {
public static void main(String[] args) {
int[] num = { 11, 99, 22, 88, 33, 77, 66, 44, 55 };
String s = ArrToString(num);
System.out.println(s);
}
public static String ArrToString(int[] num) {
StringBuffer sb = new StringBuffer();
sb.append("[");
for (int i = 0; i < num.length; i++) {
if (i == num.length - 1) {
sb.append(num[i]);
} else {
sb.append(num[i]).append(", ");
}
}
sb.append("]");
return sb.toString();
}
}
輸出:
[11, 99, 22, 88, 33, 77, 66, 44, 55]
C:把字符串反轉
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個字符串");
String s = sc.nextLine();
String s2 = Change(s);
String s3 = Change2(s);
System.out.println("s2:" + s2);
System.out.println("s3:" + s3);
}
//通過字符串拼接
public static String Change(String s) {
// 創建一個空字符串
String result = "";
// 將待轉換 的字符串賦值給一個新字符數組
char[] ch = s.toCharArray();
// 倒序遍歷
for (int i = ch.length - 1; i >= 0; i--) {
// 拼接字符串
result += ch[i];
}
return result;
}
//通過StringBuffer的reverse()方法
public static String Change2(String s) {
// 新建一個StringBuffer轉換s,之後調用reverse()翻轉,最後轉回String
return new StringBuffer(s).reverse().toString();
}
}
輸出:
請輸入一個字符串
123abc
s2:cba321
s3:cba321
D:判斷一個字符串是否對稱
三種方法:
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("請輸入一個字符串");
String s = sc.nextLine();
DuiBi(s);
boolean b = isSame(s);
boolean b2 = isSame2(s);
System.out.println("b:" + b);
System.out.println("b2:" + b2);
}
// 對比字符串中的首尾字符是否相同
public static void DuiBi(String s) {
// 遍歷字符串
for (int i = 0; i < s.length() / 2; i++) {
// 從兩端提取字符比較是否相同
if (s.charAt(i) != s.charAt(s.length() - i - 1)) {
System.out.println("不對稱");
return;
}
}
System.out.println("對稱");
}
// 將字符串轉換成字符數組進行比較
public static boolean isSame(String s) {
boolean flag = true;
// 把字符串轉成字符數組
char[] chs = s.toCharArray();
for (int start = 0, end = chs.length - 1; start <= end; start++, end--) {
if (chs[start] != chs[end]) {
flag = false;
break;
}
}
return flag;
}
// 鏈式編程不斷調方法
public static boolean isSame2(String s) {
// 創建StringBuffer對象接收s 調用reverse()方法翻轉
// 調用toString()方法轉換成字符串,
// 調用equals()方法比較,
// equals()比較的是字符串的值是否相同。
return new StringBuffer(s).reverse().toString().equals(s);
}
}
輸出:
請輸入一個字符串
123454321
對稱
b:true
b2:true
(5)面試題
小細節:
String 內容不可變,另外兩個可以
StringBuffer:同步的,數據安全,效率低。
StringBuilder:不同步的,數據不安全,效率高。
A:String,StringBuffer,StringBuilder的區別
* A:String是內容不可變的,而StringBuffer,StringBuilder都是內容可變的。
* B:StringBuffer是同步的,數據安全,效率低;StringBuilder是不同步的,數據不安全,效率高
B:StringBuffer和數組的區別?
* 二者都可以看出是一個容器,裝其他的數據。
* 但是呢,StringBuffer的數據最終是一個字符串數據。
* 而數組可以放置多種數據,但必須是同一種數據類型的。
(6)注意的問題:
* 3:形式參數問題
* String作爲參數傳遞
* StringBuffer作爲參數傳遞
String作爲形式參數,StringBuffer作爲形式參數。
* 形式參數:
* 基本類型:形式參數的改變不影響實際參數
* 引用類型:形式參數的改變直接影響實際參數
* 注意:
* String作爲參數傳遞,效果和基本類型作爲參數傳遞是一樣的。
public class StringBufferDemo {
public static void main(String[] args) {
String s1 = "hello";
String s2 = "world";
System.out.println(s1 + "---" + s2);// hello---world
change(s1, s2);
System.out.println(s1 + "---" + s2);// hello---world
StringBuffer sb1 = new StringBuffer("hello");
StringBuffer sb2 = new StringBuffer("world");
System.out.println(sb1 + "---" + sb2);// hello---world
change(sb1, sb2);
System.out.println(sb1 + "---" + sb2);// hello---worldworld
}
public static void change(StringBuffer sb1, StringBuffer sb2) {
sb1 = sb2;
sb2.append(sb1);
}
public static void change(String s1, String s2) {
s1 = s2;
s2 = s1 + s2;
}
}