黑馬程式設計師——常用API詳解之Object、Scanner、String
阿新 • • 發佈:2019-02-12
------Java培訓、Android培訓、iOS培訓、.Net培訓、期待與您交流! -------
這樣的話,在做字串的拼接時其實是很浪費記憶體空間的,因為每拼接一個字串都要在在常量池中開闢一個空間,所以有了後來的字串緩衝區。
A:Object類
Object類是所有類的根類,其所有的方法為所有類所共有,所以很多類的基本功能都是依賴於Object實現的。
如:
無參構造方法(Object只有無參構造);
public Object()
直接列印類的物件名(其實是Object的toString方法);
public String toString()
如果沒有重寫該方法,這裡的toString其實相當於:this.getClass().getName()+'@'+this.hashCode();
獲取物件的位元組碼檔案物件;public finalClass<?> 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;
}
}