zoukankan      html  css  js  c++  java
  • JDK6与JDK7中String类subString()方法的区别

    1、subString()方法的作用

      subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串。

    String x = "abcdef";
    x = x.substring(1,3);
    System.out.println(x);

    输出结果: 

    bc

     2、JDK6中的subString()方法

      String类实现是使用到了char数组。在JDK6里面String类有三个属性char value[], int offset, int count,这三个属性分别表示所存储的真实字符数组,这个字符串是从数组里面哪个索引开始的,以及这个字符串一共有多少个。

      当subString()方法被调用之后,就创建了一个新的字符串,但是这个字符串的值(该字符串里面的value[] 属性)仍然指向堆中的char数组。和原来的字符相比只是改变了offset和count属性。示意图如下:

      以下的代码可以简单地反映出这个调用机制。

    //JDK 6
    String(int offset, int count, char value[]) {
        this.value = value;
        this.offset = offset;
        this.count = count;
    }
     
    public String substring(int beginIndex, int endIndex) {
        //check boundary
        return  new String(offset + beginIndex, endIndex - beginIndex, value);
    }

    3、JDK6中的subString()方法可能导致的后果  

      如果你有一个长度很长的字符串,但是你只需要这个字符串里面的一个很短的部分而且是使用subString()这个方法来获得。那这可能会导致一个性能问题。你本来是需要一个很短的部分,但却要储存全部的字符。对于JDK6来说,这个解决的方法就要像如下的代码一样,让它指向真正的子字符串。

    x = x.substring(x, y) + "";

    4、JDK7中的subString()方法

      这个方法在JDK7里面得到了改进。JDK7中调用subString()方法的时候,实际上是在堆中创建了一个新char数组,这个新创建的char数组,存储的正好是这个子字符串。示意图如下:

      通过JDK7中String类底层的代码也可以发现,相关代码如下:

    //JDK 7
    public String(char value[], int offset, int count) {
        //check boundary
        this.value = Arrays.copyOfRange(value, offset, offset + count);
    }
     
    public String substring(int beginIndex, int endIndex) {
        //check boundary
        int subLen = endIndex - beginIndex;
        return new String(value, beginIndex, subLen);
    }
  • 相关阅读:
    adapter 异步加载
    退出应用
    scrollview 和 edittext 焦点冲突
    判断字符串
    generate portable version cannot addon plugin(buffer var)
    在ubuntu上面安装perl
    TV
    关于xilinx ise10.1与modelsim仿真库编译
    迅雷tips
    Verilog log2 函数
  • 原文地址:https://www.cnblogs.com/always-online/p/3457623.html
Copyright © 2011-2022 走看看