1、String 類
一、建立對象
public static void main(String[] args){ String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); System.out.println(str1 == str2);//true System.out.println(str1 == str3);//false System.out.println(str3 == str4);//false /** * 一、使用String str1 = "hello";這種方式 * 第一次建立str1時,隱式的new一個字符串對象,在運行時常量池中開闢一個空間,來存放新建立的"hello"對象,str1中存放指向這個對象的引用 * 第二次建立str2時,JVM會先在在常量池中查找是否存在相同的常量,若已經存在跟"hello"同樣的對象,就直接引用了這個對象,若是沒有仍是會在運行時常量池中新new一個 * 二、使用String str3 = new String("hello");這種 * 無論堆裏面有沒有一樣的對象,都會在堆內存中新建一個對象,因此str3 和 str4 總會是false */ System.out.println(str1.equals(str3));//true System.out.println(str3.equals(str4));//true //String類中已經把equals方法重寫過了,比較的是具體的值 /** *String拼接 */ String s1 = "a"+"b"+"c"; String s2 = "abc"; String s3 = "ab"; String s4 = s3 + "c"; System.out.println(s1==s2);//true System.out.println(s2 == s4);//false //先在常量池中建立 abc ,地址指向 s1,也指s2, 再建立 ab ,指向 s3,再建立s4, //對於 s4,實際上是先建立StringBuilder(或 StringBuffer)對象,經過 append 鏈接獲得 abc ,再調用 toString() 轉換獲得的地址指向 s3。 //因此(s4==s2) 爲 false }
String重寫的equals方法
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = count; if (n == anotherString.count) { char v1[] = value; char v2[] = anotherString.value; int i = offset; int j = anotherString.offset; while (n-- != 0) { if (v1[i++] != v2[j++]) return false; } return true; } } return false; }
二、經常使用方法
str : "1abc1239" str.length() :8 str.indexOf("a") :1 str.indexOf('b') :2 str.indexOf(49) :0 str.substring(3) :c1239 str.substring(2, 5) :bc1 str.trim() :1abc1239 str.equals("abc123") :false str.equals("abc123") :false str.toLowerCase() :1abc1239 str.toUpperCase() :1ABC1239 str.charAt(2) :b str.split("c", 2) : 1ab 1239 str.split("c", 1) : 1abc1239 str.getBytes() : 49 97 98 99 49 50 51 57
##注意html
str.indexOf(49) :0
這裏的index(int)裏的int值注意一下
貼一個連接,詳細
三、String.format()方法
有兩個重載:java
String.format(String format, Object... args)
String.format(Locale locale, String format, Object... args)
重點提一下 format 參數的格式:
%[argument_index$][flags][width][.precision]conversion數組
一、%:必填
二、[argument_index$]:從1開始取值,表示的是拿後面的args中的第幾個參數來格式化,默認是按照參數順序輸出
System.out.println(String.format("你好,這是%s,那是%s!", "anna","beta"));//默認按順序 System.out.println(String.format("你好,這是%2$s,那是%1$s!", "anna","beta"));//按照自定義的順序
/**
* 你好,這是anna,那是beta! 你好,這是beta,那是anna!
*/
三、[flags]標識:控制輸出格式,好比左對齊,三個數用逗號隔開,少位補0等
- '-' 在最小寬度內左對齊,不能夠與"用0填充"同時使用
- '#' 只適用於8進制和16進制,8進制時在結果前面增長一個0,16進制時在結果前面增長0x
- '+' 結果老是包括一個符號(通常狀況下只適用於10進制,若對象爲BigInteger才能夠用於8進制和16進制)
- ' ' 正值前加空格,負值前加負號(通常狀況下只適用於10進制,若對象爲BigInteger才能夠用於8進制和16進制)
- '0' 結果將用零來填充
- ',' 只適用於10進制,每3位數字之間用","分隔
- '(' 若參數是負數,則結果中不添加負號而是用圓括號把數字括起來(同'+'具備一樣的限制)
System.out.println(String.format("%-3d", 123456789));//123456789 System.out.println(String.format("%011d", 123456789));//00123456789 System.out.println(String.format("%#o", 123456789));//0726746425 System.out.println(String.format("%#x", 123456789));//0x75bcd15 System.out.println(String.format("%+d", 123456789));//+123456789 System.out.println(String.format("%(d", -123456789));//(123456789) System.out.println(String.format("%,d", 123456789));//123,456,789
四、[width]最小寬度: 輸出最小寬度,例如5
五、[.precision] :只有傳入參數是浮點數時纔有用,傳入整數或者日期會拋異常(注意這裏前面有個 . )
System.out.println(String.format("%,10.4f", 12345.6789456));//12,345.6789 System.out.println(String.format("%.2f", 12345.6789456));//12345.68
六、conversion轉換格式 : 如上轉換符所示,s/f等
轉 換 符安全 |
說 明 多線程 |
示 例app |
%s性能 |
字符串類型ui |
"mingrisoft"this |
%cspa |
字符類型 |
'm' |
%b |
布爾類型 |
true |
%d |
整數類型(十進制) |
99 |
%x |
整數類型(十六進制) |
FF |
%o |
整數類型(八進制) |
77 |
%f |
浮點類型 |
99.99 |
%a |
十六進制浮點類型 |
FF.35AE |
%e |
指數類型 |
9.38e+5 |
%g |
通用浮點類型(f和e類型中較短的) |
|
%h |
散列碼 |
|
%% |
百分比類型 |
% |
%n |
換行符 |
|
%tx |
日期與時間類型(x表明不一樣的日期與時間轉換符
|
conversion差很少看看就行,應該用得多的也就 s/f 啥的
參考文檔:
https://blog.csdn.net/jiangyu1013/article/details/52607257
http://kgd1120.iteye.com/blog/1293633
http://www.runoob.com/java/java-string.html
2、StringBuilder和StringBuffer
一、定義
可變字符串
二、String、StringBuilder和StringBuffer 異同
String:字符串常量,不可變,底層用於存放字符的數組是final的,所以只能賦值一次,不能再更改;
StringBuilder:字符串變量,線程不安全,也所以性能高一點,因此單線程操做大量數據就用這個;
StringBuffer:字符串變量,線程安全,可將字符串緩衝區安全的用於多個線程,因此多線程操做大量數據用這個;
三、StringBuffer經常使用方法
兩個可變字符串差很少,最重要的是 toString() 方法,轉換成 String 類型;
StringBuffer sb = new StringBuffer(); sb.append("abc123"); System.out.println(sb.toString());//abc123 sb = sb.reverse(); System.out.println(sb.toString());//321cba