对于这个写法,实际上对于oldStr是一个char[]数组[h,e,l,l,0,,,c,l,a,r,k],对于subString操作,newStr并不是自己copy oldStr的char[]数组hello自己去创建一个新的char[]数组,而是java在背后进行了String Reusing Optimization,它不会自己创建一个新的char数组,而是reuse原来的char数组。所以了,这样就不会有很多的原来的char[]数组的碎片。但是这个虽然在一般情况是好,不过也是有代价的。根据http://nflath.com/2009/07/the-dangers-of-stringsubstring/上,因为字符串不是自己新建一个char[]数组,而是引用了原来的char[]数组,这样oldStr就无法garbage collected ,因为newStr还是拥有oldStr的char[]数组的引用。这样容易引起Outof Memory 异常。解决办法是了,便是让newStr拥有自己的char[]数组,也就是自己在subString时强迫创建自己的char[]数组,这样就不会有garbage collected 的问题(reachable but unused!) 怎么办:
二、再说一说split等几个设计到正则表达式作为参数的函数。
第一点,split函数底层是调用的subString函数,所有首先存表时自觉注意重新new一个对象。
第二点,如果你的split函数分割的最后有长度为0的空字符串,那么slipt函数会忽略最后的空串额
第三点,注意特殊字符串的转义。如执行:"2|33|4".split("|")
出来的结果是:
""
2
|
3
3
|
4
奇怪吧,不过注意看一下API说明还是知道原因的.
java.lang.string.split
split 方法
将一个字符串分割为子字符串,然后将结果作为字符串数组返回。
stringObj.split([separator,[limit]])
参数
stringObj
必选项。要被分解的 String 对象或文字。该对象不会被 split 方法修改。
separator
可选项。字符串或 正则表达式对象,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,返回包含整个字符串的单一元素数组。
limit
可选项。该值用来限制返回数组中的元素个数。
说明
split 方法的结果是一个字符串数组,在 stingObj 中每个出现 separator 的位置都要进行分解
所以正常的写法是这样的:
1、如果用“.”作为分隔的话,必须是如下写法:String.split("\\."),这样才能正确的分隔开,不能用String.split(".");
2、如果用“|”作为分隔的话,必须是如下写法:String.split("\\|"),这样才能正确的分隔开,不能用String.split("|");
“.”和“|”都是正则表达式中的特殊字符,必须得加"\\"进行转义;
3、如果在一个字符串中有多个分隔符,可以用“|”作为连字符,比如:“a=1 and b =2 or c=3”,把三个都分隔出来,可以用String.split("and|or");
所以到这里正常人都应该联想到string中不止split,还有replaceAll、replaceFrist、matches等几个以正则表达式作为参数时需要将特殊字符转义处理了。
相关推荐
JavaScript几个函数 - split()、join()、substring()和indexOf()的用法!
explode函数通过子字符串进行分割,效率比split要高 split函数语法如下 split(pattern, string) split通过正则表达式对字符串进行分割,效率相对explode要低,但是功能强大 <?php $list = explode("_",...
1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31...
通过java实现输入系数求一元二次方程根,学习Scanner()、split()和Substring()函数-附件资源
几个常用的JavaScript字符串处理函数 split()、join()、substring()和indexOf()
函数 :split() 功能 :使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //arr是一个包含字符值”jpg”、”bmp”、”gif”、”ico”和”png”的...
下边的函数,实现了象数组一样去处理字符串。 一,用临时表作为数组 代码...>0) begin insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) set @c = stuff(@c,1,charindex(@split,@c),”) end insert @t
--按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 Create function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @...
11.函数名 函数说明 使用举例 12.fn:contains 判定字符串是否包含另外一个字符串 ${fn:contains(name, searchString)}"> 13.fn:containsIgnoreCase 判定字符串是否包含另外一个字符串(大小写无关) ${fn:...
javascript函数的解释,解释了具体函数的功能,一、函数JavaScript函数集合 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:...
substring() 方法用于提取字符串中介于两个指定下标之间的字符。 substr(start,length)表示从start位置开始,截取length长度的字符串 split 将一个字符串分割为子字符串,然后将结果作为字符串数组返回 replace 用于...
功能:检查中英文字符的长度 参数:str 要检查的字符串 返回值:字符串的长度 ******************************************/ function checkLength(str) { num=str.length var arr=str.match(/[^\\\\\\\\\\\\\\\...
一,用临时表作为数组 代码如下: create function f...>0) begin insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) set @c = stuff(@c,1,charindex(@split,@c),”) end insert @t(col) values (@c) retu
Global 对象 是一个固有对象,目的是将全局方法集中在一个对象中。 global 属性 返回一个 Boolean 值,标记正则表达式使用的 global 标志状态 (g)。 大于运算符(>) 比较两个表达式,看一个是否大于另一个。 ...
3.写一个函数要求输入一个字符串和一个字符长度,对该字符串进行分隔;(Core Java) 答:函数代码如下: public String[] split(String str, int chars){ int n = (str.length()+ chars - 1)/chars; String ret[]...
7)把字符串中某几个连续字符替换成指定字符:overlay('freda' placing 'fsf' from 2 for 4) 8)按照某个字符拆分字符串:split_part('adas|dada|ffr','|',2) 9)手动数据:select * from (values ('a1',3),('a2'...
* 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理 * @param integer * @param decimal * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer...
Global 对象 是一个固有对象,目的是将全局方法集中在一个对象中。 global 属性 返回一个 Boolean 值,标记正则表达式使用的 global 标志状态 (g)。 大于运算符(>) 比较两个表达式,看一个是否大于另一个。 ...