小编这次要给大家分享的是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赋值的时候,它会指向一个全新的字符串:
然而,这个图不是完全正确的表示堆中发生的事情。因为在jdk6和jdk7中调用子字符串时发生的事情并不一样。
<强> JDK 6中的子字符串强>
特林是通过字符数组实现的。在JDK 6中,字符串类包含三个成员变量:char [], int抵消,int数,他们分别用来:存储真正的字符数组,存储数组的第一个位置索引,存储字符串中包含的字符个数。
当调用子串方法的时候,会创建一个新字符串的对象,但是这个字符串的值仍然指向堆中的同一个字符数组。这两个对象中只有计数和偏移量的值是不同的。
源码
//JDK 6 字符串(int抵消,int、char价值[]){ 这一点。值=https://www.yisu.com/zixun/value; 这一点。抵消=抵消; 这一点。数=计数; } 公共子串字符串(int beginIndex int endIndex) {//检查边界 返回新的字符串(抵消+ beginIndex endIndex——beginIndex值); }
存在的问题
如果有一个很长的字符串,但是你只需要使用很短的一段,于是你使用子串进行切割,但是由于你实际上引用了整个字符串,这个很长的字符串无法被回收,往小了说,造成了存储空间的浪费,往大了说,可能造成内存泄漏。这个问题已经被官方记录在Java Bug数据库里面了:
相应的解决办法:
s1=s1.substring (x, y) +““;
<强> JDK 7中的子字符串强>
上述问题在JDK 7中得到了解决.JDK 7中,子串方法会在堆中创建一个新的数组。
源码
//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}。 *引用> * * @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); }*的例子: *
<>之前 *“汉堡包”。子串(4、8)返回“冲动” *“微笑”。substring(1、5)返回“英里” *