zoukankan      html  css  js  c++  java
  • substring()方法是如何工作

    1、substring()方法做了什么?

    substring(beginIndex,endIndex)方法返回一个从beginIndex到endIndex-1的字符串

    String x = "abcdef";

    x = x.substring(1,3);

    System.out.println(x);

    输出:"bc"

    2、在substring()方法调用的时候都做了什么?

    因为字符串 x 是不可变的,当 x 被赋值为x.substring()的时候,x 指向了一个完全新创建的字符串

    然而,在jdk源码的底层,在堆内存中,所发生的事情并不是上述那么简单,并且jdk1.6 和 jdk1.7之间存在不同。

    3、jdk1.6中的substring()方法

    String是由一个char数组来保存的,在jdk1.6中,String类有三个字段:char value[] , int  offset,  int  count

    当substring()方法被调用的时候,创建了一个新的字符串,但是新字符串的值,仍然指向对内存中相同的字符串数组

    在jdk1.6中哟以下代码:

    //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);
    }

    4、jdk1.6中的substring()方法可能会引发的问题

    如果有一个很长的字符串,并且每次调用substring()方法取得只是很小的一部分字符串

    就会出现性能的问题,因为每次取得只是一小部分,如何来解决这个问题?可以调用完substring()方法之后把其变为字符串:

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

    5、jdk1.7中的substring()方法

    jdk1.7对jdk1.6的做法进行了改进,每次调用substring()方法,在对内存中创建了一个新的数组

    //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);
    }

  • 相关阅读:
    UVa 1595
    求树直径及所有直径顶点

    python-sort()/sorted()比较
    MNIST数据集分类简单版本
    Tensorlflow-解决非线性回归问题
    Tensorlflow-神经网络解决非线性回归问题
    tensorflow基础-placeholder
    Tensorflow基础-mnist数据集
    Week 3: Structured Types 5. Tuples and Lists Exercise: odd tuples
  • 原文地址:https://www.cnblogs.com/lianliang/p/5326012.html
Copyright © 2011-2022 走看看