• JDK6和JDK7中String的substring()方法及其差异



    1. //
      JDK6,包级私有构造,共享 value数组提升速度 String(int offset, int count, char value[]) { this.value = value; this.offset = offset; this.count = count; } public String substring(int beginIndex, int endIndex) { // ... 检查边界的代码 // 如果范围和自己一模一样,则返回自身,否则用value字符数组构造一个新的对象 return ((beginIndex == 0) && (endIndex == count)) ? this : new String(offset + beginIndex, endIndex - beginIndex, value); }

        JDK6中value对象不变,只是offset和count 的两个属性值发生了变化 

     
    1.     public String substring(int i, int j)
          {
              if(i < 0)
                  throw new StringIndexOutOfBoundsException(i);
              if(j > value.length)
                  throw new StringIndexOutOfBoundsException(j);
              int k = j - i;
              if(k < 0)
                  throw new StringIndexOutOfBoundsException(k);
              else
                  return i != 0 || j != value.length ? new String(value, i, k) : this;
          }
          public String(char ac[], int i, int j)
          {
              if(i < 0)
                  throw new StringIndexOutOfBoundsException(i);
              if(j <= 0)
              {
                  if(j < 0)
                      throw new StringIndexOutOfBoundsException(j);
                  if(i <= ac.length)
                  {
                      value = "".value;
                      return;
                  }
              }
              if(i > ac.length - j)
              {
                  throw new StringIndexOutOfBoundsException(i + j);
              } else
              {
                  value = Arrays.copyOfRange(ac, i, i + j);
                  return;
              }
          }
          public String(char ac[], int i, int j)
          {
              if(i < 0)
                  throw new StringIndexOutOfBoundsException(i);
              if(j <= 0)
              {
                  if(j < 0)
                      throw new StringIndexOutOfBoundsException(j);
                  if(i <= ac.length)
                  {
                      value = "".value;
                      return;
                  }
              }
              if(i > ac.length - j)
              {
                  throw new StringIndexOutOfBoundsException(i + j);
              } else
              {
                  value = Arrays.copyOfRange(ac, i, i + j);
                  return;
              }
          }

        JDK7中真实地在堆内存中创建了另一个字符数组.

  • 相关阅读:
    JSP总结1
    EL总结2-域
    EL总结1
    getRealPath和getContextPath
    mybatis获取参数数值的两个方式
    进程与线程区别与联系
    进程间通信和线程间通信的区别
    STRLEN
    二叉树数据结构和算法
    TYPDEF使用注意部分
  • 原文地址:https://www.cnblogs.com/luliangliang/p/9067376.html
Copyright © 2020-2023  润新知