常見物件-String類

ZHOU_VIP發表於2017-05-07

String類的構造方法:


package cn.itcast_01;

/*
 * 字串:就是由多個字元組成的一串資料。也可以看成是一個字元陣列。
 * 通過檢視API,我們可以知道
 * 		A:字串字面值"abc"也可以看成是一個字串物件。
 * 		B:字串是常量,一旦被賦值,就不能被改變。
 * 
 * 構造方法:
 * 		public String():空構造
 *		public String(byte[] bytes):把位元組陣列轉成字串
 *		public String(byte[] bytes,int index,int length):把位元組陣列的一部分轉成字串
 *		public String(char[] value):把字元陣列轉成字串
 *		public String(char[] value,int index,int count):把字元陣列的一部分轉成字串
 *		public String(String original):把字串常量值轉成字串
 *
 * 字串的方法:
 * 		public int length():返回此字串的長度。
 */
public class StringDemo {
	public static void main(String[] args) {
		// public String():空構造
		String s1 = new String();
		System.out.println("s1:" + s1);                   //s1:
		System.out.println("s1.length():" + s1.length()); //s1.length():0


		// public String(byte[] bytes):把位元組陣列轉成字串
		byte[] bys = { 97, 98, 99, 100, 101 };
		String s2 = new String(bys);
		System.out.println("s2:" + s2);                   //s2:abcde
		System.out.println("s2.length():" + s2.length()); //s2.length():5


		// public String(byte[] bytes,int index,int length):把位元組陣列的一部分轉成字串
		// 我想得到字串"bcd"
		String s3 = new String(bys, 1, 3);
		System.out.println("s3:" + s3);                   //s3:bcd
		System.out.println("s3.length():" + s3.length()); //s3.length():3


		// public String(char[] value):把字元陣列轉成字串
		char[] chs = { 'a', 'b', 'c', 'd', 'e', '愛', '林', '親' };
		String s4 = new String(chs);
		System.out.println("s4:" + s4);                   //s4:abcde愛林親
		System.out.println("s4.length():" + s4.length()); //s4.length():8


		// public String(char[] value,int index,int count):把字元陣列的一部分轉成字串
		String s5 = new String(chs, 2, 4);
		System.out.println("s5:" + s5);                   //s5:cde愛
		System.out.println("s5.length():" + s5.length()); //s5.length():4

		
		//public String(String original):把字串常量值轉成字串
		//這樣寫意義不大
		String s6 = new String("abcde");
		System.out.println("s6:" + s6);                   //s6:abcde
		System.out.println("s6.length():" + s6.length()); //s6.length():5

		
		//字串字面值"abc"也可以看成是一個字串物件。
		String s7 = "abcde";
		System.out.println("s7:"+s7);                     //s7:abcde
		System.out.println("s7.length():"+s7.length());   //s7.length():5
		
		//補充:最後一個這樣寫比較好,大部分情況下用這個,總之要知道位元組陣列和字元陣列都可以轉成字串
		
	}
}

String的特點一旦被賦值就不能改變:


package cn.itcast_02;

/*
 * 字串的特點:一旦被賦值,就不能改變。
 */
public class StringDemo {
	public static void main(String[] args) {
		String s = "hello";
		s += "world";
		System.out.println("s:" + s); // helloworld
	}
}


----------------------------------------------------------------------------------------------------------------------------------------------------------------

面試題:String字面值物件和構造方法建立物件的區別


package cn.itcast_02;

/*
 * String s = new String(“hello”)和String s = “hello”;的區別?
 * 有。前者會建立2個物件,後者建立1個物件。
 * 
 * ==:比較引用型別比較的是地址值是否相同
 * equals:比較引用型別預設也是比較地址值是否相同,而String類重寫了equals()方法,比較的是內容是否相同。
 */
public class StringDemo2 {
    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = "hello";

        System.out.println(s1 == s2);     // false
        System.out.println(s1.equals(s2));// true
    }
}


看程式寫結果:

package cn.itcast_02;

/*
 * 看程式寫結果
 */
public class StringDemo3 {
	public static void main(String[] args) {
		String s1 = new String("hello");
		String s2 = new String("hello");
		System.out.println(s1 == s2);     // false
		System.out.println(s1.equals(s2));// true

		String s3 = new String("hello");
		String s4 = "hello";
		System.out.println(s3 == s4);     // false
		System.out.println(s3.equals(s4));// true

		String s5 = "hello";
		String s6 = "hello";
		System.out.println(s5 == s6);     // true
		System.out.println(s5.equals(s6));// true
	}
}


package cn.itcast_02;

/*
 * 看程式寫結果
 * 字串如果是變數相加,先開空間,再拼接。
 * 字串如果是常量相加,是先加,然後在常量池找,如果有就直接返回,否則,就建立。
 */
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");     // true,常量相加,是先加,然後在常量池找,如果有就直接返回
        // System.out.println(s3 == "helloworld");
        
        System.out.println(s3.equals("hello" + "world"));// true
        
        
    }
}

String類的判斷功能:

package cn.itcast_03;

/*
 * String類的判斷功能:
 * boolean equals(Object obj):比較字串的內容是否相同,區分大小寫
 * boolean equalsIgnoreCase(String str):比較字串的內容是否相同,忽略大小寫
 * boolean contains(String str):判斷大字串中是否包含小字串
 * boolean startsWith(String str):判斷字串是否以某個指定的字串開頭
 * boolean endsWith(String str):判斷字串是否以某個指定的字串結尾
 * boolean isEmpty():判斷字串是否為空。
 * 
 * 注意:
 * 		字串內容為空和字串物件為空這是兩個東西
 * 		  內容為空: String s = "";  但是它是物件
 * 		  物件為空: String s = null;物件都不存在哪能調方法呀
 */
public class StringDemo {
	public static void main(String[] args) {
		// 建立字串物件
		String s1 = "helloworld";
		String s2 = "helloworld";
		String s3 = "HelloWorld";

		// boolean equals(Object obj):比較字串的內容是否相同,區分大小寫
		System.out.println("equals:" + s1.equals(s2));  //true
		System.out.println("equals:" + s1.equals(s3));  //false


		// boolean equalsIgnoreCase(String str):比較字串的內容是否相同,忽略大小寫
		System.out.println("equals:" + s1.equalsIgnoreCase(s2));  //true
		System.out.println("equals:" + s1.equalsIgnoreCase(s3));  //true


		// boolean contains(String str):判斷大字串中是否包含小字串
		System.out.println("contains:" + s1.contains("hello"));  //true
		System.out.println("contains:" + s1.contains("hw"));     //false,h和w必須連一起的


		// boolean startsWith(String str):判斷字串是否以某個指定的字串開頭
		System.out.println("startsWith:" + s1.startsWith("h"));    //true
		System.out.println("startsWith:" + s1.startsWith("hello"));//true
		System.out.println("startsWith:" + s1.startsWith("world"));//false


		// 練習:boolean endsWith(String str):判斷字串是否以某個指定的字串結尾這個自己玩

		// boolean isEmpty():判斷字串是否為空。
		System.out.println("isEmpty:" + s1.isEmpty()); //false

		String s4 = "";
		System.out.println("isEmpty:" + s4.isEmpty()); //true
		
		String s5 = null;
		// s5物件都不存在,所以不能呼叫方法,空指標異常
		System.out.println("isEmpty:" + s5.isEmpty());// NullPointerException
		
		
	}
}

補充:

String中對NULL和""的判斷:


//錯誤用法一:  
if (name == "") {  
	//do something  
}  
//錯誤用法二:  
if (name.equals("")) {  
	//do something  
}  
//錯誤用法三:  
if (!name.equals("")) {  
	//do something  
} 


//正確的寫法應該先加上name != null的條件,如例:  
if (name != null && !name.equals("")) {  
	//do something  
}  
//或者  
if (!"".equals(name)) {//將""寫在前頭,這樣,不管name是否為null,都不會出錯。  
	//do something  
} 

再補充:

1.

null表示這個字串不指向任何的東西,如果這時候你呼叫它的方法,那麼就會出現空指標異常。

""表示它指向一個長度為0的字串,這時候呼叫它的方法是安全的。

2.

null不是物件,""是物件,所以null沒有分配空間,""分配了空間,例如:

String s1= "";    s1引用一個空串,s1已經例項化

String s2 = null; s2引用為空,s2還不是一個例項化的物件

3.

物件用equals比較,null用等號比較。

如果str=null;下面的寫法錯誤:

if(str.equals("")||str==null){

}

正確的寫法是:

//先判斷是不是物件,如果是,再判斷是不是空字串

if(str==null||str.equals("")){

}

4.

判斷一個字串是否為空,首先就要確保他不是null,然後再判斷他的長度。

String str = xxx;

if(str != null && str.length() != 0) {

}

再補充:今天看到我們專案中判斷字串是否為空是這樣寫的

if(str == null || str.trim().length() <= 0){

}

5.判斷字串是否為空的效率



補充:如果在其他類中想要呼叫Hello類中的function2()方法,要麼將方法加static改成靜態方法,要麼new出Helllo物件調function2()方法

參考:http://blog.csdn.net/qq_27918787/article/details/52506406


相關文章