JavaSE之三個特殊類(一、String類)
-
String類的兩種例項化方式
(1)、直接賦值:
public class Test1{
public static void main(String[] args) {
String str = "hello"; // str是一個物件,“hello”應該儲存在堆中
System.out.println(str);
}
}
在JVM底層實際上會自動維護一個物件池(字串物件池),如果現在採用了直接賦值的模式進行String類的物件 例項化操作,那麼該例項化物件(字串內容)將自動儲存到這個物件池之中。如果下次繼續使用直接賦值的模式 宣告String類物件,此時物件池之中如若有指定內容,將直接進行引用;如若沒有,則開闢新的字串物件而後將 其儲存在物件池之中以供下次使用。
(2)傳統方法:
public class Test1{
public static void main(String[] args) {
String str = new String("hello"); // 用new進行物件例項化
System.out.println(str);
}
}
通過分析可知,如果使用String構造方法就會開闢兩塊堆記憶體空間,並且其中一塊堆記憶體將成為垃圾空間。除了這 一缺點之外,也會對字串共享產生問題。
1.1 字串的相等比較(equals())
(1)可以使用“==”來判斷
// 基本資料型別比較
int x = 10 ;
int y = 10 ;
System.out.println(x==y); //true
// 在string物件上比較
String str1 = "Hello" ;
String str = new String("Hello") ;
System.out.println(str1==str); // false
(2)用String類提供的equals方法。
String str1 = "Hello" ; String str = new String("Hello") ; System.out.println(str1.equals(str));
釋String類"=="與"equals"的區別:
1. ”==”:進行的數值比較,比較的是兩個字串物件的記憶體地址數值。
2. “equals()”:可以進行字串內容的比較
釋String類中兩種物件例項化的區別:
1. 直接賦值:只會開闢一塊堆記憶體空間,並且該字串物件可以自動儲存在物件池中以供下次使用。
2. 構造方法:會開闢兩塊堆記憶體空間,其中一塊成為垃圾空間,不會自動儲存在物件池中,可以使用intern() 方法手工入池。
1.2 string類中字元與字串的操作方法
字串就是一個字元陣列,所以在String類裡面支援有字元陣列轉換為字串以及字串變為字元的操作方法。
語法:
在此之前先說明求字串和陣列的長度方法:例如:有一個字串str ,陣列str
a:字串的長度用方法來描述(str.length())
b:陣列的長度用屬性來描述(str.length)
(1)將字元陣列中的所有內容變為字串()
public class Test1{
public static void main(String[] args) {
char[] chars = new char[] {'w','o','r','l','d'}; // 陣列的靜態初始化
System.out.println(chars.length); // 列印陣列長度
System.out.println(new String(chars).length()); // 陣列轉化為字串 並列印長度
// 過載 從下標為 0 開始 列印 長度為 3 的字元
System.out.println((new String(chars,0,3)));
}
}
(2)將字元陣列轉化為字串
public class Test1{
public static void main(String[] args) {
String str = "hello";
// 求字串的長度 用方法來描述
System.out.println(str.length());
// 求陣列的長度 用屬性來描述
System.out.println(str.toCharArray().length); // 把字串轉變為字元陣列
// 取得字元 e
System.out.println(str.charAt(1));
}
}
還可以通過一道題來熟悉這兩個方法。
例題:判斷一個指定的字串是否是有數字組成的
public class Test1{
public static void main(String[] args) {
String str = "12a3456";
System.out.println(isNumber(str) ? "字串由數字構成!" : "字串中有非數字成員!");
}
public static boolean isNumber(String str){
// 把字串轉為字元陣列
char[] data = str.toCharArray();
for(int i = 0; i < data.length; i++){
if(data[i]<'0' || data[i]>'9'){ // 不是數字
return false;
}
}
return true;
}
}
1.3 String中位元組與字串的操作方法
位元組常用於資料傳輸以及編碼轉換的處理之中,在String中提供有對位元組的支援。
位元組陣列轉化為字元陣列、字元陣列轉化為位元組陣列可以通過一個例項來說明
例1:將一個字串按指定格式(GBK格式)先編碼,再解碼,最後輸出這個字串
public class Test1{
public static void main(String[] args) throws Exception {
String str = "你好世界";
// 將字元轉化為指定的位元組陣列 String--->byte[]
byte[] data = str.getBytes("GBK"); // 按照GBk格式,編碼
// 將位元組陣列轉化為指定的字元 byte[]--->String
String result = new String(data,"GBK"); // 按照GBK格式,解碼
System.out.println(result);
// 因為編解碼的格式不一樣,所以最終輸出的結果解釋亂碼
}
}
主要過程:第一步:先讓字串轉化為位元組陣列
第二步:對位元組進行編碼(GBK格式)
第三步:再把位元組陣列轉化為字串並輸出。
例2:將小寫的字串轉化為大寫的字串並輸出。
public class Test1{
public static void main(String[] args) {
String str = "abcdef";
byte[] data = str.getBytes(); // 將字串轉化為位元組陣列
for(int i = 0; i < data.length; i++){ // 小寫字母和大寫字母相差32
data[i] -= 32;
}
String result = new String(data); // 位元組陣列轉化為字串
System.out.println(result);
}
}
1.4 String中的字串比較方法
上面使用過String類提供的equals()方法,該方法本身是可以進行區分大小寫的相等判斷。除了這個方法之外,String 類還提供有如下的比較操作:
a:不區分大小寫方法
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equalsIgnoreCase(str2)); // true
b:區分大小寫方法
String str1 = "hello" ;
String str2 = "Hello" ;
System.out.println(str1.equals(str2)); // false
在String類中compareTo()方法是一個非常重要的方法,該方法返回一個整型,該資料會根據大小關係返回三類內 容:
1. 相等:返回0.
2. 小於:返回內容小於0.
3. 大於:返回內容大於0。
1.5 String中字串查詢
語法如上的表格中,下面請看程式碼:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
String str1 = "@@!!hello world$$";
System.out.println(str.contains("world")); // 判斷是否存在world(true
System.out.println(str.contains("this")); // 判斷是否存在this (false
System.out.println(str.indexOf("l")); // 從頭開始查詢第一個 l 的位置 (2
System.out.println(str.indexOf("l",5)); // 從下標為5 的位置開始查詢遇到的第一個 l (9
System.out.println(str.lastIndexOf("l")); // 從後往前開始查詢遇到第一個 l (9
System.out.println(str1.startsWith("@@")); // 判斷是不是以字元@@開頭(true
System.out.println(str1.startsWith("!!",2)); // 從下標為2的位置開始判斷是不是以字元!!開頭(true
System.out.println(str1.endsWith("$$")); // 判斷是不是以$$結尾(true
}
}
1.6 String中字元替換方法
使用一個指定的新的字串替換掉已有的字串資料,可用的方法如下:
程式碼:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
System.out.println(str.replaceFirst("l", "A")); // 把第一個 l 換成 A
System.out.println(str.replaceAll("l", "A")); // 把所有的 l 替換為 A
}
}
1.7 String字串拆分方法
可以將一個完整的字串按照指定的分隔符劃分為若干個子字串。 可用方法如下:
注意:一般的拆分,直接使用語法正常操作就好,如果發現有些內容無法拆分開就需要使用"\"轉義,轉義之後再拆分。
public class Test1{
public static void main(String[] args) {
String str = "hello world hello sky";
String[] data = str.split(" "); // 按照空格拆分
for(String str1 : data){
System.out.println(str1);
}
String[] data1 = str.split(" ",2); // 按照空格拆分,拆分的長度為2
for(String str2 : data1){
System.out.println(str2);
}
}
}
輸出結果:
例題:有一個字串str = xingming:zhangsan|nianling:18 ,把姓名和年齡拆分開。(模式:姓名:年齡|姓名:年齡|..)
程式碼:
public class Test1{
public static void main(String[] args) {
String str = "xingming:zhangsan|nianling:18";
// 要拆分出姓名 和 年齡
// 1、按照 | 拆分 (但是要轉義)
String[] temp = str.split("\\|");
// 按照|拆分完 得到兩個字元陣列 再按照:拆分
for(int i = 0; i < temp.length; i++){
String[] result = temp[i].split(":"); // 按照 : 拆分
System.out.println(result[1]); // 取得拆分後的第二個 字串 就是想要的
}
}
}
執行結果:
1.8 String 中字串的擷取
從一個完整的字串之中截取出部分內容。可用方法如下:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
System.out.println(str.substring(1)); // 從 下標1 開始 擷取到最後
System.out.println(str.substring(1,8)); // 從下標1擷取到下標8
}
}
字串擷取的應用:可以用來實現字串的首字母大寫
實現程式碼:
public class Test1{
public static void main(String[] args) {
String str = "hello world";
// 先擷取首字母 把首字母大寫後 加上 首字母之後的
System.out.println(str.substring(0,1).toUpperCase()+str.substring(1));
}
}
1.9 字串的其他操作方法
其他的語法和上面的大同小異,就不一一介紹了。主要說一下trim()方法和isEmpty()方法。
trim()方法: 主要是去除字串開頭和結尾的空格,字串中間的不影響。
isEmpty()方法:字串的判空操作。具體的以例項來看
程式碼實現:
public class Test1{
public static void main(String[] args) {
// 先判空 不為空去除左右的空格
String str = " hello world ";
System.out.println("["+str+"]");
if(!(str == null || str.isEmpty())){
System.out.println("["+str.trim()+"]");
}
}
}
執行結果:
從執行結果看,字串左右兩端的空格去除了,但是中間的還在,因此使用時候注意別人要求什麼。