The substring() Method in JDK 6 and JDK 7

The substring() Method in JDK 6 and JDK 7

By X Wang

The substring(int beginIndex, int endIndex) method in JDK 6 and JDK 7 are different. Knowing the difference can help you better use them. For simplicity reasons, in the followingsubstring() represent the substring(int beginIndex, int endIndex) method.

1. What substring() does?

The substring(int beginIndex, int endIndex) method returns a string that starts with beginIndex and ends with endIndex-1.

String x = "abcdef";
x = x.substring(1,3);
System.out.println(x);

Output:

bc

2. What happens when substring() is called?

You may know that because x is immutable, when x is assigned with the result of x.substring(1,3), it points to a totally new string like the following:

However, this diagram is not exactly right or it represents what really happens in the heap. What really happens when substring() is called is different between JDK 6 and JDK 7.

3. substring() in JDK 6

String is supported by a char array. In JDK 6, the String class contains 3 fields: char value[], int offset, int count. They are used to store real character array, the first index of the array, the number of characters in the String.

When the substring() method is called, it creates a new string, but the string‘s value still points to the same array in the heap. The difference between the two Strings is their count and offset values.

The following code is simplified and only contains the key point for explain this problem.

//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. A problem caused by substring() in JDK 6

If you have a VERY long string, but you only need a small part each time by using substring(). This will cause a performance problem, since you need only a small part, you keep the whole thing. For JDK 6, the solution is using the following, which will make it point to a real sub string:

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

5. substring() in JDK 7

This is improved in JDK 7. In JDK 7, the substring() method actually create a new array in the heap.

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

Top 10 questions about Java String.

References:
1. Changes to substring
2. Java 6 vs Java 7 when implementation matters

时间: 2024-12-12 12:13:23

The substring() Method in JDK 6 and JDK 7的相关文章

在JDK 6和JDK 7的substring()方法的区别?

原文链接:https://www.programcreek.com/2013/09/the-substring-method-in-jdk-6-and-jdk-7/ 在JDK 6和JDK 7中substring(int beginIndex,int endIndex)的实现是不同的,下面将会做出详细的解释.为简单起见,substring()方法表示的substring(int beginIndex,int endIndex)在这篇文章中的方法. 1.substring()方法 substring

linux 下安装jdk及配置jdk环境图解

linux 下安装jdk及配置jdk环境图解 一:先检测是否已安装了JDK 执行命令: # rpm -qa|grep jdk  或   # rpm -q jdk  或  #find / -name jdk* /soft/openfire_java/jdk-7u40-linux-x64.rpm /usr/java/jdk1.7.0_15 /usr/java/jdk1.7.0_15/jre/lib/servicetag/jdk_header.png /usr/java/jdk1.7.0_15/lib

mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8)

注意: 双击jdk8后, 将 Java 8 Update 05.pkg包拖到Teminal中,可以获得正确的地址, 然后copy该地址替换下文对应的地址,空格等都不能出错.本人已经按照教程跌跌撞撞实验成功. mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8) 在mac x yosemide 系统中不能正常更新jdk到1.7(1.8)的问题,会弹出上面的错误 提示.很多人就在这里会选择放弃他的jdk升级之旅,或者是还原他的mac系统 .其实没那么复杂.来看看我是

二 、在 JDK 6 and JDK 7中 substring() 方法

在JDK6 和JDK 7 里面substring(int beginIndex, int endIndex)的方法是不同的.知道这种区别会帮助你更好用它们.为了简单期间,下面用substring() 来表示 substring(int beginIndex,Int endIndex) 方法. 1. substring()方法做什么substring(int beginIndex,int endIndex)方法返回一个从beginIndex开始,到endIndex-1结束的字符串. String

Java代理之(jdk静态代理/jdk动态代理/cglib动态代理/aop/aspectj)

一.概念 代理是什么呢?举个例子,一个公司是卖摄像头的,但公司不直接跟用户打交道,而是通过代理商跟用户打交道.如果:公司接口中有一个卖产品的方法,那么公司需要实现这个方法,而代理商也必须实现这个方法.如果公司卖多少钱,代理商也卖多少钱,那么代理商就赚不了钱.所以代理商在调用公司的卖方法后,加上自己的利润然后再把产品卖给客户.而客户部直接跟公司打交道,或者客户根本不知道公司的存在,然而客户最终却买到了产品. 专业点说:代理模式是对象的结构型模式,代码模式给某一个对象提供代理,并由代理对象控制原对象

【JDK和Open JDK】平常使用的JDK和Open JDK有什么区别

注意到这个问题,是在CentOS7上安装JDK的时候,查找相关的资料,发现安装JDK之前都需要检查或卸载系统上原生的Open JDK,这才引起了注意. 到了这里,引用查到的一篇说明. 转自:http://fgh2011.iteye.com/blog/1771649 历史上的原因是,openjdk是jdk的开放原始码版本,以GPL协议的形式放出.在JDK7的时候,openjdk已经成为jdk7的主干开 发,sun jdk7是在openjdk7的基础上发布的,其大部分原始码都相同,只有少部分原始码被

解决 Linux 终端 wget 命令下载jdk的问题,jdk在linux下的配置问题

最近在用Linux搭服务器,在下载jdk时取oracle官网找到下载地址,然后用wget + 下载地址 去下载,2秒之后,文件下载好了, 然而查看文件大小,只有800多k,显然有错误,后来查资料才发现这样获取到的网址是不行的.最终琢磨出个办法,管不管用,试一试. 打开要下载的jdk资源的那个页面http://www.oracle.com/technetwork/cn/java/javase/downloads/jdk7-downloads-1880260.html 2.按F12打开浏览器调试界面

mac x Yosemide(10.10) 下安装 jdk 1.7 (jdk 1.8)的方法

当我们想在mac x yosemide 系统中更新jdk到1.7(1.8)的时候,会弹出下面的错误提示 解决这个问题的办法如下: 1.下载 好jdk 1.7(1.8) 地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2.打开下载好的DMG .然后会出现下面的界面 右击拷贝JDK7 Update 60.pkg,然后保存到任意目录,并把JDK7 Update 60.pkg重命名为JDK7.pkg(这里也可以不

【原创】Mac OS X 下同时安装多个版本的JDK(JDK 1.5 ~ JDK 1.8)

虽然 Java 8 的正式版已经发布了两年有余,但目前 Java 企业级应用的主打版本还是 Java 6 和 Java 7,更惨的是公司的一些早期项目还必须在 Java 5 下开发运行,而我还想在工作之余体验+学习 Java 8 的新特性.于是,我需要在我的 Mac 上同时安装 JDK 1.5,JDK 1.6, JDK 1.7 和 JDK 1.8. 过去 Mac 上的 Java 都是由 Apple 自己提供的,但只支持到 Java 6,并且从 OS X 10.7 开始系统不再默认安装了(可选安装