String類


  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();
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM