【JavaSE】之String類
.java.long.String類
1.String類的兩種例項化方式
a.直接賦值(直接賦值,在堆上分配空間)
String str1 = "Hello World";
System.out.println(str1);
b.傳統方法(通過構造方法例項化String物件)
String str2 = new String("Hello World");
System.out.println(str2);
2.字串相等比較
如果是兩個int型,判斷其相等完全可以用==來判斷
public boolean equals(String anotherString):成員方法(通過物件呼叫)
str1.equals(anotherString)
==比較的是兩字串的地址 equals比較的是兩字串的內容
String str1 = "Hello World";
String str2 = new String("Hello World");
System.out.println(str1 == str2);
String str1 = "Hello World";
String str2 = new String("Hello World");
System.out.println(str1.equals(str2));
3.字串常量(“ ”)是String的匿名物件
System.out.println(“hello”.equals(str2));(推薦)
String str1 = null;
System.out.println("Hello World".equals(str1));
System.out.println(str2.equals(“hello”)); 如果str為空,則會出現空指標異常
String str1 = null;
System.out.println(str1.equals("Hello World"));
小 tips:如果要判斷使用者輸入的字串是否等同與特定字串,一定要將特定字串(String常量)寫在前面,避免NULLPointerException。
4.String類的設計採用了共享設計模式
JVM底層會自動維護一個字串的物件池(物件陣列),如果現在採用直接賦值的形式進行String的物件例項化,該物件會自動儲存在這個物件池中。如果下次繼續使用直接賦值的模式宣告String物件,此時物件池中若有指定內容,則直接引用;如果沒有,則開闢新的對空間後將其儲存在物件池中供下次使用。
手工入池(本地方法): public native String intern(); 成員方法
a.採用直接賦值法
String str1 = "hello";
String str2 = "hello";
String str3 = "hello";
System.out.println(str1 == str2);
System.out.println(str2 == str3);
System.out.println(str1 == str3);
b.採用構造方法
String str1 = new String("hello");
String str = "hello";
String str1 = new String("hello").intern();
System.out.println(str == str1);
5.字串常量不可變更
字串一旦定義後不可改變;字串的加操作一定少產生,最多不超過3次
String str = "hello";
str += "world";
str += "!!!";
System.out.println(str);
可以發現字串上沒有發生任何變化,但是字串物件的引用一直在改變,而且會形成大量的垃圾空間,所以以下程式碼不應該出現:
String str = "hello";
for(int i=0; i<1000; i++){
str += x;
}
System.out.println(str);
原則:
a.字串使用就採用直接賦值
b.字串比較就使用equals()實現
c.字串別改變太多
6.字元與字串的相互轉換(非常重要)
a.將字元陣列轉為字串
public String (char[ ] value)-> new String (char[ ])
char[] data = new char[]{'h','e','l','l','o'};
String str = new String(data);
System.out.println(str);
public String(char[ ] value, int offest【開始位置】, int count【數量】)
char[] data = new char[]{'h','e','l','l','o'};
String str = new String(data,0,2);
System.out.println(str);
b.將字串轉為單個字元
public char charAt (int index【下標】) 【如果索引超出範圍會越界異常】
String str = "hello";
char c = str.charAt(0);
System.out.println(c);
c.將字串轉為字元陣列 String->char[ ]
public char[ ] tocharArray();
public class test{
public static void main(String[] args){
String str = "helloworld";
char[] data = str.toCharArray();
for(int i=0; i<data.length; i++){
System.out.print(data[i]+" ");
}
}
}
取得字串的長度:public int length(); 字串是方法,陣列是屬性。
例:判斷一個字串是否由數字組成
public class test{
public static void main(String[] args){
System.out.println(isNumber("123a"));
}
public static boolean isNumber(String str){
//1.String->data[]
char[] data = str.toCharArray();
//2.判斷是否為數字
for(int i=0; i<data.length; i++){
if(data[i]<'0' || data[i]>'9'){
return false;
}
}
return true;
}
}
7.位元組(byte)與字串的轉換
a.將位元組陣列轉為字串(重要) byte[ ] -> String
public String (byte[ ] value);
public String (byte[ ] value, int offest, int count)
byte[] data = new byte[]{1,3,5,7,9};
String str = new String(data);
System.out.println(str);
b.將字串轉為字元陣列(陣列) String->byte[ ]
public byte[ ] getBytes();
String str = new String("hello");
byte[] data = str.getBytes();
for(byte b:data){
System.out.print(b+" ");
}
c.將字串按照指定編碼轉為位元組陣列
public byte[ ] getBytes(String charsetName);
String str = new String("我想睡覺");
byte[] data = str.getBytes("GBK");
for(byte b:data){
System.out.print(b+" ");
}
8.字串比較
a.不區分大小寫相等比較
public boolean equalsIgnoreCase(String anotherString);
System.out.println("hello".equalsIgnoreCase("Hello"));
b.比較兩個字串大小
public int compareTo(String anotherString);
返回大於0,表示大於比較物件;
返回等於0,表示等於比較物件;
返回小於0,表示小於比較物件;
System.out.println("hello".compareTo("Hello"));
9.字串查詢
a.判斷str在本字串中是否存在
public boolean contains (String str);
String str = "hello";
System.out.println(str.contains("he"));
b.判斷是否以指定字串開頭
public boolean startsWith(String str);
String str = "hello";
System.out.println(str.contains("el"));
從指定位置開始判斷是否以指定字串開頭 public boolean startsWith(String str,int index);
String str = "hello";
System.out.println(str.startsWith("el",1));
c.判斷是否以指定的字串結尾
public boolean endsWith(String str);
String str = "hello";
System.out.println(str.endsWith("lo"));
10.字串替換
public String replaceAll(String regex,String replacement):替換所有內容
String str = "hello";
System.out.println(str.replaceAll("l","_"));
public String replaceFirst(String regex,String replacement):替換首個內容
String str = "hello";
System.out.println(str.replaceFirst("l","_"));
11.字串拆分
public String【】 split(String regex):將字串按照指定格式全部拆分
String str = "I am a student";
String[] result = str.split(" ");
for(String str1:result){
System.out.println(str1);
}
public String【】 split(String regex,int limit):將字串部分拆分,陣列長度為limit
注意:如果給定長度小於字串的長度,先按照給定長度進行分配,最後剩餘全為最後一個字串
如果出現特殊字元,一定要用轉義字元將其轉為普通字元。
String str = "I am a student";
String[] result = str.split(" ",2);
for(String str1:result){
System.out.println(str1);
}
String str = "192.168.11.2";
String[] result = str.split("\\.");
for(String str1 : result){
System.out.println(str1);
}
12.字串擷取
public String substring(int beginIndex)【; 從指定位置擷取到字串結尾
String str = "hello";
System.out.println(str.substring(2));
public String substring (int beginIndex, int endIndex)【);擷取部分內容
String str = "hello";
System.out.println(str.substring(0,2));
13.String類的其他方法
a.去掉左右空格,中間的保留
public String trim();
String str = " hello ";
System.out.println(str.trim());
b.轉大小寫
public String toLowerCase(); 轉小寫
public String toUpperCase(); 轉大寫
String str = "helloWORD";
System.out.println(str.toLowerCase());
System.out.println(str.toUpperCase());
c.判斷字串是否為空(只能判斷是否為空字串,而不是null)
public boolean isEmpty();
String str = "";
System.out.println(str.isEmpty());
完整的判斷字串為空: if(str == null || str.isEmpty())
例:將一個字串首字母大寫
public class test{
public static void main(String[] args) throws Exception{
System.out.println(firstCase("helloworld"));
}
public static String firstCase(String str){
return str.substring(0,1).toUpperCase()+str.substring(1);
}
}
14.兩隻sb(面試)-方便進行字串的修改-java.long
StringBuffer與StringBuilder使用沒有區別
String和兩隻sb的區別:
I.String的內容不可修改,而兩隻sb可以改內容(append)
II.StringBuffer採用同步處理,執行緒安全,效率較低
StringBuilder採用非同步處理,執行緒不安全,效率較高,String的“+”操作底層會將String->Stringbuilder
a.字串修改
public StringBuffer append(各種資料型別)
StringBuffer sb = new StringBuffer();
sb.append("hello").append("world");
System.out.println(sb);
b.StringBuffer與String的相互轉化
I.String->StringBuffer 呼叫StringBuffer的構造方法或append()
StringBuffer sb = new StringBuffer("hello");
II.StringBuffer->String StringBuffer.toString();
StringBuffer sb = new StringBuffer("hello");
String result = sb.toString();
System.out.println(result.isEmpty());
c.字串反轉
public StringBuffer reverse();
StringBuffer sb = new StringBuffer("hello");
sb.reverse();
System.out.println(sb);
d.刪除指定範圍的資料
public StringBuffer delete(int start,int end);
StringBuffer sb = new StringBuffer("hello world");
System.out.println(sb.delete(0, 6));
e.插入資料
public StringBuffer insert(int offset,各種資料型別)
StringBuffer sb = new StringBuffer("hello");
System.out.println(sb.insert(5, "真好"));