JDK6与JDK7中String类subString()方法的区别

简介: 1、subString()方法的作用   subString(int beginIndex, int endIndex)方法的返回的是以beginIndex开始到 endIndex-1结束的某个调用字符串。

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);
}
目录
相关文章
|
5天前
|
存储 JavaScript Java
课时44:String类对象两种实例化方式比较
本次课程的主要讨论了两种处理模式在Java程序中的应用,直接赋值和构造方法实例化。此外,还讨论了字符串池的概念,指出在Java程序的底层,DOM提供了专门的字符串池,用于存储和查找字符串。 1.直接赋值的对象化模式 2.字符串池的概念 3.构造方法实例化
|
5天前
|
Java
课时14:Java数据类型划分(初见String类)
课时14介绍Java数据类型,重点初见String类。通过三个范例讲解:观察String型变量、"+"操作符的使用问题及转义字符的应用。String不是基本数据类型而是引用类型,但使用方式类似基本类型。课程涵盖字符串连接、数学运算与字符串混合使用时的注意事项以及常用转义字符的用法。
|
4月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
123 2
|
4月前
|
JavaScript 前端开发 开发者
|
5月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
131 2
|
5月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
50 1
|
6天前
|
Oracle Java 关系型数据库
课时4:JDK的安装与配置
课时4:JDK的安装与配置 摘要: 1. JDK安装:从Oracle官网下载适合操作系统的JDK版本,确保关闭防火墙,选择正确的位数(如64位),并进行一键式安装。 2. JDK配置:将JDK的bin目录路径(如D:\Java\jdk1.8.0_74\bin)添加到系统环境变量PATH中,确保Java开发命令(如javac、java)可用。配置完成后,重启命令行工具验证安装是否成功。 通过以上步骤,确保Java开发环境的正确搭建。
|
6天前
|
Java
课时5:JDK安装与配置
课时5:JDK安装与配置,主讲人李兴华。课程详细讲解了JDK的安装步骤和环境配置方法,包括选择安装路径、配置系统环境变量(如path),确保javac和java命令在命令行中可用。建议将所有程序安装在D盘,便于管理。安装完成后,需重启命令行以加载新环境配置,确保Java开发环境正常运行。
|
3月前
|
NoSQL 关系型数据库 MySQL
Linux安装jdk、mysql、redis
Linux安装jdk、mysql、redis
254 7
|
4月前
|
Oracle Java 关系型数据库
安装 JDK 时应该注意哪些问题
选择合适的JDK版本需考虑项目需求与兼容性,推荐使用LTS版本如JDK 17或21。安装时注意操作系统适配,配置环境变量PATH和JAVA_HOME,确保合法使用许可证,并进行安装后测试以验证JDK功能正常。
111 3