麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 開發(fā) > Java > 正文

java源碼解析之String類的compareTo(String otherString)方法

2024-07-14 08:42:18
字體:
供稿:網(wǎng)友

一. 前言

最近我發(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)的支持。


注:相關(guān)教程知識(shí)閱讀請移步到JAVA教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 中文字幕一区2区 | 欧美韩国一区 | 久章草影院 | 手机在线看片国产 | 久久伊人精品热在75 | 久久97视频| 色污视频 | 一区二区高清视频在线观看 | 免费看污视频在线观看 | 成人毛片100免费观看 | 成人一区二区三区在线 | 国产理论视频在线观看 | 免费观看在线 | 在线成人亚洲 | 欧美成在线视频 | 中文字幕激情视频 | 久久精品视频网址 | 日韩黄色精品 | 久久密| 高清av在线 | 亚洲国产精品一区二区三区 | 偿还的影视高清在线观看 | 欧美城网站地址 | 亚洲生活片 | 国产88久久久国产精品免费二区 | 久久精品亚洲精品国产欧美kt∨ | 日韩美香港a一级毛片 | 国产成年人网站 | 天天看天天摸天天操 | 欧美三区在线 | 久草最新在线 | 欧美精品久久久久久久多人混战 | 嗯~啊~用力~高h | 毛片免费视频观看 | 国产精品自拍99 | 精品成人免费视频 | 91经典视频| 欧美毛片在线观看 | 黄色片在线免费播放 | 美女性感毛片 | 久草干 |