StringBuffer_StringBuilder

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;
	}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章