java源碼解析之String類的compareTo(String otherString)方法
一. 前言
最近我發(fā)現(xiàn)了一個(gè)事情,那就是在面試筆試中,好多公司都喜歡在String字符串上出問(wèn)題,涉及到方方面面的知識(shí),包括其中的一些常用方法。
String 類代表字符串。Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn)。
字符串是常量;它們的值在創(chuàng)建之后不能更改。字符串緩沖區(qū)支持可變的字符串。因?yàn)?String 對(duì)象是不可變的,所以可以共享。
近日研究了一下String類的一些方法, 通過(guò)查看源碼, 對(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)測(cè)試, 結(jié)果與compareTo(String otherString)返回一致
說(shuō)明:
1. 為避免沖突, 我定義的方法名為compares
2. 注釋中已經(jīng)詳細(xì)地記錄了分析思路, 故對(duì)代碼不做過(guò)多說(shuō)明
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è)字符串的長(zhǎng)度, 并把最短的字符串長(zhǎng)度作為循環(huán)的次數(shù) (這樣可以避免數(shù)組越界的異常)
* 3. 把2個(gè)字符串從0開始遍歷, 比較每一個(gè)字符, 若字符不相等時(shí), 則返回兩個(gè)字符串的差值
* 4. 如果遍歷的字符串都相等時(shí), 則返回兩個(gè)字符串的長(zhǎng)度差
*
* 方法結(jié)果:
* 1. 若兩個(gè)字符串長(zhǎng)度和字符都相等時(shí), 則返回0
* 2. 若兩個(gè)字符長(zhǎng)度不相等, 但大串完全包含(順序和字符都相等)小串字符時(shí), 則返回兩個(gè)字符串的長(zhǎng)度的差值
* 舉例:
* 大串: helloworlds
* 小串: helloworld
* 因?yàn)榇蟠耆〈? 所以返回長(zhǎng)度的差值, 為1
* 3. 若兩個(gè)字符串長(zhǎng)度和字符都不相等時(shí), 則返回比較過(guò)程中, 某個(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è)字符串的長(zhǎng)度, 并把最短的字符串長(zhǎng)度作為循環(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è)字符串的長(zhǎng)度差
return firstLength - lastLength;
}
}
三. 小結(jié)
通過(guò)源碼的學(xué)習(xí), 讓我有一種知其然知其所以然的感覺, 后期會(huì)繼續(xù)分享更多源碼分析, 與大家共同學(xué)習(xí) !
好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java中url漢字編碼互相轉(zhuǎn)換實(shí)例
這篇文章介紹了java中url漢字編碼互相轉(zhuǎn)換實(shí)例,有需要的朋友可以參考一下2013-10-10
解決idea無(wú)法導(dǎo)入識(shí)別本地類的問(wèn)題
今天做實(shí)驗(yàn)不知道按了哪里不能導(dǎo)入識(shí)別本地的類,只有jar包的類,百度搜索也沒有找到合理的解決方案,經(jīng)過(guò)朋友援助問(wèn)題根源找到,下面小編把解決方法分享給大家,需要的朋友參考下吧2021-08-08
Java調(diào)用echarts提供的地圖壓縮方法來(lái)壓縮地圖
今天小編就為大家分享一篇關(guān)于Java調(diào)用echarts提供的地圖壓縮方法來(lái)壓縮地圖,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤
這篇文章主要介紹了MyBatis版本升級(jí)導(dǎo)致OffsetDateTime入?yún)⒔馕霎惓?wèn)題復(fù)盤,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
使用Java實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊鏈程序的方法
這篇文章主要介紹了使用Java實(shí)現(xiàn)簡(jiǎn)單的區(qū)塊鏈程序的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04
利用Java實(shí)現(xiàn)帶GUI的氣泡詩(shī)詞特效
這篇文章主要為大家介紹了如何利用Java語(yǔ)言實(shí)現(xiàn)帶GUI的氣泡詩(shī)詞特效,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)Java有一定幫助,感興趣的可以了解一下2022-08-08
Java遞歸算法詳解(動(dòng)力節(jié)點(diǎn)整理)
Java遞歸算法是基于Java語(yǔ)言實(shí)現(xiàn)的遞歸算法。遞歸算法對(duì)解決一大類問(wèn)題很有效,它可以使算法簡(jiǎn)潔和易于理解。接下來(lái)通過(guò)本文給大家介紹Java遞歸算法相關(guān)知識(shí),感興趣的朋友一起學(xué)習(xí)吧2017-03-03

