国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

String源碼閱讀之contains實現原理

2019-11-06 06:13:03
字體:
來源:轉載
供稿:網友

轉載請注明出處:http://blog.csdn.net/jevonsCSDN/article/details/60758197 【Jevons’Blog】

本文將對String部分源碼進行閱讀分析的記錄。

contains

對String中的contains方法進行分析,了解其采用的是什么算法進行匹配。

//用于判斷源字符串是否包含目標字符序列 CharSequence s public boolean contains(CharSequence s) { //調用indexOf(String str)方法 return indexOf(s.toString()) > -1; }

indexOf (String str)

public int indexOf(String str) { //繼續往下調用indexOf(String str, int fromIndex)方法,并傳入匹配起始下標 return indexOf(str, 0); }

indexOf (String str, int fromIndex)

public int indexOf(String str, int fromIndex) { //繼續往下調用indexOf(char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex) 函數 //傳入源字符串,源字符串偏移量,源字符串長度,目標字符串,目標字符串偏移量,目標字符串長度,匹配源字符串的起始坐標 return indexOf(value, 0, value.length, str.value, 0, str.value.length, fromIndex); }

indexOf (char[] source, int sourceOffset, int sourceCount,char[] target, int targetOffset, int targetCount,int fromIndex)

static int indexOf(char[] source, int sourceOffset, int sourceCount, char[] target, int targetOffset, int targetCount, int fromIndex) { //若匹配的起始下標大于或等于源字符串的長度 if (fromIndex >= sourceCount) { //檢測目標長度是否為0,是則返回源字符串長度,否則返回-1 return (targetCount == 0 ? sourceCount : -1); } //若匹配的起始下標小于0 if (fromIndex < 0) { //將匹配的起始下標置0 fromIndex = 0; } //若目標字符串長度等于0 if (targetCount == 0) { //直接返回匹配的起始下標 return fromIndex; } //從定義的目標偏移量中取出目標字符串的第一個字符 char first = target[targetOffset]; //獲取源字符串能被匹配的最大長度 int max = sourceOffset + (sourceCount - targetCount); //從定義的偏移量加上起始匹配下標開始進行匹配 for (int i = sourceOffset + fromIndex; i <= max; i++) { /* Look for first character. */ //檢測第一個字符是否相等 if (source[i] != first) { //不相等則循環匹配,直到找到能與目標字符串第一個字符匹配的源字符串下標。 while (++i <= max && source[i] != first); } /* Found first character, now look at the rest of v2 */ //已經找到了與目標字符串第一個字符匹配的源字符串下標,則從該下標的下一位開始,對目標字符串余下的字符進行匹配。 if (i <= max) { //從該下標的下一位開始 int j = i + 1; //定義本次匹配的最大長度 int end = j + targetCount - 1; //循環匹配 for (int k = targetOffset + 1; j < end && source[j] == target[k]; j++, k++); //j能一直增加到end,說明已經成功匹配 if (j == end) { /* Found whole string. */ //返回在源字符串中被匹配到的第一個字符的下標。 return i - sourceOffset; } } } //沒有匹配到,返回-1 return -1; }

  從這個方法中可以看出,其采用的是最原始也是最笨的方法進行匹配,將目標字符串與源字符串的字符進行逐一匹配,若第一個字符匹配成功,則進行余下的匹配,若余下的匹配不成功,則從一開始目標字符串的第一個字符與源字符串匹配時的下標的下一位繼續進行匹配。這樣其實是浪費了很多沒必要的時間。有關字符串匹配的快捷有效匹配算法,可以參照KMP算法。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 皮山县| 保康县| 桑植县| 岳阳市| 贵溪市| 六枝特区| 义乌市| 涞源县| 汤阴县| 焉耆| 江西省| 那坡县| 宁南县| 江西省| 涞水县| 九龙城区| 永昌县| 邯郸县| 阳西县| 嵩明县| 双辽市| 华宁县| 祁门县| 林芝县| 柳林县| 平江县| 昌乐县| 涡阳县| 社会| 丰宁| 玉田县| 定安县| 逊克县| 新民市| 科尔| 元氏县| 安图县| 临汾市| 阳江市| 同心县| 青龙|