一、常見的構造 String 的方式
//方式一
String str = "Hello Bit";
//方式二
String str2 = new String("Hello Bit");
//方式三
char[] array = {'a', 'b', 'c'}; String str3 = new String(array)
二、字符串比較
① 比較地址
例1:
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
//執行結果 true
例2:
String str1 = new String("Hello");
String str2 = new String("Hello");
System.out.println(str1 == str2);
// 執行結果 false
② 比較字符串內容
必須採用String類提供的equals方法
String str1 = new String("Hello");
String str2 = new String("Hello"); System.out.println(str1.equals(str2)); //System.out.println(str2.equals(str1));
// 或者這樣寫也行
// 執行結果 true
③比較大小
String str1 = "Hello";
String str2 = "joosd";
System.out.println(str1.compareTo(str2));
注意
常量在編譯時就已經編譯好了
-
String str4=“abc”+“def”+360;
編譯時一個對象:編譯時就已經是abcdef360
“abc”+“def”:字符常量
360:常量 -
int a =360;
String str4=“abc”+“def”+a;
編譯時2個對象:”abcdef”拼接好產生一個對象;此時a是一個變量,拼接時需要在產生一個對象;
面試題:請解釋String類中兩種對象實例化的區別
1.直接賦值:只會開闢一 塊堆內存空間,並且該字符串對象可以自動保存在對象池中以供下次使用。
2.構造方法:會開闢兩塊堆內存空間,其中-塊成爲垃圾空間,不會自動保存在對象池中,可以使用intern0方法手工入池。
String str="abcdef";//放在常量池
String str2=new String("abcdef").intern();
(1)常量池當中存在 返回常量池當中字符串對象的地址;
char[] array = {'a','b','c','d','e','f'};
String str3=new String(array).intern();
(2) 如果常量池中不存在,那麼在常量池中生成該對象的引用
String str="abcdef";
System.out.println(str==str3);//true
字符串是一種不可變對象. 它的內容不可改變
需要修改字符串:
方法1:
【str.substring(1):提取一個子串:從1號下標開始 ello】
方法2:反射
指的是程序運行過程中, 獲取/修改某個對象的詳細信息(類型信息, 屬性信息等), 相當於讓一個對象更好的 “認清自己” .
三、字符, 字節與字符串
1、字符與字符串
字符串內部包含一個字符數組,String 可以和 char[] 相互轉換.
(1) 獲取指定位置的字符
String str = "hello" ; System.out.println(str.charAt(0));
// 下標從 0 開始
// 執行結果 h
(2)字符串與字符數組的轉換
a.數組轉化爲字符串
b.字符串轉化爲數組
方法一:
方法二:
2、字節與字符串
例:實現字符串與字節數組的轉換處理
String str = "helloworld" ;
// String 轉 byte[]
byte[] data = str.getBytes() ;
for (int i = 0; i < data.length; i++) { System.out.print(data[i]+" "); }
// byte[] 轉 String
System.out.println(new String(data));
【注意】
1.byte[] 是把 String 按照一個字節一個字節的方式處理, 這種適合在網絡傳輸, 數據存儲這樣的場景下使用. 更適合 針對二進制數據來操作.
2.char[] 是吧 String 按照一個字符一個字符的方式處理, 更適合針對文本數據來操作, 尤其是包含中文的時候.
四、字符串常見操作
1.字符串比較
代碼示例: 不區分大小寫比較
String str1 = "hello" ; String str2 = "Hello" ; System.out.println(str1.equals(str2)); // false
System.out.println(str1.equalsIgnoreCase(str2)); // true
在String類中compareTo()方法是一個非常重要的方法,一個可以區分大小關係的方法,該方法返回一個整型,該數據會根據大小關係返回三類內 容:
2 .字符串查找
例1:contains()
String str = "helloworld" ;
System.out.println(str.contains("world")); // true
例2:使用indexOf()方法進行位置查找
String str = "helloworld" ;
System.out.println(str.indexOf("world")); // 5,w開始的索引
System.out.println(str.indexOf("bit")); // -1,沒有查到 if
(str.indexOf("hello") != -1) {
System.out.println("可以查到指定字符串!");
}
①.indexOf效率略高於contains(contains底層調用indexOf)
②.使用indexOf()需要注意的是,如果內容重複,它只能返回查找的第一個位置
例: 使用indexOf()的注意點
String str = "helloworld" ;
System.out.println(str.indexOf("l")); // 2
System.out.println(str.indexOf("l",5)); // 8
System.out.println(str.lastIndexOf("l")); // 8 從後往前找(默認從最後一個元素開始
在進行查找的時候往往會判斷開頭或結尾:
String str = "**@@helloworld!!" ;
System.out.println(str.startsWith("**")); // true 判斷是否從指定字符串開頭
System.out.println(str.startsWith("@@",2)); // ture
System.out.println(str.endsWith("!!")); // true
3.字符串替換
例:字符串的替換
String str = "helloworld" ;
System.out.println(str.replaceAll("l", "_"));
System.out.println(str.replaceFirst("l", "_"));
注意: 由於字符串是不可變對象, 替換不修改當前字符串, 而是產生一個新的字符串.
4.字符串拆分
例:實現字符串的拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ") ; // 按照空格拆分
for(String s: result) { //輸出數組
System.out.println(s);
}
String str = "ab-cd-ef";//數組接收
String[] strings = str.split("-");//用-分組
System.out.println(Arrays.toString(strings));//輸出數組
例:部分拆分
String str = "hello world hello bit" ;
String[] result = str.split(" ",2) ;
for(String s: result) {
System.out.println(s);
}
String str = "ab-cd-ef";
String[] strings=str.split("-",2);
//最多分成兩組 優先分組ab 後面爲一組
例:拆分IP地址
字符" | " , " * " , “+” 都得加上轉義字符,前面加上"" , 而如果是"",那麼就得寫成"\ \"
String str = "192.168.1.1" ;
String[] result = str.split("\\.") ;
//第一個\表示將後面的一個\轉化爲真正的\ 而\.才能變爲.
for(String s: result) {
System.out.println(s);
}
例:多次拆分
String str = "name=zhangsan&age=18" ;
String[] result = str.split("&") ;
for (int i = 0; i < result.length; i++)
{
String[] temp = result[i].split("=") ;
System.out.println(temp[0]+" = "+temp[1]);
}
5.字符串截取
例:
String str = "helloworld" ;
System.out.println(str.substring(5));
System.out.println(str.substring(0, 5));
注意:
- 索引從0開始
- 注意前閉後開區間的寫法, substring(0, 5) 表示包含 0 號下標的字符, 不包含 5 號下標
6.其他操作方法
String str = " abc def ";
str = str.trim();
System.out.println(str);//刪除空格
String str1 = " abc def ";
str1 = str1.toLowerCase();
System.out.println(str1);//變成大寫
String str2 = " abc def ";
str2 = str2.concat("hello");
System.out.println(str2);//拼接
}
public static void main(String[] args) {
String str="";//空串
String str1=null;//空指針引用
if(str1.isEmpty()){
System.out.println("abcd");
}
if(str.isEmpty()) {
System.out.println("abcd");//空指針異常
}
}
7. StringBuffer 和 StringBuilder
String和StringBuffer大的區別在於:
String的內容無法修改,而StringBuffer的內容可以修改。頻繁修改字符串的 情況考慮使用StingBuffer。
注意:
String和StringBuffer類不能直接轉換。如果要想互相轉換,可以採用如下原則:
String變爲StringBuffer: 利用StringBuffer的構造方法append()方法
StringBuffer a = new StringBuffer("abcdef");
a.append("JAVA");//拼接
System.out.println(a);
在String中使用"+"來進行字符串連接,但是這個操作在StringBuffer類中需要更改爲append()方法
StringBuffer變爲String: 調用toString()方法。
StringBuilder b = new StringBuilder();
b.append("abcde");
b.append("gh");
String s=b.toString();
//把StringBuilder類型轉化爲String
System.out.println(s);
請解釋String、StringBuffer、StringBuilder的區別:
1.String的內容不可修改,StringBuffer與StringBuilder的內容可以修改.
2.StringBuffer與StringBuilder大部分功能是相似的 StringBuffer採用同步處理,屬於線程安全操作;而StringBuilder採用異步處理,屬於線程不安全操作.