返回顶部
首页 > 资讯 > 精选 >Java 中substring()的工作原理是什么
  • 750
分享到

Java 中substring()的工作原理是什么

2023-06-16 17:06:48 750人浏览 泡泡鱼
摘要

本篇文章给大家分享的是有关Java 中substring()的工作原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、substring() 是干嘛

本篇文章给大家分享的是有关Java 中substring()的工作原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

1、substring() 是干嘛的

sub是 subtract 的缩写,因此 substring  的字面意思就是“把字符串做个减法”。这样一分析,是不是感觉方法的命名还是蛮有讲究的?

substring() 的完整写法是 substring(int beginIndex, int  endIndex)。该方法返回一个新的字符串,介于原有字符串的起始下标 beginIndex 和结尾下标 endIndex-1 之间。

String cmower = "沉默王二,一枚有趣的程序员"; cmower = cmower.substring(0, 4); System.out.println(cmower);

程序输出的结果为:

沉默王二

为什么呢?我来简单解释一下。

Java 的下标都是从 0 开始编号的(我不确定有没有从 1 开始的编程语言),这和我们平常生活中从 1 开始编号的习惯不同。Java  这样做的原因如下:

Java 是基于 C 语言实现的,而 C 语言的下标是从 0  开始的——这听起来好像是一句废话。真正的原因是下标并不是下标,在指针(C)语言中,它实际上是一个偏移量,距离开始位置的一个偏移量。第一个元素在开头,因此它的偏移量就为  0。

此外,还有另外一种说法。早期的计算机资源比较匮乏,0 作为起始下标相比较于 1 作为起始下标,编译的效率更高。

知道了这层原因后,再来看上面这段代码,就会豁然开朗。对于“沉默王二,一枚有趣的程序员”这串字符来说,“沉”的下标为 0,“默”的下标为 1,“王”的下标为  2,“二”的下标为 3,所以 cmower.substring(0, 4) 返回的字符串是“沉默王二”——包括起始下标但不包括结尾下标。

2、substring() 在被调用的时候究竟发生了什么?

在此之前,我们已经了解到:字符串是不可变的,因此当调用 substring()  方法的时候,返回的其实是一个新的字符串。那么变量 cmower 的地址引用就会发生如下图所示的变化。

Java 中substring()的工作原理是什么

为了证明上图是完全正确的,我们来看一下 jdk 7 中 substring() 的源码

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

可以看得出,substring() 通过 new String() 返回了一个新的字符串对象,在创建新的对象时通过  Arrays.copyOfRange() 复制了一个新的字符数组

但 JDK 6 就有所不同。说到 JDK 6,可能有些读者表示不服,JDK 6?什么年代了,JDK 13 都出来了好不好?但我想告诉大家的是,对比着剖析  JDK 的源码,对学习大有裨益。

不是有那么一句话嘛,要想了解一个成功人士,不能只关注他发迹以后的事,更要关注他之前做了什么。

就请随我来,看看 JDK 6 中的 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); }

substring() 方法本身和 JDK 7 并没有很大的差别,都通过 new String() 返回了一个新的字符串对象。但是 String()  这个构造函数有很大的差别,JDK 6 只是简单地更改了一下两个属性(offset 和 count)的值,value 并没有变。

PS:value 是真正存储字符的数组,offset 是数组中第一个元素的下标,count 是数组中字符的个数。

这意味着什么呢?

调用 substring() 的时候虽然创建了新的字符串,但字符串的值仍然指向的是内存中的同一个数组,如下图所示。

Java 中substring()的工作原理是什么

3、为什么 JDK 7 的构造函数发生了变化

看了 JDK 6 和 JDK 7 源码之后,大家可能产生这样一个疑惑:为什么 JDK 7  要做出改变呢?大家共用同一个字符串数组不是挺好的嘛,省得占用新的内存空间。事实上呢?

如果有一个很长很长的字符串,可以绕地球一周,当我们需要调用 substring()  截取其中很小一段字符串时,就有可能导致性能问题。由于这一小段字符串引用了整个很长很长的字符数组,就导致很长很长的这个字符数组无法被回收,内存一直被占用着,就有可能引发内存泄露。

PS:内存泄露是指由于疏忽或错误造成程序未能释放已经不再使用的内存。

那 JDK 7 出现之前,这个隐患怎么应对呢?答案如下。

cmower = cmower.substring(0, 4) + "";

为什么,为什么,为什么,多一个 “+ ""” 就能解决内存泄漏的问题?有些读者可能不太相信,我来带大家分析一下。

首先呢,我们通过 JAD 对字节码反编译一下,上面这行代码就变成了如下内容。

cmower = (new StringBuilder(String.valueOf(cmower.substring(0, 4)))).toString();

“+”号操作符就相当于一个语法糖,加上空的字符串后,会被 JDK 转化为 StringBuilder  对象,该对象在处理字符串的时候会生成新的字符数组,所以 cmower = cmower.substring(0, 4) + ""; 这行代码执行后,cmower  就指向了和 substring() 调用之前不同的字符数组。

以上就是Java 中substring()的工作原理是什么,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注编程网精选频道。

--结束END--

本文标题: Java 中substring()的工作原理是什么

本文链接: https://lsjlt.com/news/284553.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java 中substring()的工作原理是什么
    本篇文章给大家分享的是有关Java 中substring()的工作原理是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。1、substring() 是干嘛...
    99+
    2023-06-16
  • java session的工作原理是什么
    Java中的Session是一种用于在服务器端存储用户数据的机制。它的工作原理如下:1. 当用户第一次访问服务器时,服务器会为该用户...
    99+
    2023-09-20
    java
  • java servlet的工作原理是什么
    Java Servlet是一种用于在服务器上处理客户端请求的Java程序。它的工作原理如下:1. 客户端发送HTTP请求到服务器。这...
    99+
    2023-09-25
    java servlet
  • java servlet工作原理是什么
    Java Servlet是一种Java编程语言的类,用于扩展服务器功能的组件。它是在服务器端运行的,用于处理客户端请求并生成响应。S...
    99+
    2023-08-31
    java servlet
  • Java NIO的ByteBuffer工作原理是什么
    这篇文章给大家介绍Java NIO的ByteBuffer工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。1 APINetty 的数据处理 API 通过两个组件暴露——抽象类ByteBuf 和 接口 Byte...
    99+
    2023-06-15
  • java jbpm工作流的原理是什么
    jBPM(Java Business Process Management)是一个基于Java的开源工作流引擎,它用于执行和管理业务...
    99+
    2023-09-09
    java
  • java activity工作流的原理是什么
    Java Activity工作流的原理是基于BPMN(Business Process Model and Notation)的标准...
    99+
    2023-10-10
    java
  • Java工作流Activity的原理是什么
    Java工作流Activity的原理是基于活动(Activity)的概念。活动是业务中的具体操作或步骤,可以是一个服务、一个任务或者...
    99+
    2023-10-19
    Java
  • java连接池的工作原理是什么
    连接池是一种管理数据库连接的技术,它在应用程序初始化时创建一定数量的数据库连接并保存在连接池中,应用程序需要数据库连接时,直接从连接...
    99+
    2023-09-13
    java
  • java过滤器的工作原理是什么
    Java过滤器的工作原理是基于Servlet规范中的过滤器接口(javax.servlet.Filter)来实现的。过滤器可以用于在...
    99+
    2023-08-26
    java
  • java读写锁的工作原理是什么
    读写锁是一种特殊的锁机制,允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。读写锁的工作原理如下: 当一个线程想要读取...
    99+
    2024-04-03
    java
  • Java内存的原型及工作原理是什么
    这篇文章给大家介绍Java内存的原型及工作原理是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。主要通过分析Java内存分配的栈、堆以以及常量池详细的讲解了其的工作原理。一、java虚拟机内存原型寄存器:我们在程序中...
    99+
    2023-06-17
  • Angular中zone.js的工作原理是什么
    这篇文章主要介绍“Angular中zone.js的工作原理是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Angular中zone.js的工作原理是什么”文章能...
    99+
    2024-04-02
  • python中WSGI的工作原理是什么
    这篇文章将为大家详细讲解有关python中WSGI的工作原理是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。python可以做什么Python是一种编程语言,内置了许多有效的工具,Python几乎无所...
    99+
    2023-06-14
  • Android中的SurfaceFlinger工作原理是什么
    这篇文章将为大家详细讲解有关Android中的SurfaceFlinger工作原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念SurfaceFlinger是一个系统服务,如:au...
    99+
    2023-06-22
  • Android中AsyncTask的工作原理是什么
    这篇文章给大家分享的是有关Android中AsyncTask的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTa...
    99+
    2023-06-15
  • PHP中Opcache的工作原理是什么
    小编给大家分享一下PHP中Opcache的工作原理是什么,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!PHP项目中,尤其是在高并发大流量的场景中,如何提升PHP的响应时间,是一项十分重要的工作。而Opcache又是优化PH...
    99+
    2023-06-22
  • c#中filter的工作原理是什么
    在C#中,filter通常指的是LINQ中的Where方法,用于筛选集合中符合条件的元素。其工作原理是通过传入一个谓词(P...
    99+
    2024-04-02
  • HashMap的工作原理是什么
    原理介绍如下:HashMap是基于Hash算法实现的。(在线学习视频教程分享:java视频教程)在使用put(key,value)方法时,HashMap会根据key.hashCode()方法得出key的hash值,然后根据hash值找到对应...
    99+
    2019-10-28
    java入门 HashMap
  • Git的工作原理是什么
    这篇文章主要讲解了“Git的工作原理是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Git的工作原理是什么”吧!本文图解Git中的最常用命令。如果你稍微理解Git的工作原理,这篇文章能够...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作