黑馬程序員------java基礎String類與StringBuffer

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ---------------------- 

 

 

一.String概述

/* * string:字符串類 public final class String{}
 * 1、  只要是""定義的都是String的對象
 * 2、字符串的最大特點:一旦被初始化就不能夠被改變
 * 3、  String s = "abc";  //s是一個類類型變量,"abc"是一個對象
 * 4、  ==和equals的區別
 *     ==是比較對象變量所指向的內存地址值(就是對象在堆內存中的位置),而不是對象本身
 *     equals比較的是對象本身的值
 * 5、String s = "abc" 和  String s = new String("abc")的區別
 *         :Java運行環境有一個字符串池,由String類維護。
 *   執行語句String s="abc"時,首先查看字符串池中是否存在字符串"abc",
 *   如果存在則直接將"abc"賦給s,如果不存在則先在字符串池中新建一個字符串
 * "abc",然後再將其賦給s。執行語句String s=new String("abc")時,
 *  不管字符串池中是否存在字符串"abc",直接新建一個字符串"abc"
 *  (注意:新建的字符串"abc"不是在字符串池中),然後將其付給s。 
 *  
 *  5.1  前一語句的效率高,後一語句的效率低,因爲新建字符串佔用內存空間
 *  5.2 s1和s2的區別是s1在內存中有一個對象,而s2在內存中有兩個對象
 * */

 

代碼示例:

public class StringDemo {
	public static void main(String[] args) {
		 String s1 = "abc";   
		 String s2 = new String("abc");  //每new一下就是創建了一個新的對象
		 String s3 = new String("abc");
		 System.out.println(s3==s2);
		 System.out.println(s1.equals(s3));
	}
}

 

 

 

二.String方法運用(獲取、轉換、判斷、切割、反轉)

/*
 *String 字符串裏面的常用方法
 *   //獲取字符串長度:  legth();
 *  //返回指定索引處的字符值:   char charAt(int index);
 *  //返回指定字符在字符串中第一次出現的索引值:  int indexOf(int ch);
 *  //返回指定字符在字符串中第一次出現的索引值,但從指定的索引開始查找:   int indexOf(int ch,int fromindex);
 * */

 

代碼示例:

public class StringMethod {
	static String s = " abcdakhABCD     ";
	static String st = "Demo.java";
	static String s1 = "Demo1.java";
	
	public static void main(String[] args) {
//		string_set();
//		string_is();
//		string_trans();
//		string_replace();
		string_split();
//		string_substring();
//		string_show();
	}
	
	//打印方法
	public static void print(Object obj){
		System.out.println(obj);
	}
	
	//獲取方法
	public static void string_set(){
		
		/********獲取*********/
		//獲取長度
		print(s.length());
		
		//返回指定索引處的字符值    
		print(s.charAt(3));   //注意:如果沒有找到,就返回角標越界異常
		
		//返回指定字符處的索引值
		print(s.indexOf('d'));  //注意:如果沒有找到,就返回-1
		
		//返回指定字符處的索引值,但從指定位置索引開始查找
		print(s.indexOf('a',2));
		
		//返回指定字符處的索引值,但從最後往前讀取(注意:但索引仍然不變)
		print(s.lastIndexOf('a'));
		
	}
	
	//判斷方法
	public static void string_is(){
		
		/*********判斷*********/		
		//判斷字符串中是否包含某一子串(判斷文件中是否包含.java文件)
		print(st.contains(".java"));
		
		//判斷字符串開頭處是否爲此字符串(可以用來判斷文件名)
		print(st.startsWith("Demo"));
		
		//判斷字符串結尾處是否爲此字符串(可以用來判斷文件後綴)
		print(st.endsWith(".java"));
		
		//判斷字符串是否爲空(如length爲0,則true)
		print(st.isEmpty());
				
		//判斷字符串內容是否相等
		print(s.equals(st));
		
		//判斷字符串內容是否相等,但不考慮大小寫
		print(s.equalsIgnoreCase(st));
	}
	
	//轉換方法
	public static void string_trans(){
		byte[] b = {'a','b','c','d','a'};
		/*******轉換********/
		//構造函數String(byte[] b),將字符數組轉換成字符串
		print(new String(b));
		
		//構造函數String(byte[] b,s,e),將字符數組轉換爲字符串,s代表要轉換的起始位置,e代表要轉換多少個
		print(new String(b,2,3));
		
		//將基本數據類型轉換爲字符串 static String valueOf(int或double);
		print(String.valueOf(3.43));
		//注意:這方法一般沒人使用,因爲 print(3.43+"");等效於上面的方法
		
		//將字符串轉換成字符數組(char[] toCharArray())
		print(s.toCharArray());
		
		//將字符串轉換成字節數組(byte[] getbytes())
		print(s.getBytes());
		//注意:字符串和字節數組在轉換過程中是可以指定編碼表的
	
	}
	
	//替換
	public static void string_replace(){
		/***********替換************/
		//替換掉指定的字符       String replace(char oldChar,char newChar) 
		System.out.println(s.replace('a','i'));  //這裏是新創建了一個字符串
		System.out.println(s);
		//注意:輸出的結果仍然是原字符串,因爲字符串一旦被初始化就不能夠被改變
		
		//替換掉指定的字符串
		System.out.println(s.replace("abc","cba"));
		System.out.println(s);
		
	}
	
	//切割
	public static void string_split(){
		/********切割**********/
		//把字符串切割  String[] split()    返回的是一個String數組
		String[] arr = s.split("d");  //從"b"兩邊切割開來
		for(int i=0;i<arr.length;i++){	
			System.out.println(arr[i]);
		}
	}
	
	//字串
	public static void string_substring(){
		//獲取字符串中任意一段字符串 String subString(begin);從指定位置開始到結束
		System.out.println(s.substring(1));
		
		//獲取字符串中任意一段字符串String subString(begin,end);從開始位置開始到結束位置,但不包含結束位置
		System.out.println(s.substring(1,4));
	}
	
	//toLowerCase()方法、toUpperCase()方法、trim()方法、compareTo()方法
	public static void string_show(){
		System.out.println(s.toLowerCase());  //把字符串全轉換成小寫
		System.out.println(s.toUpperCase());    //把字符串權轉換成大寫
		System.out.println(s.trim());     //忽略字符串前後的空格
		System.out.println(st.compareTo(s1));  //按順序對字符串比較,如果sts1,則返回正數
	}
}

 

 

 

三.練習1,:模擬trim方法,去掉字符串兩端空格

/*
 * 問題:模擬trim方法,去除字符串兩端的空格
 * 思路:
 * 1、既然是要去除兩端的空格,那麼就定義兩個變量,一個從前面往後讀取,一個從後面往前讀取
 * 2、當讀取到字符不爲空格時就停下,這時候用substring方法取出字符串就OK了
 *
 * 思路:
 1,判斷字符串第一個位置是否是空格,如果是繼續向下判斷,直到不是空格爲止。
  結尾處判斷空格也是如此。
 2,當開始和結尾都判斷到不是空格時,就是要獲取的字符串。
 
 * */

 代碼示例:

public class String_lianxi1 {
	static String s = "   fa fa fa   ";
	public static void main(String[] args) {
		int start=0,end=s.length()-1;
		while(s.charAt(start)==' '){
			start++;
		}
		while(s.charAt(end)==' '){
			end--;
		}
		System.out.println(s.substring(start,end+1));                         
	}
}

 

 

 

四.練習2:將字符串反轉

public class String_lianxi2 {
	static String s = "abcde";
	public static void main(String args[]){
		//打印舊字符串
		System.out.println(s);
		//首先將字符串轉換爲字符數組
		char arr[] = s.toCharArray();
		//進行反轉
		reverse(arr,s,1,4);
		//最後將字符數組轉換爲字符串
		String s1 = new String(arr);
		//打印新字符串
		System.out.println(s1);
	}
	
	//字符串反轉方法
	public static void reverse(char arr[],String s,int x,int y){
		for(int start=x,end=y;start<end;start++,end--){
			//然後讓字符數組中的字符互換位置
			char num = arr[start];
			arr[start]= arr[end];
			arr[end] = num;		
		}
	}
}

 

 

 

五.練習3:獲取一個字符串在另一個字符串中出現的次數

public class String_lianxi3 {
	static String s = "aabbccddeeffggaasbbccdd";
	static String s1 = "aa";
	
	public static void main(String[] args) {
//		num(s,s1);
		System.out.println(num());
		
	}

//	public static void num(String s,String s1){
//		if(s.contains(s1)){
//			String[] arr= s.split(s1);  //因爲這裏一切的話,開頭字符串會把原來的字符串切成一個空和後面的
//			System.out.println("字符串s中有"+(arr.length-1)+"個s1字符串");
//		}else{
//			System.out.println("沒有");
//		}
//	}
	public static int num(){
		int count = 0;
		int index = 0;
		while((index=s.indexOf(s1,index))!=-1){
			index+=s1.length();
			count++;
			System.out.println(s);
		}
		return count;
	}
}

 

 

 

 

六.StringBufer和StringBuilder

/*
 *
 * StringBuffer是字符串緩衝器,是一個容器
 * 三個特點
 * 1、長度是可以變化的
 * 2、可以添加任意數據類型數據
 * 3、最終會通過toString變成字符串
 *
 * CURD 
 * C:create 創建
 * U:Update 更新,修改
 * R:read   讀取
 * D:Delte  刪除
 *
 * 1、存儲
 *   StringBuffer append(數據); 將指定數據作爲參數添加到已有數據的結尾處
 *   StringBuffer insert(index,數據); 將制定數據作爲參數添加到已有數據的指定位置
 *
 * 2、刪除
 *   StringBuffer delete(start,end); 刪除緩衝區內指定開頭和結尾,不包括結尾
 *   StringBuffer deleteCharAt(index);  刪除指定索引的字符
 *
 * 3、獲取
 *   int CharAt(index);
 *   char indexOf(char);
 *   int lastIndexOf(char);
 *   int length();
 *   String subString(start,end);  //注意:這個返回的是字符串
 *
 * 4、修改
 *   StringBuffer replace(start,end,string);
 *   void setCharAt(index,char);
 * 
 * 5、反轉
 *   StringBuffer reverse();
 *
 * 6、getChar(int indexstart,int indexend,char[] c,int charbegin):
 *       StringBuffer數據開始角標    結束角標        存入的數組       從數組那個位置開始存入
 *   把StringBuffer緩衝區內的指定範圍的數據存入到數組中,並且是按照數組中指定開始位置進行存入
 *
 * 在JDK1.5以後,出現了StringBuilder
 *
 * StringBuffer和StringBuilder的區別:
 * StringBuffer是線程同步
 * StringBuilder是線程不用步
 *
 * 以後開發建議使用StringBuilder
 *
 * 升級因素:
 * 1、提高效率
 * 2、簡化書寫
 * 3、提高安全性
 *
 * */

代碼示例:

public class StringBuffer {

	public static void main(String[] args) {
		//method_add();
	}	
	
	public static void method_add(){
		StringBuffer sb = new StringBuffer();
		/*	StringBuffer sb = new StringBuffer();
		 *	StringBuffer sb1 = sb.append(34);
		 *	print(sb.toString());
		 *	print(sb1.toString());
		 * 
		 * 此例結果爲34,34,
		 * 原因:字符串緩衝區就相當於一個面盆,這裏開始創建了一個面盆,然後往裏面加了一點面
		 * 但是這個面盆還是沒有改變,現在,sb和sb1都指向這個面盆,所以結果一樣
		 * 
		 * */
		
		//sb.append("sf").append(true).append();
		//sb.insert(1,'f');
		System.out.println(sb);
	}
	
	public static void method_del(){
		StringBuffer sb = new StringBuffer();
		//清空緩衝區
//		sb.delete(0,sb.length());
//		//刪除指定索引的字符
//		sb.deleteCharAt(3);
		//刪除指定開頭和結爲字符,不包括結尾
//		sb.delete(1,4);
	}
	
	public static void method_update(){
//		StringBuffer sb = new StringBuffer("fafafa");
//		
//		sb.replace(1,3,"haha");
//		sb.setCharAt(1,'a');
	}
	
	//打印方法
	public static void print(String s){
		System.out.println(s);
	}

}

 

 

 

 

 

七.基本數據類型對象包裝類

/*
 * 基本數據類型對象包裝類
 *
 * 基本數據類型類型      引用數據類型
 * byte   Byte 
 * char         Character    這個不能把字符串轉爲char,因爲本身即是字符
 * int      Integer
 * short  Short
 * long   Long
 * double  Double
 * boolean  Boolean
 * float  Float
 *
 *
 * 基本數據類型對象包裝類最常見的應用就是用於基本數據類型與字符串類型之間的相互轉換
 *
 * 基本數據類型轉成字符串類型
 *   1、 基本數據+""
 *   2、基本數據類型.toString(基本數據類型值);
 *    integer.toString(12);  //將整數12轉成字符串"12";
 *
 * 字符串類型轉成基本數據類型
 *   格式:數據類型  變量  = 基本數據類型包裝類.parse數據類型(字符串);
 *    int   i  = Integer.parseInt("abcd");
 *    long  l   = Long.parseLong("abcd");
 *
 * 十進制轉成其他進制
 *   toBinaryString();  //轉成二進制
 *   toHexString();    //轉成十六進制
 *   toOctalString();   //轉成八進制
 *
 * 其他進制轉成十六進制
 *   parseInt(string,radix);  //string代表數據,radix代表進制
 *
 * */

代碼示例:

public class Ji_ben_shu_ju_lei {
	public static void main(String[] args) {
		long  l  = Long.parseLong("12");
		System.out.println(l+1);
	}
}

 

 

 

八.基本數據類型對象包裝類新特性(JDK1.5以後)

public class Ji_ben_shu_ji_lei_NEW {
	public static void main(String[] args){
		Integer i = new Integer(123);
		Integer i1 = 123; //123是對象,類類型引用必須指向對象,這是自動裝箱,等同於new Integer(123);
		
		i = i + 2;   /**進行自動拆箱(原理:i=i.intValue())
					  *	i是一個對象引用,i先變成int類型,再和2進行加法運算
					  * 然後再自動裝箱,賦值給i
					  */
				
		System.out.println("i==i1:"+(i==i1));
		
		
		Integer a = 128;
		Integer b = 128;
		System.out.println(a==b);   //原因:創建了兩個對象
		
		Integer c = 127;
		Integer d = 127;           //c和d指向同一個對象
		System.out.println(c==d);  //因爲當數值在Byte範圍(-128  127)時,對於新特性,如果該數值已經存在,則不會開闢新的空間
	}
}

 

---------------------- ASP.Net+Android+IOS開發.Net培訓、期待與您交流! ----------------------詳細請查看:http://edu.csdn.net

發佈了35 篇原創文章 · 獲贊 0 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章