天天看點

黑馬程式員——String類、基本資料類型包裝類String類StringBuffer基本資料類型包裝類

------<ahref="http://www.itheima.com" target="_blank" rel="external nofollow" target="blank">Java教育訓練、Android教育訓練、iOS教育訓練、.Net教育訓練</a>、期待與您交流! -------

String類

基本概念:

字元串最大特點:一旦被初始化就不可以被改變。

public class StringDemo {
	public static void main(String[] args) {
		String s1 = "abc";//s1是一個類類型變量, "abc"是一個對象。
		s1 = "kkk";
		System.out.println(s1);
		//雖然此處會輸出kkk,但是并不是abc字元串變了,而是s1變了,指向了新的字元串常量kkk。abc這個對象的内容并未改變
		
		String s2 = new String("kkk");//String構造函數中有一個可以傳字元串的構造函數
		/*s1和s2有什麼差別:雖然使用起來一樣,但:
			s1在記憶體中有一個對象。
			s2在記憶體中有兩個對象。
		*/
		System.out.println(s1 == s2);//false
		System.out.println(s1.equals(s2));//true
		//String類複寫了Object類中的equals方法,該方法用于判斷字元串是否相同。
		//Object類中原來的equals方法是用來比較記憶體中的位址值的。
	}
}
           

常用操作方法:

擷取

1,字元串長度

      int length()

2,位置->字元

char charAt(int index):

3,字元->位置

int indexOf(int ch):傳回的是ch在字元串中第一次出現的位置。 int indexOf(int ch, int fromIndex) :從fromIndex指定位置開始,擷取ch在字元串中出現的位置。 int lastIndexOf(int ch) :傳回ch在字元串中最後一次出現的位置。

4,子串->位置

int indexOf(String str):傳回的是str在字元串中第一次出現的位置。

int indexOf(String str, int fromIndex) :從fromIndex指定位置開始,擷取str在字元串中出現的位置。

4,位置->子串

String substring(begin)   String substring(begin,end) 
<pre name="code" class="java">package String;
class  StringMethodDemo
{
	public static void method_get()
	{
		String str = "abcdeatpf";

		//長度
			sop(str.length());//輸出:9
		
		//位置->字元。
			sop(str.charAt(4));//輸出:e,說明從0開始
			//當通路到字元串中不存在的角标時會發生StringIndexOutOfBoundsException。

		//字元->位置
			sop(str.indexOf('m',3));//輸出:-1
			//如果沒有找到,傳回-1.
		
			//反向字元->索引
			sop(str.lastIndexOf("a"));//輸出:5
		
		//子串->位置。
			sop(str.indexOf("eat",2));//輸出:4
			//從該字元串的第3位開始找eat這個子串,傳回的是eat子串的第一個字元的位置
		
		//位置->子串
			sop(str.substring(3, 4));//輸出:d(包含頭,不包含尾)str.substring(0,str.length())可獲得整個字元串
			sop(str.substring(3,8));//輸出:deatp
	}
	public static void main(String[] args) 
	{
		method_get();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

判斷

1,有無子串?

boolean contains(str):(既要判斷又要拿位置用str.indexof("str"))

2,有無内容?

boolean isEmpty(): 原理就是判斷長度是否為0. 

3,是否以指定内容開頭或結尾?

boolean startsWith(str); boolean endsWith(str);

4,内容是否相同?

boolean equals(str);(複寫了Object類中的equals方法。) boolean equalsIgnoreCase();(忽略大小寫的判斷)
package String;

class  StringMethodDemo
{

	public static void method_is()
	{
		String str = "ArrayDemo.java";
		String str2 = "ARRAYDEMO.JAVA";
		
		//有無内容?
		sop(str.isEmpty());//false
		
		//有無子串?
		sop(str.contains("java"));//true//如果有一個檔案Demo.java.txt,contains傳回true,而endsWith傳回false
		
		//判斷檔案名稱是否是Array單詞開頭。
		sop(str.startsWith("Array"));//true
		
		//判斷檔案名稱是否是.java的檔案。
		sop(str.endsWith(".java"));//true
		
		//内容是否相同?
		sop(str.equals(str2));//false
		sop(str.equalsIgnoreCase(str2));//true
	}

	public static void main(String[] args) 
	{
		method_is();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

轉換

1,字元數組->字元串

構造函數:String(char[]) 字元串初始化時就可以使用String的構造函數将字元數組轉成字元串     String(char[],offset,count)将字元數組中的一部分轉成字元串。 靜态方法: static String copyValueOf(char[]) static String copyValueOf(char[] data, int offset, int count)  static String valueOf(char[])

2,字元串->字元數組。

char[] toCharArray()

3,位元組數組->字元串。

String(byte[])

String(byte[],offset,count):将位元組數組中的一部分轉成字元串。

4,字元串->位元組數組

byte[]  getBytes()

5,基本資料類型->字元串。

static String valueOf(int) static String valueOf(double)

特殊:字元串和位元組數組在轉換過程中,是可以指定編碼表的。

package String;

class  StringMethodDemo
{

	public static void method_trans()
	{
		//字元數組->字元串
		char[] arr = {'a','b','c','d','e','f'};
			//直接全部轉
			String c2a_1 = new String(arr);
			sop("s = " + c2a_1);//輸出:s = abcdef
			
			//轉指定位置的一部分
			String c2a_2 = new String(arr,1,3);
			sop("s = " + c2a_2);//輸出:s = bcd
			
			//使用靜态方法copyValueOf
			String sta_c2a = String.copyValueOf(arr);//此處使用valueOf(arr)效果一緻,但valueOf還能将基本資料類型轉成字元串
			sop("s = " + sta_c2a);

		//字元串->字元數組
		String s1 = "zxcvbnm";
			//轉換
			char[] chs = s1.toCharArray();
			//列印
			for(int x = 0; x < chs.length; x++)
			{
				sop("ch="+chs[x]);
			}	
		/*
			ch=z
			ch=x
			ch=c
			ch=v
			ch=b
			ch=n
			ch=m
		 */

		//字元串->位元組數組
		String s2 = "zdf32432";
			//轉換
			byte[] bytes = s2.getBytes();//byte[]不能寫成Byte[]
			//列印
			for(int x = 0; x < bytes.length; x++){
				sop("byte = " + bytes[x]);
			}
		/*
		 	byte = 122
			byte = 100
			byte = 102
			byte = 51
			byte = 50
			byte = 52
			byte = 51
			byte = 50
		 */
	}


	public static void main(String[] args) 
	{
		method_trans();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

替換

String replace(oldchar,newchar)  

String replace(CharSequence target, CharSequence replacement) 

package String;

class  StringMethodDemo
{

	public static void method_replace()
	{
		String s = "hello java";

		String s2 = s.replace('q','n');//如果要替換的字元不存在,傳回的還是原串。
		sop("s2 = " + s2);//輸出:s2 = hello java

		String s1 = s.replace("java","world");
		sop("s = "+s);//字元串一旦初始化不會被改變。輸出:s = hello java
		sop("s1 = "+s1);//輸出:s1 = hello world
	}


	public static void main(String[] args) 
	{
		method_replace();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

切割

String[] split(regex);

class  StringMethodDemo
{
	public static void  method_split()
	{
		String s = "zhagnsa,lisi,wangwu";
		String[] arr  = s.split(",");//定義了一個字元串數組,根據逗号切割s字元串,逗号作為切割符
		//把切割完的字元串子串分别存到該字元串數組中
		
		for(int x = 0; x < arr.length; x++)
		{
			sop(arr[x]);//列印該數組
			/*
				zhagnsa
				lisi
				wangwu
			 */
		}
	}	
	public static void main(String[] args) 
	{
		method_split();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

處理與比較

1,大寫<->小寫。  

String toUpperCase()   String toLowerCase()  

2,去除兩端的多個空格  

String trim() 

3,對兩個字元串進行自然順序的比較。  

int compareTo(string)  
package String;
class  StringMethodDemo
{
	public static void method_others()
	{
		String s = "    Hello Java     ";
		//大寫 <-> 小寫
			sop(s.toLowerCase());//輸出:"    hello java     " 
			sop(s.toUpperCase());//輸出:"    HELLO JAVA     " 

		//去除空格
			sop(s.trim());//輸出:"Hello Java"

		//比較
		String s1 = "a1c";
		String s2 = "aaa";
		String s3 = "abc";
		
		/*
		 小于傳回負數,大于傳回正數
		 */
		sop(s1.compareTo(s2));//輸出:-48(1是49,a是97,此處第一位一樣,然後從第二位開始比較)
		sop(s2.compareTo(s3));//輸出:-1
		sop(s3.compareTo(s2));//輸出:1(a是97,b是98,b比a大1,是以abc比aaa大1)
	}

	public static void main(String[] args) 
	{
		method_others();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}
           

字元串常用操作方法的應用

模拟trim方法

package String;


class StringTest 
{

	public static void sop(String str)
	{
		System.out.println(str);
	}
	public static void main(String[] args) 
	{
		String s = "      ab cd      ";

		sop("("+s+")");//輸出:(      ab cd      )
		s = myTrim(s);
		sop("("+s+")");<span style="font-family: Arial, Helvetica, sans-serif;">//輸出:(ab cd)</span>		
	}
	
	public static String myTrim(String str)
	{
		int start = 0,end = str.length()-1;//因為腳标是從0開始的,最末尾的元素的腳标是"長度-1"

		while(start <= end && str.charAt(start) == ' ')//當str的值為""時,start == end
			start++;

		while(start <= end && str.charAt(end) == ' ')
			end--;
		
		return str.substring(start,end+1);//取的時候包含頭,不包含尾,如果要把end處的元素也取入,需要end加1
	}
}
           

将字元串進行反轉

思路:

1,将字元串變成數組。

2,對數組反轉。

3,将數組變成字元串。

class StringTest 
{

	public static void sop(String str)
	{
		System.out.println(str);
	}
	public static void main(String[] args) 
	{
		String s = "012345";

		sop("("+s+")");//輸出:(012345)
		sop("("+reverseString(s)+")");//輸出:(543210)
		sop("("+reverseString(s,0,2)+")");//輸出:(102345) 012->102,說明轉的範圍不包含尾,因為一般尾代表是整個長度,比最後腳标大1
		sop("("+reverseString(s,1,4)+")");//輸出:(032145) 1234 -> 3214
	}
	
	public static String reverseString(String s,int start,int end)//倒轉指定部分
	{
		//1,字元串變數組
		char[] chs = s.toCharArray();//存在名為chs的字元數組中

		//2,反轉數組
		reverse(chs,start,end);

		//3,将數組變成字元串。
		return new String(chs);
	}
	
	
	public static String reverseString(String s)//重載的函數
	{
		return reverseString(s,0,s.length());
	}

	//反轉數組的方法
	private static void reverse(char[] arr,int x,int y)
	{
		for(int start = x,end = y-1; start < end ; start++,end--)//整個倒轉時的寫法:start = 0, end = arr.length -1
		{
			swap(arr,start,end);//end代表最後一個腳标
		}
	}
	
           

擷取一個字元串在另一個字元串中出現的次數

思路:

1,定義個計數器。

2,擷取子串第一次出現的位置。

3,從第一次出現位置後剩餘的字元串中繼續擷取子串出現的位置。每擷取一次就計數一次。

4,當擷取不到時,計數完成。

package String;

class  StringTest2
{
	//練習三, 方法一:"kk"所截子串的腳标
	public static int getSubCount(String str,String key)
	{
		int count = 0;//初始化一個計數器
		int index = 0;//記錄索引的值

		while((index = str.indexOf(key))!=-1)//index[0] = 0;
		{
			sop("str="+str);
			str = str.substring(index+key.length());
			//根據子串的起始位置傳回子串。第一次是str.substring(0 + 2),從腳标2開始傳回,包含頭
			
			count++;	//計數器加1,記錄獲得到的子串個數
		}
		return count;
	}


	//練習三,方法二:僅跳"kk"的腳标

	public static int getSubCount_2(String str,String key)
	{
		int count = 0;
		int index = 0;

		while((index = str.indexOf(key,index))!=-1)//對比:while((index = str.indexOf(key))!=-1)
		{
			sop("index = " + index);//對比:sop("str="+str);
			index = index + key.length();//對比:str = str.substring(index+key.length());
			//System.out.println(str.indexOf("kk", 2)),結果是4,含義是第二次出現kk時的腳标的值是4
			
			count++;
		}
		return count;
	}

	public static void main(String[] args) 
	{
		String str = "kkabkkcdkkefkks";
		///sop("count====="+str.split("kk").length);不建議使用。
		
		sop("count = " + getSubCount(str,"kk"));
		/*
			str=kkabkkcdkkefkks
			str=abkkcdkkefkks
			str=cdkkefkks
			str=efkks
			count = 4
		 */
		
		sop("count="+getSubCount_2(str,"kk"));
		/*
			index=0
			index=4
			index=8
			index=12
			count=4
		 */
	}

	
	public static void sop(String str)
	{
		System.out.println(str);
	}
}
           

求兩個字元串最大相同的子串

思路:

1,将短的那個子串按照長度遞減的方式擷取到。

2,将每擷取到的子串去長串中判斷是否包含,如果包含,已經找到。

package String;

class  StringTest3
{
	/*
	練習四。
	*/
	public static String getMaxSubString(String s1,String s2)
	{

		String max = "",min = "";//初始化了兩個變量max和min

		//以下語句是為了讓max是s1,min是s2
		max = (s1.length()>s2.length())?s1: s2;
		min = (max==s1)?s2: s1;
		
//		sop("max="+max+"...min="+min);
		
		/*
		 0到length-0:1
		 0到length-1:11
		 0到length-2:111
		 0到length-3:1111
		 */
		for(int x=0; x<min.length(); x++)//大圈套小圈
		{
			for(int y=0,z=min.length()-x; z!=min.length()+1; y++,z++)//兩個"名額"的處理方法
			{
				String temp = min.substring(y,z);
				
				//sop(temp);
				/*
				 sop(temp)的輸出結果:
					cvhellobnm
					cvhellobn
					vhellobnm
					cvhellob
					vhellobn
					hellobnm
					cvhello
					vhellob
					hellobn
					ellobnm
					cvhell
					vhello
					hellob
					ellobn
					llobnm
					cvhel
					vhell
					hello
				 */
				//這句語句的意思是,如果長的字元串中含有短的字元串中截取出的最大的子串,則傳回該子串
				if(max.contains(temp))//if(s1.indexOf(temp)!=-1)
					return temp;
			}
		}
		return "";//從debug情況看,此處的return并沒有執行到,在内循環時,已經return了temp,這裡寫null也沒事
	}


	public static void main(String[] args) 
	{
		String s1 = "abcwerthelloyuiodef";
		String s2 = "cvhellobnm";
		sop(getMaxSubString(s2,s1));
	}

	public static void sop(String str)
	{
		System.out.println(str);
	}
}
           

StringBuffer

基本概念

StringBuffer是字元串緩沖區,是一個容器。

特點:

1,長度是可變化的。 2,可以直接操作多個資料類型。 3,最終會通過toString方法變成字元串。

C create 增 U update 改 R read 查D delete删

常用操作方法

增加:

StringBuffer append():将指定資料作為參數添加到已有資料結尾處。

StringBuffer insert(index,資料):可以将資料插入到指定index位置。

嘗試1:在StringBuffer中添加元素 因為sb和sb1都是指向同一個對象,沒有必要通過這種方式來添加元素

class StringBufferDemo 
{
	public static void main(String[] args) 
	{

		StringBuffer sb = new StringBuffer();
		StringBuffer sb1 = sb.append(34);
		sop(sb.toString());//34
		sop(sb1.toString());//34
		sop("sb == sb1: " + (sb == sb1));//sb == sb1: true
		//sb 和 sb1 指向同一個對象,盆還是那個盆

	}

	public static void sop(String str)
	{
		System.out.println(str);
	}
	
}
           

改進:

package String;

class StringBufferDemo 
{
	public static void main(String[] args) 
	{

		StringBuffer sb = new StringBuffer();
		//append方法
			sb.append("abc").append(34).append(true);//方法調用鍊,因為sb.append("abc")方法執行之後,傳回的還是本類的對象
			sop(sb.toString());//輸出:abc34true,将指定資料作為參數添加到已有資料結尾處。
			
			//StringBuffer sb1 = sb.append(34);
		//insert方法
			sb.insert(1, "bac");
			sop(sb.toString());//輸出:abacbc34true,插入在1腳标位置,其後順延
	}

	public static void sop(String str)
	{
		System.out.println(str);
	}
	
}
           

删除:

StringBuffer delete(start,end):删除緩沖區中的資料,包含start,不包含end。

StringBuffer deleteCharAt(index):删除指定位置的字元。

package String;

class StringBufferDemo 
{
	public static void main(String[] args) 
	{
		StringBuffer sb  = new StringBuffer("abcde");
		sop(sb.toString());//輸出:abcde
		
	//delete(start,end)
		sb.delete(1,3);
		sop(sb.toString());//輸出:ade
		//腳标從1開始,1、2的元素被删除。包含頭,不包含尾。
		//清空緩沖區:sb.delete(0,sb.length());
		//sb.delete(2,3);//StringIndexOutOfBoundsException
			
	//deleteCharAt(index)	
		sb.deleteCharAt(2);
		sop(sb.toString());//輸出:ad
		//腳标為2的字元被删除
		
	}

	
	public static void sop(String str)
	{
		System.out.println(str);
	}
	
}
           

擷取:

char charAt(int index) 

int indexOf(String str) 

int lastIndexOf(String str) 

int length() 

String substring(int start, int end) :該方法傳回的是String,而不是StringBuffer

該部分内容與String中擷取的用法一緻

修改:

StringBuffer replace(start,end,string);

void setCharAt(int index, char ch) ;

class StringBufferDemo 
{
	public static void main(String[] args) 
	{
		StringBuffer sb  = new StringBuffer("abcde");
	//replace(start,end,string);
		sb.replace(1,4,"java");//不包含尾,則腳标從1-3的三個元素bcd被替換成了java
		sop(sb.toString());//輸出:ajavae
		
	//setCharAt(int index, char ch) ;
		sb.setCharAt(2,'k');//腳标為2的元素替換為k,該方法不傳回StringBuffer,替換完就結束
		sop(sb.toString());//輸出:ajkvae
		
	}

	
	public static void sop(String str)
	{
		System.out.println(str);
	}
	
}
           

反轉:

StringBuffer reverse();

class StringBufferDemo 
{
	public static void main(String[] args) 
	{
		StringBuffer sb  = new StringBuffer("abcde");
	//StringBuffer reverse();
		sb.reverse();
		sop(sb.toString());//輸出:edcba
	}

	public static void sop(String str)
	{
		System.out.println(str);
	}
}
           

特殊增加:

将緩沖區中指定資料存儲到指定字元數組中

void getChars(int srcBegin, int srcEnd, char[] dst, int dstBegin) 

class StringBufferDemo 
{
	public static void main(String[] args) 
	{
		StringBuffer sb  = new StringBuffer("abcde");	
		char[] chs = new char[6];
		sb.getChars(1,4,chs,1);//把abcde中1-3腳标對應的字元,在chs字元數組中腳标為1的位置插入存儲

		for(int x = 0; x < chs.length; x++)
		{
			sop("chs["+x+"]="+chs[x]+";");
		}
		/*
		 chs[0]= 
		 chs[1]=b;
		 chs[2]=c;
		 chs[3]=d;
		 chs[4]=
		 chs[5]=
		 */
	}
	public static void sop(String str)
	{
		System.out.println(str);
	}
}
           

StringBuilder

JDK1.5 版本之後出現了StringBuilder.

StringBuffer和StringBuilder差別:

StringBuffer是線程同步。 StringBuilder是線程不同步。

以後開發,建議使用StringBuilder

基本資料類型包裝類

基本概念

将基本資料類型封裝成對象的好處,在于可以在對象中定義更多的功能方法操作該資料。

byte Byte

short short

int Integer

long Long

boolean Boolean

float Float

double Double

char Character

基本資料類型對象包裝類的最常見作用,就是用于基本資料類型和字元串類型之間做轉換。

常用方法

基本資料類型轉字元串

/*
基本資料類型 + ""

基本資料類型.toString(基本資料類型值);
*/
34 + "";
Integer.toString(34);//将34整數變成"34";
           

字元串轉基本資料類型

//xxx a = Xxx.parseXxx(String);靜态轉換方式
	int a = Integer.parseInt("123");
	double b = Double.parseDouble("12.23");
	boolean b = Boolean.parseBoolean("true");
//先把字元串或者整數封裝成Interger對象,然後用intValue傳回該Interger的值
	Integer i = new Integer("123");
	int num = i.intValue();//intValue:以int類型,傳回該Interger的值