一. 前言
最近我發(fā)現(xiàn)了一個(gè)事情,那就是在面試筆試中,好多公司都喜歡在String字符串上出問題,涉及到方方面面的知識(shí),包括其中的一些常用方法。
String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)。
字符串是常量;它們的值在創(chuàng)建之后不能更改。字符串緩沖區(qū)支持可變的字符串。因?yàn)?String 對(duì)象是不可變的,所以可以共享。
近日研究了一下String類的一些方法, 通過查看源碼, 對(duì)一些常用的方法也有了更透徹的認(rèn)識(shí), 也讓我更加理解了設(shè)計(jì)者的算法思想.
我也推薦大家多讀讀源碼, 我相信大家也會(huì)有意想不到的收獲.
二. 實(shí)戰(zhàn)
今天我分析的是String類的compareTo(String otherString)方法,
以下是我個(gè)人的分析觀點(diǎn), 如有哪里分析不到位的地方, 歡迎大家指出, 相互學(xué)習(xí), 共同進(jìn)步 !
首先, 尊重原作者, 先放上源碼
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
下面的是我自己寫的山寨compareTo()方法, 經(jīng)測試, 結(jié)果與compareTo(String otherString)返回一致
說明:
1. 為避免沖突, 我定義的方法名為compares
2. 注釋中已經(jīng)詳細(xì)地記錄了分析思路, 故對(duì)代碼不做過多說明
public class StringDemo { @Test public void test() { // 因?yàn)閛的ASCII碼為: 111 // 因?yàn)閍的ASCII碼為: 97 // 所以差為 : 111 - 97 = 14 // 返回值為:14, 與compareTo返回結(jié)果一致 System.out.println(compares("hellojava", "hellajava")); } public static int compares(String firstString, String lastString) { /* * 算法思路分析: * 1. 獲取2個(gè)字符串, 首先把2個(gè)字符串都轉(zhuǎn)化為字符數(shù)組 (為后面一個(gè)一個(gè)字符進(jìn)行比較做鋪墊) * 2. 獲取2個(gè)字符串的長度, 并把最短的字符串長度作為循環(huán)的次數(shù) (這樣可以避免數(shù)組越界的異常) * 3. 把2個(gè)字符串從0開始遍歷, 比較每一個(gè)字符, 若字符不相等時(shí), 則返回兩個(gè)字符串的差值 * 4. 如果遍歷的字符串都相等時(shí), 則返回兩個(gè)字符串的長度差 * * 方法結(jié)果: * 1. 若兩個(gè)字符串長度和字符都相等時(shí), 則返回0 * 2. 若兩個(gè)字符長度不相等, 但大串完全包含(順序和字符都相等)小串字符時(shí), 則返回兩個(gè)字符串的長度的差值 * 舉例: * 大串: helloworlds * 小串: helloworld * 因?yàn)榇蟠耆〈? 所以返回長度的差值, 為1 * 3. 若兩個(gè)字符串長度和字符都不相等時(shí), 則返回比較過程中, 某個(gè)索引位置上的字符之差 * 舉例: * 串1: hellojavas * 串2: hellajava * 遍歷比較后, 索引4的字符不同, 所以返回兩個(gè)字符的差值14, 'o' - 'a' = 14 */ /* * 1. 獲取2個(gè)字符串, 首先把2個(gè)字符串都轉(zhuǎn)化為字符數(shù)組 (為后面一個(gè)一個(gè)字符進(jìn)行比較做鋪墊) */ char[] firstCh = firstString.toCharArray(); char[] lastCh = lastString.toCharArray(); /* * 2. 獲取2個(gè)字符串的長度, 并把最短的字符串長度作為循環(huán)的次數(shù) (這樣可以避免數(shù)組越界的異常) */ int firstLength = firstCh.length; int lastLength = lastCh.length; int lim = Math.min(firstLength, lastLength); // 用k記錄比較的索引 int k = 0; while(k < lim) { char c1 = firstCh[k]; char c2 = lastCh[k]; // 3. 把2個(gè)字符串從0開始遍歷, 比較每一個(gè)字符, 若字符不相等時(shí), 則返回兩個(gè)字符串的差值 if(c1 != c2) { return c1 - c2; } // 如果字符相等, 則讓索引加1 k++; } // 4. 如果遍歷的字符串都相等時(shí), 則返回兩個(gè)字符串的長度差 return firstLength - lastLength; }}
三. 小結(jié)
通過源碼的學(xué)習(xí), 讓我有一種知其然知其所以然的感覺, 后期會(huì)繼續(xù)分享更多源碼分析, 與大家共同學(xué)習(xí) !
好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)VeVb武林網(wǎng)的支持。
新聞熱點(diǎn)
疑難解答
圖片精選