欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時(shí)間:2018年09月10日 14:10:28   作者:dremeue  
這篇文章主要給大家介紹了關(guān)于java源碼解析之String類的compareTo(String otherString)方法的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

一. 前言

最近我發(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í), 讓我有一種知其然知其所以然的感覺(jué), 后期會(huì)繼續(xù)分享更多源碼分析, 與大家共同學(xué)習(xí) !

好了,以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • 已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus的方法

    這篇文章主要介紹了已有的springcloud+mybatis項(xiàng)目升級(jí)為mybatis-plus,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文)

    Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文)

    這篇文章主要介紹了Java框架搭建之Maven、Mybatis、Spring MVC整合搭建(圖文),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • 深入解析Spring?Boot?的SPI機(jī)制詳情

    深入解析Spring?Boot?的SPI機(jī)制詳情

    這篇文章主要介紹了深入解析Spring?Boot的SPI機(jī)制詳情,SPI是JDK內(nèi)置的一種服務(wù)提供發(fā)現(xiàn)機(jī)制,可以用來(lái)啟用框架擴(kuò)展和替換組件,主要用于框架中開發(fā),更多相關(guān)介紹,感興趣的小伙伴可以參考一下下面文章內(nèi)容
    2022-08-08
  • Java多線程下的單例模式參考

    Java多線程下的單例模式參考

    這篇文章主要演示多線程下的單例模式,分別演示了lock和synchronized兩種方案,希望能給大家做一個(gè)參考。
    2016-06-06
  • Java GUI圖形界面開發(fā)實(shí)現(xiàn)小型計(jì)算器流程詳解

    Java GUI圖形界面開發(fā)實(shí)現(xiàn)小型計(jì)算器流程詳解

    本文章向大家介紹Java GUI圖形界面開發(fā)實(shí)現(xiàn)小型計(jì)算器,主要包括布局管理器使用實(shí)例、應(yīng)用技巧、基本知識(shí)點(diǎn)總結(jié)和需要注意事項(xiàng),具有一定的參考價(jià)值,需要的朋友可以參考一下
    2022-08-08
  • Servlet方法生命周期及執(zhí)行原理詳解

    Servlet方法生命周期及執(zhí)行原理詳解

    運(yùn)行在服務(wù)器端的小程序,Servlet就是一個(gè)接口,定義了Java類被瀏覽器訪問(wèn)到(tomcat識(shí)別)的規(guī)則,將來(lái)我們自定義一個(gè)類,實(shí)現(xiàn)Servlet接口,復(fù)寫方法
    2021-09-09
  • 解決IDEA中 Ctrl+ALT+V這個(gè)快捷鍵無(wú)法使用的情況

    解決IDEA中 Ctrl+ALT+V這個(gè)快捷鍵無(wú)法使用的情況

    這篇文章主要介紹了解決IDEA中 Ctrl+ALT+V這個(gè)快捷鍵無(wú)法使用的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Java通過(guò)jersey實(shí)現(xiàn)客戶端圖片上傳示例

    Java通過(guò)jersey實(shí)現(xiàn)客戶端圖片上傳示例

    本篇文章主要介紹了Java通過(guò)jersey實(shí)現(xiàn)客戶端圖片上傳示例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-03-03
  • java循環(huán)刪除List元素報(bào)錯(cuò)的原因分析與解決

    java循環(huán)刪除List元素報(bào)錯(cuò)的原因分析與解決

    大家在工作中應(yīng)該都會(huì)遇到從List集合中刪除某一個(gè)或多個(gè)元素的業(yè)務(wù)場(chǎng)景,相信大家都會(huì)避開在循環(huán)里面刪除元素,使用其他方式處理,這是為什么呢,下面小編就來(lái)和大家詳細(xì)聊聊
    2023-11-11
  • java中如何把實(shí)體類轉(zhuǎn)成json格式的字符串

    java中如何把實(shí)體類轉(zhuǎn)成json格式的字符串

    這篇文章主要介紹了java中如何把實(shí)體類轉(zhuǎn)成json格式的字符串問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12

最新評(píng)論