• 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);
    }
  • 相关阅读:
    STM32学习之路-SysTick的应用(时间延迟)
    STM32M CUBE实现printf打印调试信息以及实现单字节接收
    iframe动态创建及释放内存
    第13周项目2-成绩处理
    1036. Boys vs Girls (25)
    CS0433: 类型“BasePage”同一时候存在于“c:WindowsMicrosoft.NETxxxxxxxxxxxxxxxx
    Java读取Excel转换成JSON字符串进而转换成Java对象
    Java对象与JSON互相转换jsonlib以及手动创建JSON对象与数组——(二)
    GSON中Java对象与JSON互相转换——(一)
    Java泛型方法与泛型类的使用------------(五)
  • 原文地址:https://www.cnblogs.com/always-online/p/3457623.html
Copyright © 2020-2023  润新知