我们知道,对于一个较大的String对象假设从中获取一个子串。jdk默认子串的char[]是共享原串的char[]。即子串的char[]是原串的char[]中的一部分,

这样对于一个原串多个子串的情况能够节省非常大空间。

可是也正是由于共享,假设一个非常大的原串在获取一个非常小的子串后,原串不再须要,却由于子串共享了char[]一直不能释放,在非常多时候造成相反

的结果。甚至出现性能上的问题:

參见:https://code.google.com/p/mybatis/issues/detail?id=760

要解决这种情况 ,在jdk6中,我们仅仅能在获取子串后又一次new一个子串的新串使用,以使原串的char[]不再被引用从而高速释放:

String src = "abcdefghijklmnopqrstuvwxyz1234567890-=";

String sub = src.substring(1,4);

sub = new String(sub);

...................................

use sub

这种方式代码晦涩,问题难查。jdk7去掉共享。同一时候jdk7优化了拷贝,利用cpu的simd指令。大部分场景下。jdk7字符串性能是比jdk6好的:

 1950       public String substring(int beginIndex, int endIndex) {
1951 if (beginIndex < 0) {
1952 throw new StringIndexOutOfBoundsException(beginIndex);
1953 }
1954 if (endIndex > count) {
1955 throw new StringIndexOutOfBoundsException(endIndex);
1956 }
1957 if (beginIndex > endIndex) {
1958 throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
1959 }
1960 return ((beginIndex == 0) && (endIndex == count)) ? this :
1961 new String(offset + beginIndex, endIndex - beginIndex, value);
1962 }

关于substring的char[]共享的更多相关文章

  1. 459. Repeated Substring Pattern

    https://leetcode.com/problems/repeated-substring-pattern/#/description Given a non-empty string chec ...

  2. Leetcode:Substring with Concatenation of All Words分析和实现

    题目大意是传入一个字符串s和一个字符串数组words,其中words中的所有字符串均等长.要在s中找所有的索引index,使得以s[index]为起始字符的长为words中字符串总长的s的子串是由wo ...

  3. C++程序设计基础

    01 1 预编译常用的有,宏定义和包含库.2 库:是实用工具的集和,由程序员编写,可以完成一些特定的功能.3 <> 系统库 ""用户自定义库.4 宏定义:定义符号常量, ...

  4. java学习笔记(详细)

    java平台 1.J2SE java开发平台标准版 2.J2EE java开发平台企业版 java程序需要在虚拟机上才可以运行,换言之只要有虚拟机的系统都可以运行java程序.不同系统上要安装对应的虚 ...

  5. 转 sql注入

    1.判断有无注入点 ; and 1=1 and 1=2 2.猜表一般的表的名称无非是admin adminuser user pass password 等.. and 0<>(selec ...

  6. Java String 综述(上篇)

    摘要: Java 中的 String类 是我们日常开发中使用最为频繁的一个类,但要想真正掌握的这个类却不是一件容易的事情.笔者为了还原String类的真实全貌,先分为上.下两篇博文来综述Java中的S ...

  7. String 既然能做性能调优,我直呼内行

    码哥,String 还能优化啥?你是不是框我? 莫慌,今天给大家见识一下不一样的 String,从根上拿捏直达 G 点. 并且码哥分享一个例子:通过性能调优我们能实现百兆内存轻松存储几十 G 数据. ...

  8. 求CRC校验和的低位和高位的两种方式

    方式1 unsigned ; // 校验和 ]; memcpy(tstCRCChecksum,&shrCRCCheckSum,); // shrCRCCheckSum:216D LOGI(]) ...

  9. WPF: 读取XPS文件或将word、txt文件转化为XPS文件

    读取XPS格式文件或将doc,txt文件转化为XPS文件,效果图如下: 1.XAML页面代码: <Window x:Class="WpfWord.MainWindow" xm ...

随机推荐

  1. 创建模态提醒窗口(UIAlertView)

    UIAlertView类创建一个简单的模态提醒窗口,可能包含消息.按钮以及文本框.模态UI元素要求用户必须与之交互(通常是按下按钮)后才能做其它事情.它们通常位于其他窗口前面,在可见时禁止用户与其他任 ...

  2. Python协程(上)

    几个概念: event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数注册到事件循环上.当满足事件发生的时候,调用相应的协程函数. coroutine 协程:协程对象,指一个使用asy ...

  3. 【UOJ #107】【APIO 2013】ROBOTS

    http://uoj.ac/problem/107 设\(f(l,r,i,j)\)表示\([l,r]\)中的机器人聚集到\((i,j)\)需要花的最小操作数. \(f(l,r,i,j)=\min\le ...

  4. 51Nod1962 区间计数

    这题与之前那道区间最值的题非常类似,依旧是二分区间,然后统计跨过中间点的区间贡献. 我们要选出小于等于和小于的,这样就可以算出相等的区间长了. 复杂度O(nlogn) By:大奕哥 #include& ...

  5. 【20181027T2】易水决【贪心+堆】

    原题:loj6035 [错解] 全肝T1了没怎么想 [正解] 一眼贪心 先考虑\(b_i=0\)怎么做 可以模拟一个正常人的思维 开一个堆,记录每个任务需要的时间(包括等待),每次从中取出一个任务,表 ...

  6. hdu 4276 树形dp

    题意:给你n个点,n-1条边构成树,每条边有边权(表示走每条边的时间),每个点有点权,问在时间T从点1走到点n,能够得到最多的点权有多少. 题目链接:点我 由于是树,最优的结果一定经过最短路,其他边要 ...

  7. 初涉springboot(二)

    概述 1.环境说明 2.HelloWorld项目细节   3.小结 一. 关于环境补充 在上一篇的HellWorld项目中,我们构建SpringBoot项目,采用的是jdk1.8版本,springbo ...

  8. bzoj1003 trans DP

    最初的印象是网络流之类的东西,但好像不是. 想了一下,没什么思路,就网上看了一下,有人说是DP,然后就自己想DP的做法,最开始想的状态是:dp[n][s] 第n天走s这条路,前n天最小的代价,但发现路 ...

  9. 2013新mac air直接安装windowns系统无法下一步 键盘鼠标失灵 无法新建分区提示gpt分区解决方案

    今天同学拿来了2013款MacbookAir,叫我帮忙装一个Win7系统,保留原来的Mac系统,于是开工.按照教程,准备一个8g的U盘,先进入Air自带的Mac系统(俗称”小牛”),将Win7旗舰版6 ...

  10. ExtJS表格——行号、复选框、选择模型

    本篇的内容是为表格添加行号,和复选框,最后谈一下Ext的选择模型.内容比较简单,就直接上代码了.一. 设置行号   行号的设置主要问题在于删除某一行后需要重新计算行号  Ext.onReady(fun ...