您好,登錄后才能下訂單哦!
String類的創建(3+1種方式)
2.1 三種構造方法
public String(); 創建一個空白的字符串,不含有任何的內容
public String(char[] array); 根據字符串數組的內容,來創建對應的字符串
public String(byte[] array); 根據字節數組的內容,來創建對應的字符串
三種構造方法用代碼演示一遍
public class ConstructString {
public static void main(String[] args) {
//第一種構造方法:public String(); 創建一個空白的字符串,不含有任何的內容
String str1 = new String();
System.out.println("第一個字符串:" + str1); //第一個字符串:
//第二種構造方法:public String(char[] array); 根據字符串數組的內容,來創建對應的字符串
char[] charArray = {'A', 'B', 'C'};
String str2 = new String(charArray);
System.out.println("第二個字符串:" + str2); //第二個字符串:ABC
//第三種構造方法:public String(byte[] array); 根據字節數組的內容,來創建對應的字符串
byte[] byteArray = {97, 98, 99}; //注意,byte數組的元素,是ASCII碼表的字符對應值
String str3 = new String(byteArray);
System.out.println("第三個字符串:" + str3); //第三個字符串:abc
}
}
2.2 一種直接創建
String str4 = "HelloWorld!"
1
不管有沒有new,只要是雙引號內的東西,JVM會都會判斷到是字符串,所以可以直接創建
常量池
3.1 字符串中關于比較的小知識
我們要知道,在java中,用if(String1 == String2)比較兩個字符串,比較的是這兩個字符串的地址是否一樣,而如果想知道它們的值是否一樣,XM返傭www.fx61.com/brokerlist/xm.html,用的是String的equals方法,比如:
public static void main(String[] args) {
String str1 = new String("hello");
String str2 = new String("hello");
//比較str1的地址是不是和str2的地址一樣
System.out.println( str1 == str2 ); //false 不一樣
//比較str1的值和str2的值是不是一樣
System.out.println( str1.equals(str2) ); //true 一樣,都是hello
}
3.2 堆 (heap) 中的常量池
str1和str2的比較結果為true,證明了它們是同一個字符串,只不過有兩個名字而已,在內存中都是指向同一個地址,它們在的地方叫常量池,所以常量池的hello字符串是可以共享使用,不可修改的。
str1和str3不一樣,證明它們的地址是不一樣的,通過new來創建的字符串,都不是在常量池中,但也是常量
public class ConstantPool {
public static void main(String[] args) {
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");
System.out.println(str1 == str2); //true
System.out.println(str1 == str3); //false
System.out.println(str2 == str3); //false
}
}
public boolean equals(Object obj)
補充:任何對象都可以用Object進行接收,String類的當然也可以。
equals方法具有對稱性,也就是str1.equals(str2)和str2.equals(str1)的結果是一樣的
注意:如果比較雙方是一個常量一個變量,推薦把字符串常量寫在前面
即推薦“abc”.equals(str) 不推薦:str.equals(“abc”)
因為如果字符串str是一個null,“abc”.equals(str)的結果肯定是false,但是str.equals(“abc”)這樣寫將會導致空指針異常 NullPointerException,不要隨隨便便搞一個異常出來。
4.1 String的equalsIgnoreCase方法
它和equals方法的區別在于,它忽略了大小寫,Ignore忽略,Case大小寫
public static void main(String[] args) {
String str1 = "hello";
String str2 = "HellO";
//比較str1的值和str2的值是不是一樣,嚴格區分大小寫
System.out.println( str1.equals(str2) ); //false
//比較str1的值和str2的值是不是一樣,忽略大小寫
System.out.println( str1.equalsIgnoreCase(str2)); //true
}
String中與獲取相關的方法
概述
public int length(); 獲取字符串當中含有的字符個數,拿到字符串長度
public String concat(String str); 將當前字符串和參數字符串拼接成為返回值作為新的字符串
public char charAt(int index); 獲取指定索引位置的單個字符。(索引從0開始)
public int indexOf(String str); 查找參數字符串在本字符串當中首次出現的索引位置,如果沒有沒有-1值
5.1 length()和concat(String str)
public static void main(String[] args) {
//length()方法,獲取字符串的長度
int length = "abcdefghijk".length();
System.out.println("字符串的長度是:" + length);
//concat(String str),拼接字符串
String str1 = "Hello";
String str2 = "World";
String str3 = str1.concat(str2); //str1經過拼接后產生了一個新的字符串,而str1本身不變
//打印拼接后的字符串
System.out.println(str1);
System.out.println(str2);
System.out.println(str3);
}
/輸出結果:
字符串的長度是:11
Hello
World
HelloWorld
/
5.2 charAt(int index)和indexOf(String str)
public static void main(String[] args) {
//charAt(int index),獲取指定索引位置的單個字符
char ch = "hello".charAt(1);
System.out.println("在1號索引位置的字符是:" + ch);
//indexOf(String str),查找參數字符串在本來字符串當中出現的第一次索引位置
//如果沒有,就返回-1值
String original = "helloworld!";
int index = original.indexOf("ll0");
System.out.println("第一次索引值是:" + index); //2
}
6、Struts1和Struts2的區別
(1)從action類上分析:
Struts1要求Action類繼承一個抽象基類。Struts1的一個普遍問題是使用抽象類編程而不是接口。
Struts 2 Action類可以實現一個Action接口,也可實現其他接口,使可選和定制的服務成為可能。Struts2提供一個ActionSupport基類去實現常用的接口。Action接口不是必須的,任何有execute標識的POJO對象都可以用作Struts2的Action對象。
(2)從Servlet 依賴分析:
Struts1 Action 依賴于Servlet API ,因為當一個Action被調用時HttpServletRequest 和 HttpServletResponse 被傳遞給execute方法。
Struts 2 Action不依賴于容器,允許Action脫離容器單獨被測試。如果需要,Struts2 Action仍然可以訪問初始的request和response。但是,其他的元素減少或者消除了直接訪問HttpServetRequest 和 HttpServletResponse的必要性。
(3)從action線程模式分析:
Struts1 Action是單例模式并且必須是線程安全的,因為僅有Action的一個實例來處理所有的請求。單例策略限制了Struts1 Action能作的事,并且要在開發時特別小心。Action資源必須是線程安全的或同步的。
Struts2 Action對象為每一個請求產生一個實例,因此沒有線程安全問題。(實際上,servlet容器給每個請求產生許多可丟棄的對象,并且不會導致性能和垃圾回收問題)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。