[趣學程序]java的常用類之String

  • 2019 年 10 月 3 日
  • 筆記

cmd2.gif

java基礎之常用類

String類

String表示字符串,所謂字符串,就是一連串的字符,是java中最常用的類之一。
String是不可變類,一旦String對象被創建,包含在對象中的字符序列(內容)是不可變的,直到對象被銷毀;
String對象保存在JVM的常量池中,String類是用final來修飾的,是不可以被繼承的類。

常量池

常量池: JVM中一塊獨立的區域存放字符串常量和基本類型常量(被public static final修飾的)。
String使用private final char value[]來實現字符串的存儲,也就是說String對象創建之後
,就不能再修改此對象中存儲的字符串內容,就是因為如此,才說String類型是不可變的.

String對象的創建方式

    String str = "HelloWorld";      String str2 = new String("upuptop");      String str3 = String.valueOf(1);      String str4 = 123+"";

String對象比較:

單獨使用""引號創建的字符串都是常量,編譯期就已經確定存儲到常量池中;
使用new String("")創建的對象會存儲到堆內存中,是運行期新創建的;
使用只包含常量的字符串連接符如"aa" + "bb"創建的也是常量,編譯期就能確定,已經確定存儲到常量池中;
使用包含變量的字符串連接符如"aa" + s1創建的對象是運行期才創建的,存儲在堆中;

  public class StringDemo {      public static void main(String[] args) {          /*           *  "" 其實表示的是  String的匿名對象           */          String s = "";          /**           * String()    初始化一個新創建的 String 對象,使其表示一個空字符序列。           *  "",不是表示 null           *  String(String original)           *  String s = new String("asd");// s 的值就是 asd           */          s = new String();//""          String s1  = new String("11");          String s2  = new String("11");          System.out.println(s1 == s2);//false          String s3 = "22";          String s4 = "22";          System.out.println(s3 == s4);//true          System.out.println(s3 == s2);//false          String  s5 = "2" + "2";//這句話其實在編譯器編譯後的class文件中 已經變成  "22"          //s5創建了幾個對象?//回答:最多一個,如果常量池裏面沒有就是創建一個,如果常量池裡本來就有就是創建零個!下面的str一樣的道理。          String str = "A" +"B"+ "C" +"D" +"E";//String str = "ABCDE";          System.out.println(s3 == s5);//true          /**           * String特點:    不可變的,  一個String對象的內容不能變,一旦內容變量該對象就變成一個新的String對象了           *  String  str = "AAA";           *  str = str+"12";           */          String str1 = "ABCDE";          System.out.println(str == str1);//true          String str2 = "ABC" + "DE";          System.out.println(str == str2);//true          String  ss = "AB";          String str3 = ss + "CDE";//這裡的str3在運行期才能確定內容值          System.out.println(str3 == str2);//false          String str4 = getStr() +"CDE";//在運行期才能確定 str4的值          System.out.println(str == str4);//false          System.out.println(str3 == str4);//false          /*           *  String s = "cd";    //一個String對象              s = s + "itcast";   //itcast也是String對象, 最後的s的值cditcast,也是一個String對象              System.out.print(s);           * */      }      public static String getStr(){          return "AB";      }  }

String常用方法

方法名 意義
String() 初始化一個新的 String 對象,使其表示一個空字符序列,並不是返回空(不等於 null)。
String(StringBuffer buffer) 根據StringBuffer對象來創建String對象;
String(StringBuilder builder) 同上
char charAt(int index) 取字符串中指定位置的字符,index從0開始計算。
String concat(String str) 連接字符串,等同於 「+」;
boolean contentEquals(StringBuffer buffer) 若二者包含的字符序列相同時就返回true;
boolean equals(Object obj) 將該字符串與指定對象比較,若二者包含的字符序列相等返回true;
boolean equalsIgnoreCase(String anotherString) 將此 String 與另一個 String 比較,不考慮大小寫;
byte[] getBytes() 將該字符串轉換成byte數組;
int indexOf(String str) 找出str字符串在該字符串中第一次出現的位置;
int indexOf(String str, int fromIndex) 返回指定子字符串在此字符串中第一次出現處的索引,從指定的索引開始;
int lastIndexOf(String str) 返回指定子字符串在此字符串中最後一次出現處的索引;
int length() 返回當前字符串長度;
String replace(char oldChar, char newChar) 返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 得到的。
String replaceAll(String regex, String replacement) 使用給定的 字符串replacement 替換此字符串所有的regex字符串;
boolean startsWith(String prefix) 測試此字符串是否以指定的前綴開始.
String[] split(String regex) 把字符串按指定的字符串分隔開。
String substring(int beginIndex) 返回一個新的字符串,從beginIndex開始截取,它是此字符串的一個子字符串;
String substring(int beginIndex, int endIndex) 返回一個新字符串,它是此字符串的一個子字符串;[begin,end)
char[] toCharArray() 將此字符串轉換為一個新的字符數組。
String toLowerCase() 將此 String 中的所有字符都轉換為小寫;
String toUpperCase() 轉成大寫;
static String valueOf(基本類型 obj) 把基本類型值轉成字符串;
String trim() 忽略字符串前導空白和尾部空白。

String小練習

  1. 判斷字符串是否由純數字組成:
  package reviewDemo;    public class Demo20 {      public static void main(String[] args) {          String s1 = "123456789";          String s2 = "12345  6789";          System.out.print(isnum(s1));          System.out.print(isnum(s2));      }        public static boolean isnum(String s){          //將字符串參數轉為字符數組          char []ch = s.toCharArray();          //循環字符數組,判斷每一個元素是否在數字對應的字符區間內          for (char c : ch) {              //判斷字符是否在[0-9]這個區間內部              if(!(c > '0' && c <= '9')){                  return false;              }          }          return true;      }  }    輸出:    true  false  
  1. 判斷字符串是否為空:
分析:  字符串的空有兩種情況:1、null;2、"";    package reviewDemo;    public class Demo21 {      public static void main(String[] args) {            String s1 = "";          System.out.println(isimpty(s1));        }        public static String isimpty(String s){            if(s != null && !"".equals(s)){              return "不為空";          }          return "為空!";      }  }  

StringBuffer 與 StringBuilder

String是不可變類,一旦String對象被創建,包含在對象中的字符序列是不可變的,直到對象被銷毀;
StringBuffer 與 StringBuilder對象則是可變的!

由於String創建的對象是一個不變化的對象,為了方便在我們使用過程中修改字符串的內容,java為我們提供了StringBUffer和StringBuilder兩個類
StringBuffer是線程安全的類,StringBuilder是線程不安全的類。在多線程環境下使用StringBuffer。

  在平時的編程中,我們為了方便,總是使用字符串之間相互加減進行操作修改字符串的內容。  比如:      String a  = "h";      String b = "e";      String c = "c";      String result = a + b +c +"result" ;    如上方式是不高效的,推薦修改為StringBuilder或StringBuffer。下列程序驗證了程序的高效性。      package reviewDemo;    public class Demo22 {      public static void main(String[] args) {            String s = "";          long begintime = System.currentTimeMillis();          for(int i = 1;i <= 100000;i++){              s += i;          }              long endtime = System.currentTimeMillis();          long time = endtime - begintime;          System.out.println("運行時間為:"+time);            StringBuffer s1 = new StringBuffer();          s = "";          begintime = System.currentTimeMillis();          for(int i = 1;i <= 100000;i++){              s = ""+i;              s1 = new StringBuffer(s);          }            endtime = System.currentTimeMillis();          time = endtime - begintime;          System.out.println("運行時間為:"+time);        }  }    輸出:  運行時間為:82922  運行時間為:15  可以看得出:StringBuffer這兩個效率相當高!  

StringBuffer 與 StringBuilder

  • StringBuffer: 是線程安全的;
  • StringBuilder: 是線程不安全的,性能高點,推薦使StringBuilder;(jdk1.5出現)
  • StringBuffer的字符序列是可變的(通過append等方法操作)
  • StringBuffer 和 String之間的轉換;
  • String toString() 返回此序列中數據的字符串表示形式。
  • StringBuffer(String str):以指定的字符串創建StringBuffer對象。

StringBuffer方法

方法名 意義
public StringBuilder() 構造一個不帶任何字符的StringBuilder對象。
StringBuffer(String str) 構造一個字符串緩衝區,並將其內容初始化為指定的字符串內容。
StringBuffer append(Object o) 將指定的任意類型對象追加到此StringBuffer 對象。
StringBuffer insert(int offset, Object o) 將任意類型參數的字符串表示形式插入此序列中。
StringBuffer delete(int start, int end) 移除此序列的子字符串中的字符。
StringBuffer deleteCharAt(int index) 移除此序列指定位置的 char。

練習

  1. 需求:用StringBuilder 或StringBuffer: 把字符串「ABCDE」; 轉變成字符串「A,B,C,D」
    public class Demo23 {      public static void main(String[] args) {          //第一種方法:往裏面插入;          StringBuilder sb = new StringBuilder("ABCDE");          sb.deleteCharAt(sb.length()-1);          System.out.println(sb);          for (int i = 0; i < sb.length(); i+=2) {              sb.insert(i, ",");          }          sb.deleteCharAt(0);            System.out.println(sb);              //第二種方法:往裏面追加,要追加必須遍歷,必須換為數組!          sb = new StringBuilder("ABCDE");          sb.deleteCharAt(sb.length()-1);          System.out.println(sb);          char []cs = sb.toString().toCharArray();          StringBuilder sb1 = new StringBuilder();          for (char c : cs) {              sb1.append(c).append(",");          }          sb1.deleteCharAt(sb1.length()-1);          System.out.println(sb1);      }  }  
  1. 編寫一個程序,這個程序把一個整數數組中的每個元素用逗號連接成一個字符串,例如,根據內容為{1,2,3}的數組形成內容為"1,2,3"的字符串。
  package reviewDemo;  /**   * 編寫一個程序,   * 這個程序把一個整數數組中的每個元素用逗號連接成一個字符串,   * 例如,根據內容為{1,2,3}的數組形成內容為"1,2,3"的字符串。   */    public class Demo24 {      public static void main(String[] args) {          int []i = {1,2,3,4,5};          StringBuilder sb = new StringBuilder();          for (int j : i) {              sb.append(j).append(",");          }          sb.deleteCharAt(sb.length()-1);          System.out.println(sb);      }  }  

注意:

字符串是任何程序語言的最常用、處理操作最多的。即使在大數據領域也是以處理文本數據為主。

推薦朋友關注【趣學程序】公眾號,公眾號內所有資源免費獲取。