电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java substring方法實現(xiàn)原理解析

瀏覽:23日期:2022-09-02 10:42:55

substring實現(xiàn)原理

String是Java中一個比較基礎的類,每一個開發(fā)人員都會經(jīng)常接觸到。而且,String也是面試中經(jīng)常會考的知識點。String有很多方法,有些方法比較常用,有些方法不太常用。今天要介紹的subString就是一個比較常用的方法,而且圍繞subString也有很多面試題。

substring(int beginIndex, int endIndex)方法在不同版本的JDK中的實現(xiàn)是不同的。了解他們的區(qū)別可以幫助你更好的使用他。為簡單起見,后文中用substring()代表substring(int beginIndex, int endIndex)方法。

substring()的作用

substring(int beginIndex, int endIndex)方法截取字符串并返回其[beginIndex,endIndex-1]范圍內(nèi)的內(nèi)容。s

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

輸出內(nèi)容:

bc

調(diào)用substring時發(fā)生了什么?

你可能知道,因為x是不可變的,當使用x.substring(1,3)對x賦值的時候,它會指向一個全新的字符串:

Java substring方法實現(xiàn)原理解析

然而,這個圖不是完全正確的表示堆中發(fā)生的事情。因為在jdk6 和 jdk7中調(diào)用substring時發(fā)生的事情并不一樣。

JDK 6中的subString

tring是通過字符數(shù)組實現(xiàn)的。在jdk 6 中,String類包含三個成員變量:char value[], int offset,int count,他們分別用來:存儲真正的字符數(shù)組、存儲數(shù)組的第一個位置索引、存儲字符串中包含的字符個數(shù)。

當調(diào)用substring方法的時候,會創(chuàng)建一個新的string對象,但是這個string的值仍然指向堆中的同一個字符數(shù)組。這兩個對象中只有count和offset 的值是不同的。

Java substring方法實現(xiàn)原理解析

源碼

//JDK 6String(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進行切割,但是由于你實際上引用了整個字符串,這個很長的字符串無法被回收。往小了說,造成了存儲空間的浪費,往大了說,可能造成內(nèi)存泄漏。這個問題已經(jīng)被官方記錄在Java Bug Database里面了:

Java substring方法實現(xiàn)原理解析

相應的解決辦法:

s1 = s1.substring(x,y) + '';

JDK 7 中的substring

上述問題在JDK 7中得到了解決。JDK 7中,substring方法會在堆中創(chuàng)建一個新的數(shù)組。

Java substring方法實現(xiàn)原理解析

源碼

//JDK 7 /** * Allocates a new {@code String} that contains characters from a subarray * of the character array argument. The {@code offset} argument is the * index of the first character of the subarray and the {@code count} * argument specifies the length of the subarray. The contents of the * subarray are copied; subsequent modification of the character array does * not affect the newly created string. * * @param value Array that is the source of characters * @param offset The initial offset * @param count The length * @throws IndexOutOfBoundsException If the {@code offset} and {@code count} arguments index * characters outside the bounds of the {@code value} array */ public String(char value[], int offset, int count) { //check boundary this.value = Arrays.copyOfRange(value, offset, offset + count); } /** * Returns a string that is a substring of this string. The * substring begins at the specified {@code beginIndex} and * extends to the character at index {@code endIndex - 1}. * Thus the length of the substring is {@code endIndex-beginIndex}. * <p> * Examples: * <blockquote><pre> * 'hamburger'.substring(4, 8) returns 'urge' * 'smiles'.substring(1, 5) returns 'mile' * </pre></blockquote> * * @param beginIndex the beginning index, inclusive. * @param endIndex the ending index, exclusive. * @return the specified substring. * @throws IndexOutOfBoundsException if the * {@code beginIndex} is negative, or * {@code endIndex} is larger than the length of * this {@code String} object, or * {@code beginIndex} is larger than * {@code endIndex}. */ public String substring(int beginIndex, int endIndex) { //check boundary int subLen = endIndex - beginIndex; return ((beginIndex == 0) && (endIndex == value.length)) ?this :new String(value, beginIndex, subLen); }

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Java
相關文章:
主站蜘蛛池模板: 江苏全风,高压风机,全风环保风机,全风环形高压风机,防爆高压风机厂家-江苏全风环保科技有限公司(官网) | 校车_校车价格_19座幼儿园校车_幼儿园校车_大鼻子校车 | 济南网站建设_济南网站制作_济南网站设计_济南网站建设公司_富库网络旗下模易宝_模板建站 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 自清洗过滤器,浅层砂过滤器,叠片过滤器厂家-新乡市宇清净化 | 北京易通慧公司从事北京网站优化,北京网络推广、网站建设一站式服务商-北京网站优化公司 | 卫生型双针压力表-高温防腐差压表-安徽康泰电气有限公司 | 上海办公室装修,办公楼装修设计,办公空间设计,企业展厅设计_写艺装饰公司 | 浇钢砖,流钢砖_厂家价低-淄博恒森耐火材料有限公司 | 红外光谱仪维修_二手红外光谱仪_红外压片机_红外附件-天津博精仪器 | 炭黑吸油计_测试仪,单颗粒子硬度仪_ASTM标准炭黑自销-上海贺纳斯仪器仪表有限公司(HITEC中国办事处) | 电动车头盔厂家_赠品头盔_安全帽批发_山东摩托车头盔—临沂承福头盔 | 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 - 杭州标识标牌|文化墙|展厅|导视|户内外广告|发光字|灯箱|铭阳制作公司 | 中药二氧化硫测定仪,食品二氧化硫测定仪|俊腾百科 | 花纹铝板,合金铝卷板,阴极铝板-济南恒诚铝业有限公司 | 化工ERP软件_化工新材料ERP系统_化工新材料MES软件_MES系统-广东顺景软件科技有限公司 | 风电变桨伺服驱动器-风电偏航变桨系统-深圳众城卓越科技有限公司 | 不锈钢复合板|钛复合板|金属复合板|南钢集团安徽金元素复合材料有限公司-官网 | CE认证_产品欧盟ROHS-REACH检测机构-商通检测| 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 无锡网站建设_小程序制作_网站设计公司_无锡网络公司_网站制作 | 深圳昂为官网-气体分析仪,沼气分析仪,动态配气仪,气体传感器厂家 | 大白菜官网,大白菜winpe,大白菜U盘装系统, u盘启动盘制作工具 | 湖州织里童装_女童男童中大童装_款式多尺码全_织里儿童网【官网】-嘉兴嘉乐网络科技有限公司 | HDPE储罐_厂家-山东九州阿丽贝防腐设备 | 新型锤式破碎机_新型圆锥式_新型颚式破碎机_反击式打沙机_锤式制砂机_青州建源机械 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 螺杆式冷水机-低温冷水机厂家-冷冻机-风冷式-水冷式冷水机-上海祝松机械有限公司 | 浇注料-高铝砖耐火砖-郑州凯瑞得窑炉耐火材料有限公司 | 一礼通 (www.yilitong.com)-企业礼品解决方案一站式服务平台 | 酒糟烘干机-豆渣烘干机-薯渣烘干机-糟渣烘干设备厂家-焦作市真节能环保设备科技有限公司 | 气体热式流量计-定量控制流量计(空气流量计厂家)-湖北南控仪表科技有限公司 | 贴板式电磁阀-不锈钢-气动上展式放料阀-上海弗雷西阀门有限公司 工业机械三维动画制作 环保设备原理三维演示动画 自动化装配产线三维动画制作公司-南京燃动数字 | 玻璃钢格栅盖板|玻璃钢盖板|玻璃钢格栅板|树篦子-长沙川皖玻璃钢制品有限公司 | 培训中心-海南香蕉蛋糕加盟店技术翰香原中心官网总部 | 安规_综合测试仪,电器安全性能综合测试仪,低压母线槽安规综合测试仪-青岛合众电子有限公司 | 合肥办公室装修 - 合肥工装公司 - 天思装饰 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 东莞爱加真空科技有限公司-进口真空镀膜机|真空镀膜设备|Polycold维修厂家 | Win10系统下载_32位/64位系统/专业版/纯净版下载 | 宝元数控系统|对刀仪厂家|东莞机器人控制系统|东莞安川伺服-【鑫天驰智能科技】 |