当前位置: 首页 > news >正文

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

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)的结果时,它指向一个新的字符串,如下所示:
1-1.jpeg
但是,这个图并不完全正确。在调用substring()时发生的事情在JDK 6和JDK 7中是不同的。

3.JDK 6中的substring()

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

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

2-1.jpeg

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

//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()方法实际上是在堆中创建一个新数组。
3-1.jpeg

//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教程

相关文章:

  • 使用事件和消息队列实现分布式事务(转+补充)
  • JFinal极速开发框架使用笔记(三) 分析Model和ActiveRecord
  • 3138 栈练习2
  • innerHTML、html('')与empty在IE上不同的区别
  • 配置tomcat监听80端口、配置tomcat虚拟机、tomcat日志
  • 关于Docker的一些常识
  • linux下tar、zip 压缩文件不带文件路径
  • 【Amaple教程】5. 插件
  • 数值的整数次方
  • 编写高质量iOS与OS X代码的52个有效方法(二)
  • LAMP下安装zabbix流水
  • Redis进阶实践之六Redis Desktop Manager连接Windows和Linux系统上的Redis服务
  • 自适应滤波:最小均方误差滤波器(LMS、NLMS)
  • JVM笔记
  • 游戏化思维:从工具到玩具
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • [数据结构]链表的实现在PHP中
  • canvas 绘制双线技巧
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • Git的一些常用操作
  • java B2B2C 源码多租户电子商城系统-Kafka基本使用介绍
  • JS数组方法汇总
  • JS字符串转数字方法总结
  • MySQL QA
  • spring cloud gateway 源码解析(4)跨域问题处理
  • 包装类对象
  • 翻译:Hystrix - How To Use
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 利用DataURL技术在网页上显示图片
  • 使用Gradle第一次构建Java程序
  • 小试R空间处理新库sf
  • 我们雇佣了一只大猴子...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​卜东波研究员:高观点下的少儿计算思维
  • $.ajax()参数及用法
  • (3)llvm ir转换过程
  • (Matlab)使用竞争神经网络实现数据聚类
  • (二)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (二开)Flink 修改源码拓展 SQL 语法
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (介绍与使用)物联网NodeMCUESP8266(ESP-12F)连接新版onenet mqtt协议实现上传数据(温湿度)和下发指令(控制LED灯)
  • (三)Pytorch快速搭建卷积神经网络模型实现手写数字识别(代码+详细注解)
  • (五)IO流之ByteArrayInput/OutputStream
  • (一)认识微服务
  • (一一四)第九章编程练习
  • (译)计算距离、方位和更多经纬度之间的点
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .md即markdown文件的基本常用编写语法
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Standard 的管理策略
  • .net Stream篇(六)
  • .NET 中 GetProcess 相关方法的性能
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...