一文搞定Spark叢集的安裝(Standalone模式)
String物件是不可變的,字串一旦建立,內容不能再改變。底層用char[]存放,故可以使用字串直接量或字元陣列建立一個字串物件(其中String類中有13個構造方法),下面的語句使用字串直接量
"welcome to java"建立一個String物件message:
String message = new String("welcome to java");
java將字串直接量看著String物件,所以,下面的語句是合法的:
String message = "welcome to java";
還可以用字元陣列建立一個字串
char[] charArray = {'g','o','o','d'}; String message= new String(charArray);
注意:String變數儲存的是對String物件的引用,String物件裡儲存的才是字串的值。嚴格地講,術語String變數、String物件和字串值是不同的。但在大多數情況下,它們之間的區別是可以忽略的。為簡單起見,術語字串將經常被用於指String變數、String物件和字串的值。
不可變字串與限定字串
String物件是不可變的,它的內容是不能改變的。下列程式碼會改變你字串的內容嗎?
String s = "java";
s = "HTML";
答案是不能.第一條語句建立了內容為“java”的String物件,並將其引用賦值給s。第二條語句建立了一個內容為“HTML”的新String物件,並將其引用賦值給s。賦值後第一個String物件仍然存在,但是不能再訪問它,因為變數s現在指向了新的物件。
因為字串是不可改變的,但同時又會頻繁的使用,所以java虛擬機器為了提高效率並節約記憶體,對具有相同字元序列的字串直接量使用同一個例項。這樣的例項稱為限定的(interned)字串。例如,下面的語句:
String s1 = "a"; String s2 = "b"; String s3 = "a"+ "b"; String s4 = s1 + s2; String s5 = "ab"; String s6 = s4.intern(); //問 System.out.println(s3 == s4); System.out.println(s3 == s5); System.out.println(s3 == s6); String x2 = new String("c") + new String("d"); String x1 = "cd"; x2.intern(); //問,如果調換了[最後兩行程式碼]的位置呢,如果是jdk1.6呢 System. out.println(x1 == x2);
從位元組碼和常量池的角度來分析下剛才這些程式碼的底層原理
String的常用操作
public int length():獲取字串當中含有的字元個數,返回字串長度。 public String concat(String str):將當前字串和引數字串str連線,返回值新的字串。 public char charAt(int index):獲取指定索引位置的單個字元。(索引從0開始。) public String toUpperCase():返回所有字母大寫的新字串 public String toLowerCase():返回所有字母小寫的新字串 public String trim(): 返回去掉兩邊空白字元的新字串。 //字串比較 public boolean equals(String str):如果該字串等於字串str,返回true public boolean equalsIgnoreCase(String str):如果該字串等於字串str,返回true.不區分大小寫 public int compareTo(String str):返回一個大於0、等於0、小於0的整數,表明一個字串是否大於、等於或者小於str public int compareToIgnoreCase(String str):返回一個大於0、等於0、小於0的整數,表明一個字串是否大於、等於或者小於str。不區分大小寫 public boolean startsWith(String prefix): 返回字串是否以字首prefix開頭 public boolean endsWith(String suffix): 返回字串是否以後綴suffix結束 public boolean contains(String str): 檢查字串中是否包含子串str //字串擷取 public String substring(int begin):擷取字串,從特定位置begin的字元開始到字串結尾。 public String substring(int begin,int end):擷取字串,從特定位置begin的字元開始到end-1的字元。(長度為end - begin) //字串查詢,提供了幾個版本的indexOf和lastIndexOf方法 public int indexOf(String str):查詢引數字串在本字串當中首次出現str的索引位置,如果沒有返回-1值。 public int indexOf(String str,int fromIndex):查詢引數字串在本字串當中fromIndex之後首次出現str的索引位置,如果沒有返回-1值。 public int lastIndexOf(String str):查詢引數字串在本字串當中最後一個出現str的索引位置,如果沒有返回-1值。 public int lastIndexOf(String str,int fromIndex):查詢引數字串在本字串當中fromIndex之前出現最後一個str的索引位置,如果沒有返回-1值。
字串的替換和分割
一旦建立了字串,它的內容就不能改變。但是,方法replace、replaceAll和replaceFirst會返回一個源自原始字串的新字串(並未改變原始字串)。replace方法有幾個過載方法。split方法可以從一個指定分隔符的字串中提取標識。
public String replace(String oldString,String newString):將字串中所有匹配的子串old String替換為新串newString public String replaceAll(String oldString,String newString):將字串中所有匹配的子串old String替換為新串newString。支援模式匹配(正則表示式) public String[] split(String delimiter):從一個指定分隔符的字串中提取標識,返回標識字串陣列
String token = "趙老師是一個好老師,你喜歡趙老師嗎?";
//將所有的趙老師替換為Miss Cang
String info = token.replace("趙老師", "Miss Cang");
System.out.println(info);
//替換第一個找到的趙老師
System.out.println(token.replaceFirst("趙老師", "Miss Cang"));
//替換全部,支援模式匹配(正則表示式)
System.out.println(token.replaceAll("趙老師", "Miss Cang"));
//分割
String[] tokens = "Linux@Java@Spring".split("@");
for(String token : tokens)
System.out.println(token);
依照模式匹配、替換和分割
String str = "java in action"; System.out.println(str.matches("java.*")); System.out.println("========================"); String reg = "^1[358]\\d{9}$"; System.out.println("110".matches(reg)); System.out.println("1300".matches(reg)); System.out.println("17300001111".matches(reg)); System.out.println("15300001121".matches(reg));
詳情請參考正則表示式
字串與陣列之間的轉換
字串不是陣列,但是字串可以轉換成陣列,反之亦然。
//字串和字元陣列進行轉換 char[] letters = token.toCharArray(); System.out.println(letters.length); new String(letters); // System.out.println(new String(letters,0,3));
將字元和數值轉換成字串
回顧下,可以使用Double.parseDouble(str)或者Integer.parseInt(str)將一個字串轉為一個double或者int值,也可以使用字串的連線操作符將字元或者數值轉換為字串。另外一種將數字轉為字串的方法是使用過載的靜態valueOf方法。
格式化字串
String.format(format,item1,item2,...,itemn)
StringBuffer和StringBuilder
StringBuffer和StringBuilder類似於String類,區別在於String類是不可改變的。一般來說,只要使用字串的 地方,都可以使用StringBuffer/StringBuilder類.StringBuffer和StringBuilder比String更加靈活。可以給一個StringBuffer和StringBuilder中新增、插入或追加新的內容,但是String物件一旦建立,它的值就固定了。
除了StringBuffer中修改緩衝區的方法是同步的(只有一個任務被允許執行),StringBuffer與StringBuilder類是很相似的。如果是多工併發訪問,就使用StringBuffer,可以防止StringBuffer崩潰。而如果是單任務訪問,使用StringBuilder會更有效。StringBuffer和StringBuilder中的構造方法和其它方法機會是完全一樣的
package edu.uestc.avatar; public class StringBuilderDemo { public static void main(String[] args) { //emp(empno,ename,job,mgr,sal,comm,hiredate,deptno) //select empno,ename,job,mgr,sal,comm,hiredate,deptno from emp if(args == null || args.length == 0) return; StringBuilder sb = new StringBuilder("select"); for(String token : args) { sb.append(' ').append(token).append(','); } //刪除最後一個對於的,字元 sb.deleteCharAt(sb.length() - 1); sb.append(" from emp"); //將StringBuilder轉成String String sql = sb.toString(); System.out.println(sql); } }
示例:判斷迴文字串時忽略既非字母又非數字的字元
package edu.uestc.avatar; import java.util.Scanner; /** * 判斷迴文字串時忽略既非字母又非數字的字元 * 1、過濾出原始字串中的字母,組成一個新的字串 * 2、將新的字串進行反轉 * 3、將反轉後的字串和過濾後字串進行比較,如果相等則為迴文串 */ public class Plalindrome { public static void main(String[] args) { System.out.println("請輸入一個字串:"); Scanner input = new Scanner(System.in); String token = input.nextLine(); input.close(); String ret = filter(token); //將ret進行反轉 String reverse = reverse(ret); String message = String.format("%s忽略掉既非字母又非數字的字元後是否為迴文字串:%b", token,ret.equals(reverse)); System.out.println(message); } /** * 字串反轉 */ private static String reverse(String ret) { StringBuilder sb = new StringBuilder(ret); return sb.reverse().toString(); } /** * 過濾出字母字元,組成一個新的字串 */ private static String filter(String token) { if(token == null)return ""; StringBuilder sb = new StringBuilder(""); for(int i = 0; i < token.length(); i++) { if(Character.isLetter(token.charAt(i))) sb.append(token.charAt(i)); } return sb.toString(); } }