国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

JDK源碼解析之String二

liangdas / 622人閱讀

摘要:如果起始地址小于或者起始地址所比較對象長度大于自身對象長度,返回假從所比較對象的末尾開始比較起始比較和末尾比較都是比較經常用得到的方法,例如在判斷一個字符串是不是協議的,或者初步判斷一個文件是不是文件,都可以采用這個方法進行比較。

(28) public boolean startsWith(String prefix, int toffset) {

</>復制代碼

  1. char ta[] = value;
  2. int to = toffset;
  3. char pa[] = prefix.value;
  4. int po = 0;
  5. int pc = prefix.value.length;
  6. // Note: toffset might be near -1>>>1.
  7. //如果起始地址小于0或者(起始地址+所比較對象長度)大于自身對象長度,返回假
  8. if ((toffset < 0) || (toffset > value.length - pc)) {
  9. return false;
  10. }
  11. //從所比較對象的末尾開始比較
  12. while (--pc >= 0) {
  13. if (ta[to++] != pa[po++]) {
  14. return false;
  15. }
  16. }
  17. return true;
  18. }

(29) public boolean startsWith(String prefix) {

</>復制代碼

  1. return startsWith(prefix, 0);
  2. }

(30) public boolean endsWith(String suffix) {

</>復制代碼

  1. return startsWith(suffix, value.length - suffix.value.length);
  2. }
  3. 起始比較和末尾比較都是比較經常用得到的方法,例如在判斷一個字符串是不是http協議的,
  4. 或者初步判斷一個文件是不是mp3文件,都可以采用這個方法進行比較。

(31) public native String intern();

intern方法是Native調用,它的作用是在方法區中的常量池里通過equals方法尋找等值的對象,
如果沒有找到則在常量池中開辟一片空間存放字符串并返回該對應String的引用,
否則直接返回常量池中已存在String對象的引用

(32) public String toLowerCase() {

</>復制代碼

  1. return toLowerCase(Locale.getDefault());
  2. }

(33) public String toUpperCase(Locale locale) {

</>復制代碼

  1. if (locale == null) {
  2. throw new NullPointerException();
  3. }
  4. int firstLower;
  5. final int len = value.length;
  6. /* Now check if there are any characters that need to be changed. */
  7. scan: {
  8. for (firstLower = 0 ; firstLower < len; ) {
  9. int c = (int)value[firstLower];
  10. int srcCount;
  11. if ((c >= Character.MIN_HIGH_SURROGATE)
  12. && (c <= Character.MAX_HIGH_SURROGATE)) {
  13. c = codePointAt(firstLower);
  14. srcCount = Character.charCount(c);
  15. } else {
  16. srcCount = 1;
  17. }
  18. int upperCaseChar = Character.toUpperCaseEx(c);
  19. if ((upperCaseChar == Character.ERROR)
  20. || (c != upperCaseChar)) {
  21. break scan;
  22. }
  23. firstLower += srcCount;
  24. }
  25. return this;
  26. }
  27. /* result may grow, so i+resultOffset is the write location in result */
  28. int resultOffset = 0;
  29. char[] result = new char[len]; /* may grow */
  30. /* Just copy the first few upperCase characters. */
  31. System.arraycopy(value, 0, result, 0, firstLower);
  32. String lang = locale.getLanguage();
  33. boolean localeDependent =
  34. (lang == "tr" || lang == "az" || lang == "lt");
  35. char[] upperCharArray;
  36. int upperChar;
  37. int srcChar;
  38. int srcCount;
  39. for (int i = firstLower; i < len; i += srcCount) {
  40. srcChar = (int)value[i];
  41. if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
  42. (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
  43. srcChar = codePointAt(i);
  44. srcCount = Character.charCount(srcChar);
  45. } else {
  46. srcCount = 1;
  47. }
  48. if (localeDependent) {
  49. upperChar = ConditionalSpecialCasing.toUpperCaseEx(this, i, locale);
  50. } else {
  51. upperChar = Character.toUpperCaseEx(srcChar);
  52. }
  53. if ((upperChar == Character.ERROR)
  54. || (upperChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
  55. if (upperChar == Character.ERROR) {
  56. if (localeDependent) {
  57. upperCharArray =
  58. ConditionalSpecialCasing.toUpperCaseCharArray(this, i, locale);
  59. } else {
  60. upperCharArray = Character.toUpperCaseCharArray(srcChar);
  61. }
  62. } else if (srcCount == 2) {
  63. resultOffset += Character.toChars(upperChar, result, i + resultOffset) - srcCount;
  64. continue;
  65. } else {
  66. upperCharArray = Character.toChars(upperChar);
  67. }
  68. /* Grow result if needed */
  69. int mapLen = upperCharArray.length;
  70. if (mapLen > srcCount) {
  71. char[] result2 = new char[result.length + mapLen - srcCount];
  72. System.arraycopy(result, 0, result2, 0, i + resultOffset);
  73. result = result2;
  74. }
  75. for (int x = 0; x < mapLen; ++x) {
  76. result[i + resultOffset + x] = upperCharArray[x];
  77. }
  78. resultOffset += (mapLen - srcCount);
  79. } else {
  80. result[i + resultOffset] = (char)upperChar;
  81. }
  82. }
  83. return new String(result, 0, len + resultOffset);
  84. }
  85. 將字符串的大寫轉換為小寫,將字符串小寫轉換為大寫

(34)public char[] toCharArray() {

</>復制代碼

  1. char result[] = new char[value.length];
  2. System.arraycopy(value, 0, result, 0, value.length);
  3. return result;
  4. }
  5. 將字符串轉化為數組,由于本身就是數組的形式,只需將其拷貝即可。

(35) public String[] split(String regex, int limit) {

</>復制代碼

  1. char ch = 0;
  2. if (((regex.value.length == 1 &&
  3. ".$|()[{^?*+".indexOf(ch = regex.charAt(0)) == -1) ||
  4. (regex.length() == 2 &&
  5. regex.charAt(0) == "" &&
  6. (((ch = regex.charAt(1))-"0")|("9"-ch)) < 0 &&
  7. ((ch-"a")|("z"-ch)) < 0 &&
  8. ((ch-"A")|("Z"-ch)) < 0)) &&
  9. (ch < Character.MIN_HIGH_SURROGATE ||
  10. ch > Character.MAX_LOW_SURROGATE))
  11. {
  12. int off = 0;
  13. int next = 0;
  14. boolean limited = limit > 0;
  15. ArrayList list = new ArrayList<>();
  16. while ((next = indexOf(ch, off)) != -1) {
  17. if (!limited || list.size() < limit - 1) {
  18. list.add(substring(off, next));
  19. off = next + 1;
  20. } else { // last one
  21. //assert (list.size() == limit - 1);
  22. list.add(substring(off, value.length));
  23. off = value.length;
  24. break;
  25. }
  26. }
  27. // If no match was found, return this
  28. if (off == 0)
  29. return new String[]{this};
  30. // Add remaining segment
  31. if (!limited || list.size() < limit)
  32. list.add(substring(off, value.length));
  33. // Construct result
  34. int resultSize = list.size();
  35. if (limit == 0) {
  36. while (resultSize > 0 && list.get(resultSize - 1).length() == 0) {
  37. resultSize--;
  38. }
  39. }
  40. String[] result = new String[resultSize];
  41. return list.subList(0, resultSize).toArray(result);
  42. }
  43. return Pattern.compile(regex).split(this, limit);
  44. }

(36)public String[] split(String regex) {

</>復制代碼

  1. return split(regex, 0);
  2. }
  3. 對于字符串 "boo:and:foo",regex為o,limit為5時,
  4. splite方法首先去字符串里查找regex——o,然后把o做為分隔符,
  5. 逐個把o去掉并且把字符串分開,比如,發現b后面有一個o,于是把這個o去掉,
  6. 并且把字符串拆成"b", "o:and:foo"兩個字符串(注意:b后面的兩個o已經去掉了一個),
  7. 接下來看"o:and:foo"這個字符串,第一個字符就是o
  8. 于是o前面相當于一個空串,把這個o去掉,"o:and:foo"被分開成"", ":and:foo"這樣兩個字符串,
  9. 以此類推循環5次就是splite("o", 5)方法的作用

(37) public static String join(CharSequence delimiter, CharSequence... elements) {

</>復制代碼

  1. Objects.requireNonNull(delimiter);
  2. Objects.requireNonNull(elements);
  3. // Number of elements not likely worth Arrays.stream overhead.
  4. StringJoiner joiner = new StringJoiner(delimiter);
  5. for (CharSequence cs: elements) {
  6. joiner.add(cs);
  7. }
  8. return joiner.toString();
  9. }

(38) public static String join(CharSequence delimiter,

</>復制代碼

  1. Iterable elements) {
  2. Objects.requireNonNull(delimiter);
  3. Objects.requireNonNull(elements);
  4. StringJoiner joiner = new StringJoiner(delimiter);
  5. for (CharSequence cs: elements) {
  6. joiner.add(cs);
  7. }
  8. return joiner.toString();
  9. }
  10. 將已給的數組用給定的字符進行分開,返回一個特定的字符串,例如
  11. String [] strings = {"a","b","c","d"};
  12. info = String.join( "a",strings );
  13. System.out.println( info );
  14. 打印的結果為 aabacad

(39) public static String format(String format, Object... args) {

</>復制代碼

  1. return new Formatter().format(format, args).toString();
  2. }

(40) public static String format(Locale l, String format, Object... args) {

</>復制代碼

  1. return new Formatter(l).format(format, args).toString();
  2. }
  3. 將字符串串格式化為一定格式的形式返回給

(41) 各種各樣的 valueOf(Object obj) 方法

</>復制代碼

  1. 作用就是將相應格式的對象轉換為你字符串的格式

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77345.html

相關文章

  • JDK源碼解析系列object

    摘要:在應用程序的一次執行到另外一次執行,同一對象的返回的哈希碼無須保持一致。則是以對象的哈希碼為實參,以進制無符號整數形式返回此哈希碼的字符串表示形式。 JDK源碼之Object類 1 private static native void registerNatives(); Java中,用native關鍵字修飾的函數表明該方法的實現并不是在Java中去完成,而是由C++去完成,并被編譯成...

    binaryTree 評論0 收藏0
  • java源碼

    摘要:集合源碼解析回歸基礎,集合源碼解析系列,持續更新和源碼分析與是兩個常用的操作字符串的類。這里我們從源碼看下不同狀態都是怎么處理的。 Java 集合深入理解:ArrayList 回歸基礎,Java 集合深入理解系列,持續更新~ JVM 源碼分析之 System.currentTimeMillis 及 nanoTime 原理詳解 JVM 源碼分析之 System.currentTimeMi...

    Freeman 評論0 收藏0
  • dubbo源碼解析)Dubbo擴展機制SPI

    摘要:二注解該注解為了保證在內部調用具體實現的時候不是硬編碼來指定引用哪個實現,也就是為了適配一個接口的多種實現,這樣做符合模塊接口設計的可插拔原則,也增加了整個框架的靈活性,該注解也實現了擴展點自動裝配的特性。 Dubbo擴展機制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對dubbo整個項目大體的介紹,而從這篇文章開始,我將會從源碼來解讀dubbo再各個模塊的實...

    DirtyMind 評論0 收藏0
  • 我的阿里路+Java面經考點

    摘要:我的是忙碌的一年,從年初備戰實習春招,年三十都在死磕源碼,三月份經歷了阿里五次面試,四月順利收到實習。因為我心理很清楚,我的目標是阿里。所以在收到阿里之后的那晚,我重新規劃了接下來的學習計劃,將我的短期目標更新成拿下阿里轉正。 我的2017是忙碌的一年,從年初備戰實習春招,年三十都在死磕JDK源碼,三月份經歷了阿里五次面試,四月順利收到實習offer。然后五月懷著忐忑的心情開始了螞蟻金...

    姘擱『 評論0 收藏0

發表評論

0條評論

liangdas

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<