String類倆種實例化方式
字符串相等比較*
string類匿名對象---字符串常量
String類不可變更操作*
對象池*
String類提供的方法
作爲javase的一個類,String也存在構造方法,對於String對象的實例化可以通過直接賦值、構造方法初始化倆種方式。
1.比較字符串:equals()方法。
比較大小通常有倆種方式:
1)==
2)equals()
在比較String對象的時候,我們會發現這倆種方式存在着很大的區別:
1)==:數值的比較,比較的是對象的內存地址數值。
2)equals():進行字符串內容的比較。
2.字符串常量---String類的匿名對象。
java中本身沒有字符串常量的概念,基本上都是string類匿名對象。
在這裏補充一點點小知識:
如果在以後開發中,string匿名對象需要和一個用戶輸入的字符串比較,
那麼匿名對象要寫在字符串前面:"字符串常量".equals(str),
這是爲了避免用戶輸入的str=null出現NullPointerException
3.String類倆種實例化的區別
1)直接賦值
連續多次採用直接賦值的方式進行String對象實例化,並且賦同一個值
用“==”對這些對象進行比較,會發現結果都爲true
之前說過“==”比較的是對象所在內存的地址
因此"這些對象都指向同一塊棧內存"
在實例化第一個對象後,"再沒有開闢新的內存",why?
(“String類的設計採用共享設計模式”)
在這裏引入一個"對象池","JVM底層會自動維護一個對象池(字符串對象池)",
當採用直接賦值的方式進行string對象的實例化時,那麼該實例化對象(內容)會"自動保存"在這個對象池中,
當"下次再"次採用直接賦值方式進行實例化時,
此時對象池中如"有指定內容,則直接引用";
否則,開闢新的字符串對象將其保存在對象池中‘供下次使用“。
對象池:--一個對象數組(爲了減少開銷)
2)構造方法
對 String str = new String("hello");進行分析
①此方式會開闢倆塊堆內存空間:
一塊爲垃圾空間:存着"hello"
另一塊是new的空間,也存"hello",由堆指向
②對共享存在影響,new的String對象不會自動入池,
但是採用public native String intern()會進行手工入池
String str = new String("hello").intern;
3)"區別"
直接賦值:只會開闢一塊棧內存空間,並且可以數據共享(字符串對象自動存入對象池供下次使用)
構造方法:會開闢倆塊棧內存空間,其中一塊是垃圾空間,
不會自動保存在對象池中,但是可以採用intern()手工入池;
5.字符串常量不可變更
對字符串進行"+"操作時,"棧的指向在變;而內容沒變",只是存放"內容的空間成爲了垃圾空間"而已。
當進行大量字符串改變的操作時,就會產生大量的垃圾空間
使用String原則:
1.採用直接賦值進行賦值
2.採用equals()進行比較
3.不要過多對string對象進行改變操作
6.String中提供的灰常good的方法。
1)字符與字符串相互轉換***
1.String->char[]
public char[] toCharArray(String str)
2.char[]->String
public String(char[] value)
public String(char[] value,int offset,int length);
3.String->char
public char toChar(int index);
4.取得字符串長度
public int length();
2)字節與字符串
1.byte[]->String
public String(byte[] values);
2.String->byte[]
public byte[] getBytes(String str);
3.String->byte 按照指定編碼
public byte[] getbytes(String chareseName);
3)字符串比較
區分大小寫:
public boolean equals(Object obj);
public int compareTo(String anothorString);
返回值:== 0 倆個字符串相等
>0 大於比較anothor對象
<0 小於比較another對象
不區分大小寫:
public boolean equalsIanoreCase(String str);
4)字符串查找*******
public boolean contains(String str);
public boolean startsWith(String str);
public boolean startsWith(Stirng str,int dex);//指定位置開始
public boolean endsWith(String str);
5)字符串替換----與正則表達式有關
public String replaceAll(String regex,String repalxement);
//替換所有的regex爲replacement
public String replaceFirst(String regex,String replacement);
//替換遇到的第一個regex爲replacement
6)字符串拆分
public String[] split(String regex);
public String[] aplit(String regex ,int limit);
//數組長度是limit
7)字符串截取
public String substring(int beginIndex); //從指定位置到結尾
public String substring(int beginIndex,int endIndex);
//截取指定內容
8)其他方法
public String trim();去掉左右空格,保留中間空格
public String toUpperCase();轉大寫
public String toLowerCase();轉小寫
public boolean isEmpty();
判斷字符串是否爲空字符串(長度爲0),不能判空
str != null ||str.isEmpty