先來看看String 類,該類實際是一個char類型的數組,String 的所有方法,都是在操作這個數組,看下面代碼段:
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence
{
private final char value[];
private final int offset;
private final int count;
private int hash;
private static final long serialVersionUID = -6849794470754667710L;
明白了這個,就算我們不看全部代碼,都可以想象出String的所有操作都是圍繞char數組做文章,更要命的是char數組被設置爲fianal爲不可改變的(注意:設置爲final後,數組的內容還是可變的,但不能指向其他數組),。
所以,每次對字符串多次賦值的時候,String類都會產生一個新對象,原來的對象就丟在等垃圾回收了,所以String是比較花費性能的。
而StringBuffer與StringBuilder就不一樣了,它們有一個父類AbstractStringBuilder,其中定義的數組爲可變數組,還可以預先分配內存,如下代碼:
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char value[];
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
StringBuffer類與StringBuffer類以及其父類之後明天再詳細分析,我們先來看看String常用的有哪些方法,先保證會用,再研究原理以及區別:
String:
length()返回char[]數組長度
isEmpty()數組長度是否等於0
charAt(int index)char[]數組的第index個字符(0爲下標)
getChars()獲取String 的char[]數組
equals()如果非同一對象,則對兩個字符串數組逐一比較,如果有不同就返回FALSE
getBytes()將char數組轉爲Byte數組
contentEquals(CharSequence cs)內容是否相同
equalsIgnoreCase(String anotherString):忽略大小寫,判斷兩個字符串是否相同
compareTo(String anotherString) :判斷兩字字符串從第X個字符就不同
regionMatches(int toffset, String other, int ooffset,int len)比較兩個字符串是否相同,從第X位開始比較,比較LEN位
startsWith(String prefix, int toffset):開始toffset位是否與prefix相同,內部實際在比較數組的第toffset位
startsWith(String prefix)比較prefix字符串是否與源字符串相同,即從第一個字符開始比較,等價於startsWith(prefix, 0)
endsWith(String suffix):比較後面字符串是否相同
indexOf(int ch):判斷在CHAR數組的第X位
lastIndexOf()最後一個字符串匹配的位置
substring(int beginIndex, int endIndex)截取字符串
public CharSequence subSequence(int beginIndex, int endIndex) :同樣是截取字符串
concat()連接兩個字符串,實際在內部合併兩個字符串數組
replace(char oldChar, char newChar):替換字符
matches()是否符合正則表達式
contains()是否包含該字符串
public String[] split(String regex):根據某個字符分割爲多個字符串
toLowerCase():轉爲小寫字母
toUpperCase():轉爲大寫字母
trim()去掉空格
toCharArray()複製一遍字符串裏的數組
format():調用Formater類進行格式化
public native String intern();//虛擬機內部方法,String類維護一個初始爲空的字符串的對象池,當intern方法被調用時,如果對象池中已經包含這一個相等的字符串對象則返回對象池中的實例,否則添加字符串到對象池並返回該字符串的引用,該方法主要用於提高性能,特別是大量字符串的情況。即調用常量池
這個常量池要注意一下,知道常量池後,對一下代碼就不會迷惑了。
String a ="123";
String b ="123"
System.out.println(a==b);//結果爲true,即指向同一個對象。