1. 程式人生 > >黑馬程式設計師——常用API詳解之Object、Scanner、String

黑馬程式設計師——常用API詳解之Object、Scanner、String

------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------

A:Object類

Object類是所有類的根類,其所有的方法為所有類所共有,所以很多類的基本功能都是依賴於Object實現的。

如:

無參構造方法(Object只有無參構造);

public Object()

直接列印類的物件名(其實是Object的toString方法);

public String toString()
如果沒有重寫該方法,這裡的toString其實相當於:this.getClass().getName()+'@'+this.hashCode();
獲取物件的位元組碼檔案物件;
public final 
Class
<?> getClass()
此方法被final修飾,說明不能被重寫。

equals方法(預設比較地址值,一般都會重寫該方法);

public boolean equals(Object obj)

hashCode方法(返回該物件的雜湊碼值,可以理解為是地址值但是是有區別的);

public int hashCode()
equals方法和hashCode方法在HashSet集合中被重寫,用以保證集合元素的唯一性。

clone方法(建立並返回此物件的一個副本,克隆物件與原物件的地址值不同);

protected Object clone()
如果想克隆某個物件,該物件必須實現Cloneable介面,該介面與後面的序列化介面Serializable類似,都是標記介面。

B:Scanner類

Scanner是在圖形介面之前用來接收鍵盤錄入資料的,在Scanner之前我們是使用main方法中的String args引數類傳遞鍵盤資料。

因為是鍵盤錄入資料,鍵盤屬於標準輸入裝置,所以在建立Scanner物件時,需要傳入一個標準輸入流物件:InputStream的子類物件

構造方法:		Scanner(InputStream source)
Scanner的兩個常用方法:接收int型別的資料和接收String型別的資料
		public int nextInt():獲取一個int型別的值
 		public String nextLine():獲取一個String型別的值
可以與hasNestXxx方法配合用於接收符合判斷要求的資料

如:只接收鍵盤錄入的int型別的資料,並列印

		// 建立物件
		Scanner sc = new Scanner(System.in);

		// 獲取資料
		if (sc.hasNextInt()) {
			int x = sc.nextInt();
			System.out.println("x:" + x);
		} else {
			System.out.println("你輸入的資料有誤");
		}
擴充套件:接收鍵盤錄入資料的3種方法
		 		A:String[] args 
		 			賦值時間:(編譯期間不能賦值)控制檯執行java檔案時賦值
		 			賦值方法:java 類名 hello world java(錄入的資料用空格隔開)
		 		B:Scanner
		 			Scanner sc = new Scanner(System.in);
		 			注意事項:
		 				如果是先錄入int型別的資料,再錄入String型別的資料會出個小問題
		 				Scanner掃描器會把換行符賦值給String型別
		 		C:通過字元緩衝流包裝標準輸入流實現
		 			BufferedInputStream bis = new BufferedInputStream(System.in);
		 			BufferdeReader br = new BufferedReader(new InputStreamReader(System.in));
		 			因為Scanner是jdk5以後才出現的,所以5以前都是使用此方法
		 			原理:
		 				public static final InputStream in	“標準”輸入流
		 				in是System類的一個成員變數,但是返回值卻是一個InputStream位元組流物件,即
		 				InputStream is = System.in;

C:String類與基本型別的包裝類。

String類是使用最多、最頻繁也是方法最多最靈活的類。

1.String類的特點:

1)字串字面值"abc"也可以看成是一個字串物件;

2)一旦被賦值,就不能被改變,圖解如下


在方法區中存在一個字串常量池,當需要給字串賦值或建立字串物件時,都會在常量池中查詢該值是否存在,如果不存在則新建。然後再把常量池的地址值賦值給字串或字串物件。

 * String s = new String(“hello”)和String s = “hello”;是有區別的
 * 前者會建立2個物件,後者建立1個物件。<pre name="code" class="java">/*
 * 看程式寫結果
 * 字串如果是變數相加,先開空間,在拼接。
 * 字串如果是常量相加,是先加,然後在常量池找,如果有就直接返回,否則,就建立。
 */
public class StringDemo4 {
	public static void main(String[] args) {
		String s1 = "hello";
		String s2 = "world";
		String s3 = "helloworld";
		System.out.println(s3 == s1 + s2);// false
		System.out.println(s3.equals((s1 + s2)));// true

		System.out.println(s3 == "hello" + "world");// false 這個我們錯了,應該是true
		System.out.println(s3.equals("hello" + "world"));// true

		// 通過反編譯看原始碼,我們知道這裡已經做好了處理。
		// System.out.println(s3 == "helloworld");
		// System.out.println(s3.equals("helloworld"));
	}
}

這樣的話,在做字串的拼接時其實是很浪費記憶體空間的,因為每拼接一個字串都要在在常量池中開闢一個空間,所以有了後來的字串緩衝區。

2.字串的主要運用場景:

1)字串的判斷

 * ==:比較引用型別比較的是地址值是否相同
 * equals:比較引用型別預設也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內容是否相同。<pre name="code" class="java"> * String類的判斷功能:
* boolean equals(Object obj):比較字串的內容是否相同,區分大小寫 * boolean equalsIgnoreCase(String str):比較字串的內容是否相同,忽略大小寫 * boolean contains(String str):判斷大字串中是否包含小字串 * boolean startsWith(String str):判斷字串是否以某個指定的字串開頭 * boolean endsWith(String str):判斷字串是否以某個指定的字串結尾 * boolean isEmpty():判斷字串是否為空。

2)字串的處理:獲取;拼接;替換;去兩端空格;按字典順序比較;

 * String類的獲取功能
 * int length():獲取字串的長度。
 * char charAt(int index):獲取指定索引位置的字元
 * int indexOf(int ch):返回指定字元在此字串中第一次出現處的索引。
 * 		為什麼這裡是int型別,而不是char型別?
 * 		原因是:'a'和97其實都可以代表'a'
 * int indexOf(String str):返回指定字串在此字串中第一次出現處的索引。
 * int indexOf(int ch,int fromIndex):返回指定字元在此字串中從指定位置後第一次出現處的索引。
 * int indexOf(String str,int fromIndex):返回指定字串在此字串中從指定位置後第一次出現處的索引。
 * String substring(int start):從指定位置開始擷取字串,預設到末尾。
 * String substring(int start,int end):從指定位置開始到指定位置結束擷取字串。<pre name="code" class="java"> * 拼接功能
* String concat(String str):把字串拼接。與"+"效果相同,一般不用。
 * 替換功能:
 * String replace(char old,char new)
 * String replace(String old,String new)
 *
 * 去除字串兩空格	
 * String trim()
 * 
 * 按字典順序比較兩個字串  
 * int compareTo(String str)
 * int compareToIgnoreCase(String str)此時字串會自動轉換為一個字元陣列,然後按照對應關係一一比較,直到相減(this-str)得到的值不等於0停止比較。如果是兩個以相同字元開頭,且具有包含關係的字串比較則返回值是字串的長度之差。如:hello和hel比較,結果為2.

3)型別間的轉換

 * String類,字串內容的大小寫轉換
 * 			String toLowerCase():把字串轉成小寫。
 * 			String toUpperCase():把字串轉成大寫。
 * String類轉換為常見資料型別
 * 		轉換為陣列:char[] byte[]
 * 			byte[] getBytes()把字串轉換為位元組型別的陣列
 * 			char[] toCharArray()把字串轉化成字元型別的陣列
 * 		由數字組成的字串轉換為int型別
 * 			1)使用int包裝類Integer的靜態parseInt方法
 * 			public static int parseInt(String s)
 * 			2)使用Integer的構造方法
 * 			public Integer(String s)	Integer可以自動拆箱為int
 * 常見資料型別轉換為String型別
 * 		String類的valueOf靜態方法可以把任意型別的資料轉成字串
 * 			static String valueOf(char[] chs)
 * 			static String valueOf(int i)
 * 			static String valueOf(Object obj)
 * 		Integer類的toString方法(任意包裝類的該方法都可以轉換為String型別)
 * 			static String toString(int i)
 * 			public String toString()
 * 擴充套件:char型別轉換為int型別
 * 			char--String--int
 * 			int = Integer.parseInt(String.valueOf(char));另:直接使用"+"進行字串的拼接,同樣可以實現其他型別到String型別的轉換。

4)與正則表示式的配合使用

 * 判斷功能
 *		String類的public boolean matches(String regex)	判斷此字串是否符合該規則

 * 分割功能
 *		String類的public String[] split(String regex)
 *		根據給定正則表示式的匹配拆分此字串。<pre name="code" class="java"> * 替換功能
* String類的public String replaceAll(String regex,String replacement) * 使用給定的 replacement 替換此字串所有匹配給定的正則表示式的子字串。
 * 獲取功能
* Pattern和Matcher類的使用 * 模式和匹配器的基本使用順序 // 把規則編譯成模式物件Pattern p = Pattern.compile(regex);// 通過模式物件得到匹配器物件Matcher m = p.matcher(s);
	while (m.find()) {
System.out.println(m.group());}

5)字串的經典案例:統計一個小串在長串中出現的次數

/*
 * 統計大串中小串出現的次數
 舉例:在字串” woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun”中java出現了5次
 分析:
 A:定義幾個變數:大串、小串、索引和統計次數
 B:獲取小串在大串中第一次出現的索引值
 C:如果沒有返回-1;如果有統計次數
 D:然後用小串長度加上索引值去擷取大串並重新賦值給大串
 E:重複B步操作
 * int indexOf(int ch):返回指定字元在此字串中第一次出現處的索引。
 * int indexOf(String str):返回指定字串在此字串中第一次出現處的索引。
 * String substring(int start):從指定位置開始擷取字串,預設到末尾。截下來的字串包含start
 * String substring(int start,int end):從指定位置開始到指定位置結束擷取字串。包含start不包含end
 */
public class CountNum2 {

	public static void main(String[] args) {
		// 給定一個字串
		String bigS = "woaijavawozhenaijavawozhendeaijavawozhendehenaijavaxinbuxinwoaijavagun";
		// 給定一個小串
		String smaS = "java";
		//寫一個方法實現
		int count = countNum(bigS,smaS);
		System.out.println(count);
	}

	private static int countNum(String bigS, String smaS) {
		//定義一個統計變數和一個索引值
		int index;
		int count=0;
		//獲取小串在大串中第一次出現的索引值賦值給index,如果不存在則預設返回-1
		//然後用該值加上小串長度去擷取大串再次賦值給大串並count++,直到index=-1
		while((index=bigS.indexOf(smaS))!=-1){
			count++;
			bigS = bigS.substring(index+smaS.length());
		}
		return count;
	}
}