android基礎學習-java篇day7-step3-第三節:java字串

發條魚發表於2018-09-09

String常用方法

案例:使用String類常用方法完成字串處理 

要求:

  1. 定義一個字串"abcdefg"
  2. 取出子串cde並轉換為大寫
  3. 將DE替換為MM
  4. 最後得到結果CMM

 StringDemo.java

package com.demo.day7.wrap;

public class StringDemo {
	/*
	 * 案例:使用String類常用方法完成字串處理 
	 * 要求:
	 * 定義一個字串"abcdefg"
	 * 取出子串cde並轉換為大寫
	 * 將DE替換為MM
	 * 最後得到結果CMM
	 */

	public static void main(String[] args) {
		// 1定義一個字串
		String str="abcdefg";
		//2取出子串cde substring(字串開始位置,結束位置);
		String str1=str.substring(2, 5);
		//將cde轉換成大寫的 oUpperCase();
		String str2=str1.toUpperCase();
		//將DE替換成MM
		String str3=str2.substring(0, 1)+"MM";
		System.out.println("得到結果為"+str3);
				

	}

}

輸出結果:

得到結果為CMM

字串和byte陣列之間相互轉換

網路上都是以二進位制進行傳輸的,所以要將String型別轉換成byte陣列。

package com.demo.day7.wrap;

public class Byte {

	public static void main(String[] args) {
		//字串和陣列之間的相互轉換
		//1.定義一個字串
		String str=new String("JAVA 程式設計 基礎");
		//2.將字串轉換成byte陣列,並列印輸出
		byte[] arr=str.getBytes();
		for(int i=0;i<arr.length;i++) {
			System.out.print(arr[i]+" ");
		}
		System.out.println();//換行
		//將byte陣列轉換成字串
		String str1=new String(arr);
		System.out.println(str1);
		

	}

}

輸出結果:

74 65 86 65 32 -25 -68 -106 -25 -88 -117 32 -27 -97 -70 -25 -95 -128 
JAVA 程式設計 基礎

String 類的equals和 == 的區別

equals:判斷內容是否相同

等於運算子 ==:判斷地址是否相同

程式碼示例:

package com.demo.day7.wrap;

public class EqualsDemo {

	public static void main(String[] args) {
		// String類裡equals和==的區別
		//1建立3個字串
		String str1="hello";
		String str2="hello";
		String str3=new String("hello");
		String str4=new String("hello");
		char[] str5= {'h','e','l','l','o'};	
		System.out.println("str1和str2的內容相同"+(str1.equals(str2)));
		System.out.println("str1和str3的內容相同"+(str1.equals(str3)));
		System.out.println("====================");
		System.out.println("str1和str2的地址相同"+(str1==(str2)));
		System.out.println("str1和str3的地址相同"+(str1==(str3)));
		System.out.println("====================");
		System.out.println("str3和str4的內容相同"+(str3.equals(str4)));
		System.out.println("str3和str5的內容相同"+(str3.equals(str5)));
		System.out.println("str1和str5的內容相同"+(str1.equals(str5)));

	}

}

輸出結果:

str1和str2的內容相同true
str1和str3的內容相同true
====================
str1和str2的地址相同true
str1和str3的地址相同false
====================
str3和str4的內容相同true
str3和str5的內容相同false
str1和str5的內容相同false

 分析:

 字串的不可變性

  1. String物件一旦建立,則不可能修改,是不可變的
  2. 所謂的修改其實是建立新的物件,所指的記憶體 空間不變

StringBuilder的概述

 String 與StringBuilder的區別

String:具有不可變性,會產生很多中間變數,在常量池中產生很多廢棄的資料

StringBuilder:不具備,可以避免String的情況

頻繁操作字串的時候:建議使用StringBuilder

StringBuiilder 和StringBuffer區別

二者基本相似,建議用StringBuilder

StringBuffer是執行緒安全的,執行緒安全相對沒有的速度慢一些

單執行緒:使用StringBuilder

StringBuilder例子

package com.demo.day7.wrap;

public class StringDemo2 {
	/*
	 * 定義一個字串,利用StringBuilder完成如下效果
	 * 效果圖:
	 * 歡迎來到java世界
	 * 刪除插入後:你好,java世界
	 * 替換後:歡迎來到java世界
	 */

	public static void main(String[] args) {
		// 定義一個字串
		StringBuilder str=new StringBuilder("歡迎來到java世界");
		//刪除插入後:你好,java世界
		str.delete(0, 4);//刪除0-3的內容
		str.insert(0, "你好,");
		//等價 str.delete(0, 4).insert(0, "你好,");
		System.out.println(str);
		
		//替換後:歡迎來到java世界
		str.replace(0, 3, "歡迎來到");
		System.out.println(str);

	}

}

 輸出:

你好,java世界
歡迎來到java世界

Java中的String,StringBuilder,StringBuffer三者的區別

  最近在學習Java的時候,遇到了這樣一個問題,就是String,StringBuilder以及StringBuffer這三個類之間有什麼區別呢

  這三個類之間的區別主要是在兩個方面,即執行速度和執行緒安全這兩方面。

  1. 首先說執行速度,或者說是執行速度,在這方面執行速度快慢為:StringBuilder > StringBuffer > String

  String最慢的原因:

  String為字串常量,而StringBuilder和StringBuffer均為字串變數,即String物件一旦建立之後該物件是不可更改的,但後兩者的物件是變數,是可以更改的。以下面一段程式碼為例:

 String str="abc";
 System.out.println(str);
 str=str+"de";
 System.out.println(str);

  如果執行這段程式碼會發現先輸出“abc”,然後又輸出“abcde”,好像是str這個物件被更改了,其實,這只是一種假象罷了,JVM對於這幾行程式碼是這樣處理的,首先建立一個String物件str,並把“abc”賦值給str,然後在第三行中,其實JVM又建立了一個新的物件也名為str,然後再把原來的str的值和“de”加起來再賦值給新的str,而原來的str就會被JVM的垃圾回收機制(GC)給回收掉了,所以,str實際上並沒有被更改,也就是前面說的String物件一旦建立之後就不可更改了。所以,Java中對String物件進行的操作實際上是一個不斷建立新的物件並且將舊的物件回收的一個過程,所以執行速度很慢。

  而StringBuilder和StringBuffer的物件是變數,對變數進行操作就是直接對該物件進行更改,而不進行建立和回收的操作,所以速度要比String快很多。

  另外,有時候我們會這樣對字串進行賦值

 String str="abc"+"de";
 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
 System.out.println(str);
 System.out.println(stringBuilder.toString());

  這樣輸出結果也是“abcde”和“abcde”,但是String的速度卻比StringBuilder的反應速度要快很多,這是因為第1行中的操作和

  String str="abcde";

  是完全一樣的,所以會很快,而如果寫成下面這種形式

 String str1="abc";
 String str2="de";
 String str=str1+str2;

  那麼JVM就會像上面說的那樣,不斷的建立、回收物件來進行這個操作了。速度就會很慢。

  2. 再來說執行緒安全

  線上程安全上,StringBuilder是執行緒不安全的,而StringBuffer是執行緒安全的

  如果一個StringBuffer物件在字串緩衝區被多個執行緒使用時,StringBuffer中很多方法可以帶有synchronized關鍵字,所以可以保證執行緒是安全的,但StringBuilder的方法則沒有該關鍵字,所以不能保證執行緒安全,有可能會出現一些錯誤的操作。所以如果要進行的操作是多執行緒的,那麼就要使用StringBuffer,但是在單執行緒的情況下,還是建議使用速度比較快的StringBuilder。

  3. 總結一下
  String:適用於少量的字串操作的情況

  StringBuilder:適用於單執行緒下在字元緩衝區進行大量操作的情況

  StringBuffer:適用多執行緒下在字元緩衝區進行大量操作的情況

相關文章