当前位置: 首页 > 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笔记
  • 游戏化思维:从工具到玩具
  • Akka系列(七):Actor持久化之Akka persistence
  • Date型的使用
  • gops —— Go 程序诊断分析工具
  • js操作时间(持续更新)
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • ng6--错误信息小结(持续更新)
  • Promise面试题,控制异步流程
  • uni-app项目数字滚动
  • 成为一名优秀的Developer的书单
  • 从0实现一个tiny react(三)生命周期
  • 翻译:Hystrix - How To Use
  • 什么是Javascript函数节流?
  • 使用API自动生成工具优化前端工作流
  • 系统认识JavaScript正则表达式
  • 怎么把视频里的音乐提取出来
  • Mac 上flink的安装与启动
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • #define,static,const,三种常量的区别
  • $.ajax()方法详解
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (2022版)一套教程搞定k8s安装到实战 | RBAC
  • (C++17) optional的使用
  • (教学思路 C#之类三)方法参数类型(ref、out、parmas)
  • (力扣)循环队列的实现与详解(C语言)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (十三)Java springcloud B2B2C o2o多用户商城 springcloud架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)...
  • (万字长文)Spring的核心知识尽揽其中
  • (转)ORM
  • (转)机器学习的数学基础(1)--Dirichlet分布
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .bat文件调用java类的main方法
  • .Net各种迷惑命名解释
  • /etc/fstab和/etc/mtab的区别
  • ::
  • [ linux ] linux 命令英文全称及解释
  • [20190113]四校联考
  • [30期] 我的学习方法
  • [AIGC] Nacos:一个简单 yet powerful 的配置中心和服务注册中心
  • [Android]使用Retrofit进行网络请求