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

  • 相关阅读:
    【SQL触发器】类型 FOR 、AFTER、 Instead of到底是什么鬼
    Oracle两种临时表的创建与使用详解
    oracle 临时表(事务级、会话级)
    oracle存储过程游标的使用(批号分摊)
    delphi FastReport快速入门
    Vue 表情包输入组件的实现代码
    一个基于 JavaScript 的开源可视化图表库
    浅淡Webservice、WSDL三种服务访问的方式(附案例)
    记录一下遇到的问题 java将json数据解析为sql语句
    Oracle词汇表(事务表(transaction table)”)
  • 原文地址:https://www.cnblogs.com/lianliang/p/5326012.html
Copyright © 2020-2023  润新知