對String來講,」==「是用來判斷兩個字符串(對象)的地址是否相同,即判斷是不是同一個字符串的應用。」equals()「則是判斷兩個字符串(對象)的值是否相等,若是相等則返回true。通常狀況下,都是使用」equals()「來判斷兩個字符串的值是否相等,只有當你須要判斷兩個字符串是不是同一個對象時,才使用」==「。java
String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); System.out.println(str1 == str2); //true System.out.println(str1 == str3); //false System.out.println(str1.equals(str3)); //true
須要瞭解更多關於java內存管理分配的,能夠點擊 這裏。正則表達式
首先了解一下如何將String轉換爲基本的數據類型。8個wrapper class(Integer,Double….)提供了相對應的方法parseXxx(String str)將字符串轉換爲基本的數據類型,以下:數組
String str1 = "123"; String str2 = "12.3"; String str3 = "true"; int a = Integer.parseInt(str1); //123 double d = Double.parseDouble(str2); //12.3 boolean flag = Boolean.parseBoolean(str3); //true
也許會見過使用valueOf()的轉換,以下:安全
String str1 = "123"; String str2 = "12.3"; String str3 = "true"; int a = Integer.valueOf(str1); //123 double d = Double.valueOf(str2); //12.3 boolean flag = Boolean.valueOf(str3); //true
這種形式也行,只不過沒有直接使用parseXxx()好,由於Integer.valueOf()返回的是Integer類型,再經過自動集裝箱轉換爲基本數據類型,其方法原型以下:app
public static Integer valueOf(String s)
注意的是,方法Boolean.parseBoolean(String str),只有在str爲字符串「true」時(忽略大小寫),纔會返回true。換句話說就是其餘字符串都是返回false。Boolean.parseBoolean(「yes」)將返回false。接着下來看一下如何將基本數據類型轉換爲String,可使用String.valueOf()方法進行轉換,以下:ide
int a = 123; double b = 13.05; boolean flag = true; String str1 = String.valueOf(a); //123 String str2 = String.valueOf(b); //13.05 String str3 = String.valueOf(flag); //true
同時還有着更爲簡單快捷的方式,直接在基本數據類型以後添加「 」,以下;ui
String str1 = a +""; //a String str2 = flag + ""; //true
最後談一下wrapper class的轉換,一樣能夠將基本數據類型轉換爲String,以下:spa
int a = 123; boolean flag = true; String str1 = Integer.toString(a); //123 String str2 = Boolean.toString(flag); //true
事實上,String.valueOf()方法也是調用了各類wrapper class的toString()方法,以下。只不過String.valueOf()用起來會方便一點,由於不須要去判斷數據屬於哪種類型。.net
public static String valueOf(double d) { return Double.toString(d);//其他的轉換都與之相似 }
在java裏分割字符串是經過正則表達式來分割的,在此我只是簡單談論一下如何分割,想深刻了解正則表達式的,能夠點擊 這裏。線程
首先看一個簡單的例子,以下使用「-」來分割字符串,
String str = "aa-bb-cc-dd"; String[] res = str.split("-"); //aa bb cc dd
看起來很簡單,只須要在找出分割復就好了,如你想使用「c」做爲分割符,那輸出就是aa-bb- -dd。另外再看一下,使用空格符(\s)來分割字符串(Space鍵,tab鍵或者換行符),以下:
String str4 = "aa bb cc dd"; String[] res = str4.split("\\s"); //aa bb cc dd
在這裏就有點不一樣的,在java裏反斜線(\)有着特別的含義,爲避免混淆或者出現異常, 應該使用(\\),相似的,看一下使用「|」分割字符串,
String str4 = "aa|bb|cc|dd"; String[] res = str4.split("\\|"); //aa bb cc dd
String str = "abcdefg"; str = str.substring(2, 5); //cde
在java7裏,substring會建立一個字符串,若是是在java6,倡導使用以下方式:
String str = "abcdefg"; str = str.substring(2, 5)+""; //cde
關於substring在java6和java7的區別,能夠查閱相關文檔。
String str = "2013-9-24"; SimpleDateFormat format = new SimpleDateFormat(); format.applyPattern("yyyy-MM-dd"); Date date = format.parse(str); System.out.println(date); //Tue Sep 24 00:00:00 CST 2013
String與StringBuilder的區別,String是建立以後不能夠再修改,StringBuilder是可變的,建立以後能夠修改。StringBuilder與StringBuffer的區別,StringBuffer是線程安全的,執行速度相對StringBuffer會慢一點。
從java7開始,能夠在switch語句中使用字符串,以下:
switch (str) { case "a": break; case "b": break; }
使用Apache Commons Lang的StringUtils,能夠實現這一功能:
String str = "1234 "; String repeated = StringUtils.repeat(str,3); //1234 1234 1234
其實現方式以下,注意,因爲篇幅緣由,並無考慮任何異常,詳細操做能夠參考源碼:
public String repeat(String str,int repeatTimes){ int inputLen = str.length(); //獲取字符串的長度 int outputLen = inputLen * repeatTimes; //輸出字符串的長度 switch (inputLen) { //當長度只有1或2時,選擇直接使用字符操做,增長效率 case 1: return repeat(str.charAt(0), repeatTimes); case 2: char ch0 = str.charAt(0); char ch1 = str.charAt(1); char[] output = new char[outputLen]; for(int i = repeatTimes * 2 -1;i >=0;){ output[i] = ch0; output[i+1] = ch1; i +=2; } return output.toString(); default: StringBuilder buf = new StringBuilder(); for(int i = 0;i <= repeatTimes - 1; i++){ buf.append(str); } return buf.toString(); } } public String repeat(char ch,int repeatTimes){ char[] buf = new char[repeatTimes]; for(int i = repeatTimes-1; i >= 0; i--){ //複製repeatTimes buf[i] = ch; } return buf.toString(); }
一樣是使用Apache Commons Lang的StringUtils,以下:
int n = StringUtils.countMatches("aaaabbbb", "a"); System.out.println(n);
源碼研究不透,不太會其實現方式.若是你知道的,但願你能夠分享一下,萬分感謝.
當String一旦建立,便不可再修改,直到gc將它回收.可gc的回收時間沒法預測.即便一個對象不存在引用,也須要在將來的某個時間纔會讓給出回收.因此String操做敏感信息,有滲漏的風險.可char[]就不同了,咱們能夠經過程序直接控制其元素,通常敏感信息再也不有用,直接將數組便可,所以更傾向使用char[]來保存密碼等敏感信息.