资讯专栏INFORMATION COLUMN

JDK 6和JDK 7中的substring()方法

coordinate35 / 2648人阅读

摘要:中的,方法的实现与不同。为了简单起见,方法表示这个帖子中的,。在调用时发生的事情在和中是不同的。中的字符串由后端的数组支持。在中,方法实际上是在堆中创建一个新数组。

JDK 6中的substring(int beginIndex,int endIndex)方法的实现与JDK 7不同。本文解释了这些差异。为了简单起见,substring()方法表示这个帖子中的substring(int beginIndex,int endIndex)。

1.什么是substring()呢?

substring(int beginIndex,int endIndex)方法返回一个以beginIndex开头并以endIndex-1结尾的字符串。

String x =“abcdef”;
x = x.substring(1,3);
的System.out.println(X);

输出:

bc

2.当substring()被调用时会发生什么?

你可能知道,因为x是不可变的,所以当x被赋予x.substring(1,3)的结果时,它指向一个新的字符串,如下所示:

但是,这个图并不完全正确。在调用substring()时发生的事情在JDK 6和JDK 7中是不同的。

3.JDK 6中的substring()

字符串由后端的char数组支持。在JDK 6中,String类包含3个字段:char value [],int offset,int count。它们用于存储真正的字符数组,数组的第一个索引,字符串中的字符数。

当substring()方法被调用时,它会创建一个新的字符串,但是字符串的值仍然指向堆中的同一个数组。两个字符串之间的区别是它们的计数和偏移值。

下面的代码是被简化的,只是解释这个问题的关键点。

//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.由JDK 6中的substring()引起的问题

如果你有一个非常长的字符串,但是你每次只需要使用子字符串()的一小部分。这会导致一个性能问题,因为你只需要一小部分,你就保留了全部。对于JDK 6,解决方案使用以下内容,这将使其指向一个真正的子字符串:

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

5.JDK 7中的substring()

这在JDK 7中得到了改进。在JDK 7中,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);
}

欢迎一起学习探讨:html教程 java基础 css教程

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/68316.html

相关文章

  • Java核心技术教程整理,长期更新

    以下是Java技术栈微信公众号发布的关于 Java 的技术干货,从以下几个方面汇总。 Java 基础篇 Java 集合篇 Java 多线程篇 Java JVM篇 Java 进阶篇 Java 新特性篇 Java 工具篇 Java 书籍篇 Java基础篇 8张图带你轻松温习 Java 知识 Java父类强制转换子类原则 一张图搞清楚 Java 异常机制 通用唯一标识码UUID的介绍及使用 字符串...

    Anchorer 评论0 收藏0
  • Java 面试准备[二]

    摘要:关于字符串的个面试问题和方法是用于比较对象的引用地址的,或者说是否指向同一个变量。线程安全类,内部使用同步机制。另外,还需要尽早考虑多线程,原子性,内存使用量以及性能等因素。所以尽量不要把集合的成员变量暴露给调用者。 关于字符串的10个面试问题 1. == 和 equals()方法 == 是用于比较对象的引用地址的,或者说是否指向同一个变量。 equals是比较对象的真实值的 2...

    feng409 评论0 收藏0
  • Java 学习笔记

    摘要:参考资料程序设计北大唐大仕零基础学语言浙大翁恺面向对象程序设计语言浙大翁恺在里面搜索可以查看和修改快捷键自动补全代码格式化简介历史与一起发展万维网所有信息用链接连接起来静态网页动态网页的出现年开发工具包语法增加广泛动态编译脚本 参考资料 Java程序设计 - 北大 - 唐大仕 零基础学Java语言 - 浙大 - 翁恺 面向对象程序设计——Java语言 - 浙大 - 翁恺 Ecl...

    tianlai 评论0 收藏0
  • Centos-7安装zabbix

    摘要:,初始化完毕。。。解决图形中文乱码把它拷贝到的端的目录下例如,确认后缀为 本例环境使用Centos7.3 64位 安装zabbix需要mysql的支持,下面是快速安装LNMP的方法(使用EZHTTP安装) 安装LNMP 首先创建一个目录存放下载文件: [root@localhost ~]# mkdir /software [root@localhost software]# cd /s...

    charles_paul 评论0 收藏0
  • java学习(五) —— 常用API类概述

    摘要:成员方法类概述用于产生随机数成员方法正则表达式相关方法判断功能分割功能替换功能获取功能和类的使用类概述包含一些有用的类字段和方法。注意它不能被实例化,因为此类构造器是私有的成员方法类类概述表示特定的瞬间,精确到毫秒。 前言 我们都知道,JDK包含了JRE,而JRE中也提供了各种功能的java类,现在我们就对这些类有个简单了解,然后灵活运用。 常用类:Object类/Scanner类,...

    Tecode 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<