Java如何实现子串方法

  介绍

小编这次要给大家分享的是Java如何实现子串方法,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

<强>子串实现原理

字符串是Java中一个比较基础的类,每一个开发人员都会经常接触到。而且,弦也是面试中经常会考的知识点.String有很多方法,有些方法比较常用,有些方法不太常用。今天要介绍的子字符串就是一个比较常用的方法,而且围绕子串也有很多面试题。

子串(int, int beginIndex endIndex)方法在不同版本的JDK中的实现是不同的了。解他们的区别可以帮助你更好的使用他。为简单起,见后文中用substring()代表子串(int, int beginIndex endIndex)方法。

<强> substring()的作用

子串(int, int beginIndex endIndex)方法截取字符串并返回其[beginIndex endIndex-1]范围内的内容。s

字符串x=癮bcdef"; x=x.substring (1,3); System.out.println (x);

输出内容:公元前

<强>调用子字符串时发生了什么?

你可能知道,因为x是不可变的,当使用x.substring(1、3)对x赋值的时候,它会指向一个全新的字符串:

癑ava如何实现子串方法"

然而,这个图不是完全正确的表示堆中发生的事情。因为在jdk6和jdk7中调用子字符串时发生的事情并不一样。

<强> JDK 6中的子字符串

特林是通过字符数组实现的。在JDK 6中,字符串类包含三个成员变量:char [], int抵消,int数,他们分别用来:存储真正的字符数组,存储数组的第一个位置索引,存储字符串中包含的字符个数。

当调用子串方法的时候,会创建一个新字符串的对象,但是这个字符串的值仍然指向堆中的同一个字符数组。这两个对象中只有计数和偏移量的值是不同的。

癑ava如何实现子串方法"

源码

//JDK 6
  字符串(int抵消,int、char价值[]){
  这一点。值=https://www.yisu.com/zixun/value;
  这一点。抵消=抵消;
  这一点。数=计数;
  }
  
  公共子串字符串(int beginIndex int endIndex) {//检查边界
  返回新的字符串(抵消+ beginIndex endIndex——beginIndex值);
  }

存在的问题

如果有一个很长的字符串,但是你只需要使用很短的一段,于是你使用子串进行切割,但是由于你实际上引用了整个字符串,这个很长的字符串无法被回收,往小了说,造成了存储空间的浪费,往大了说,可能造成内存泄漏。这个问题已经被官方记录在Java Bug数据库里面了:

癑ava如何实现子串方法"

相应的解决办法:

s1=s1.substring (x, y) +““;

<强> JDK 7中的子字符串

上述问题在JDK 7中得到了解决.JDK 7中,子串方法会在堆中创建一个新的数组。

癑ava如何实现子串方法"

源码

//JDK 7/* *
  *分配一个新的字符串}{@code包含字符的子数组
  *的字符数组参数。{@code抵消}参数是
  *第一个字符的索引子数组和{@code数}
  *参数指定子数组的长度。的内容
  *子数组复制;后续修改字符数组
  *不影响新创建的字符串。
  *
  * @param数组值是字符的来源
  * @param抵消初始偏移量
  * @param计算长度
  * @throws IndexOutOfBoundsException如果{@code抵消}和{}@code计数参数索引
  *字符边界以外的{}@code值数组
  */公共字符串(char [], int抵消,int数){//检查边界
  这一点。值=https://www.yisu.com/zixun/Arrays.copyOfRange(价值、抵消、抵消+数);
  }/* *
  *返回一个字符串,这个字符串的子字符串。的
  *子字符串从指定的开始{@code beginIndex}
  *延伸到字符索引{@code endIndex - 1}。
  *因此子串的长度是{@code endIndex-beginIndex}。
  * 

  *的例子:   *

<>之前   *“汉堡包”。子串(4、8)返回“冲动”   *“微笑”。substring(1、5)返回“英里”   *
  *   * @param beginIndex开始指数、包容。   * @param endIndex结束索引,排斥。   * @return指定的子串。   * @throws IndexOutOfBoundsException如果   * {@code beginIndex}是负的,或   * {@code endIndex}的长度比   *这个}{@code字符串对象,或   * {@code beginIndex}大于   * {@code endIndex}。   */公共子串字符串(int beginIndex int endIndex) {//检查边界   int subLen=endIndex - beginIndex;   返回((beginIndex==0) & & (endIndex==value.length) & # 63;   这样的:   新的字符串(价值、beginIndex subLen);   }

Java如何实现子串方法