String源码学习

String类图

indexOf(String str)

先根据相应解码方式,选择对应的处理类。算法思路:先查找到第一个相同的字符,再查找余下的字符,时间复杂度O(n-m)*m,空间复杂度O(1),其中n代表原字符串长度,m代表要查找的字符串长度

 // String.java 
 // 根据相应解码方式,选择对应的处理
 public int indexOf(String str) {
     byte coder = coder();
     if (coder == str.coder()) {
         return isLatin1() ? StringLatin1.indexOf(value, str.value)
                           : StringUTF16.indexOf(value, str.value);
     }
     if (coder == LATIN1) {  // str.coder == UTF16
         return -1;
     }
     return StringUTF16.indexOfLatin1(value, str.value);
 }

 // StringUTF16.java 会调用indexOf(value, value.length, str, str.length, 0)
 // 算法思路:先查找到第一个相同的字符,再查找余下的字符,时间复杂度O(n-m)*m,空间复杂度O(1),其中n代表原字符串长度,m代表要查找的字符串长度
 public static int indexOf(byte[] value, int valueCount, byte[] str, int strCount, int fromIndex) {
     byte first = str[0];
     int max = (valueCount - strCount);
     for (int i = fromIndex; i <= max; i++) {
         // Look for first character.
         if (value[i] != first) {
             while (++i <= max && value[i] != first);
         }
         // Found first character, now look at the rest of value
         if (i <= max) {
             int j = i + 1;
             int end = j + strCount - 1;
             for (int k = 1; j < end && value[j] == str[k]; j++, k++);
             if (j == end) {
                 // Found whole string.
                 return i;
             }
         }
     }
     return -1;
 }

substring()

通过jvm进行数组复制重新生成结果String

   // String.java 
   // 根据相应解码方式,选择对应的处理
   public String substring(int beginIndex, int endIndex) {
       int length = length();
       checkBoundsBeginEnd(beginIndex, endIndex, length);
       if (beginIndex == 0 && endIndex == length) {
           return this;
       }
       int subLen = endIndex - beginIndex;
       return isLatin1() ? StringLatin1.newString(value, beginIndex, subLen)
                         : StringUTF16.newString(value, beginIndex, subLen);
   }

   // StringUTF16.java 
   // 交给Arrays.copyOfRange
   public static String newString(byte[] val, int index, int len) {
       if (len == 0) {
           return "";
       }
       return new String(Arrays.copyOfRange(val, index, index + len),
                         LATIN1);
   }
   // Arrays.java
   public static <T> T[] copyOfRange(T[] original, int from, int to) {
       return copyOfRange(original, from, to, (Class<? extends T[]>) original.getClass());
   }
   // 传过来的byte[],所有会走Array.newInstance,创建一个数组
   public static <T,U> T[] copyOfRange(U[] original, int from, int to, Class<? extends T[]> newType) {
       int newLength = to - from;
       if (newLength < 0)
           throw new IllegalArgumentException(from + " > " + to);
       @SuppressWarnings("unchecked")
       T[] copy = ((Object)newType == (Object)Object[].class)
           ? (T[]) new Object[newLength]
           : (T[]) Array.newInstance(newType.getComponentType(), newLength);
       System.arraycopy(original, from, copy, 0,
                        Math.min(original.length - from, newLength));
       return copy;
   }
   // Array.java newInstance()实际上是创建一个数据
   private static native Object newArray(Class<?> componentType, int length);
   // System.java
   public static native void arraycopy(Object src,  int  srcPos, Object dest, int destPos, int length);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值