`

JAVA中subString以及split函数等几个函数的用法技巧

 
阅读更多

一、先说一说subString()函数

       subString函数有个陷阱,有可能导致内存泄露(当然,在JDK1.7.0-B147之前这个问题一直存在,在JDK1.7.0_15-b03版本之后这个问题已经修改过来了,至于是具体中间哪个版本修改过来的,本人没有去细看)

       在Java中,字符串是很复杂的一个问题,java有对字符串的优化,比如String POOL 对于SubString这个问题上, java也有自己的想法,比如 

         

String oldStr = "hello,clark";  
String newStr = oldStr.subString(0,4);   

 

对于这个写法,实际上对于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!) 怎么办:  

   
String sub = new String( oldString.substring(0, 4) ); 
  试想:如果你要从某个大文本中直接使用subString截取某一小部分的值然后存到map中,随着程序执行的时间越来越长,那么你的程序距离内存泄漏也就不远了,所以使用subString等函数时还是new String保险起见。
二、再说一说split等几个设计到正则表达式作为参数的函数。
    第一点,split函数底层是调用的subString函数,所有首先存表时自觉注意重新new一个对象。
    第二点,如果你的split函数分割的最后有长度为0的空字符串,那么slipt函数会忽略最后的空串额
比如:
String line = "a,b,c,d,e,f,g,,";
String[] record = line.split(",");
 得到的record数组的长度是7而不是9哦,千万别傻乎乎的直接record[7],record[8]的。不防先判断判断数组的长度。
    第三点,注意特殊字符串的转义。如执行:"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()

    JavaScript几个函数 - split()、join()、substring()和indexOf()的用法!

    php字符串分割函数用法实例

    explode函数通过子字符串进行分割,效率比split要高 split函数语法如下 split(pattern, string) split通过正则表达式对字符串进行分割,效率相对explode要低,但是功能强大 <?php $list = explode("_",...

    hive函数大全(中文版)

    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()函数-附件资源

    通过java实现输入系数求一元二次方程根,学习Scanner()、split()和Substring()函数-附件资源

    几个常用的JavaScript字符串处理函数 - split()、join()、substring()和indexOf()

    几个常用的JavaScript字符串处理函数 split()、join()、substring()和indexOf()

    几个常用的JavaScript字符串处理函数 – split()、join()、substring()和indexOf()

    函数 :split() 功能 :使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=theString.split(”|”); //arr是一个包含字符值”jpg”、”bmp”、”gif”、”ico”和”png”的...

    MySQL里实现类似SPLIT的分割字符串的函数

    下边的函数,实现了象数组一样去处理字符串。 一,用临时表作为数组 代码...>0) begin insert @t(col) values (substring(@c,1,charindex(@split,@c)-1)) set @c = stuff(@c,1,charindex(@split,@c),”) end insert @t

    sqlserver自定义函数

    --按指定符号分割字符串,返回分割后的元素个数,方法很简单,就是看字符串中存在多少个分隔符号,然后再加一,就是要求的结果。 Create function Get_StrArrayLength ( @str varchar(1024), --要分割的字符串 @...

    el函数,el,el表达式,el函数,fn

    11.函数名 函数说明 使用举例 12.fn:contains 判定字符串是否包含另外一个字符串 ${fn:contains(name, searchString)}"> 13.fn:containsIgnoreCase 判定字符串是否包含另外一个字符串(大小写无关) ${fn:...

    javascript函数的解释

    javascript函数的解释,解释了具体函数的功能,一、函数JavaScript函数集合 1.document.write(""); 输出语句 2.JS中的注释为// 3.传统的HTML文档顺序是:document->html->(head,body) 4.一个浏览器窗口中的DOM顺序是:...

    js中substr,substring,indexOf,lastIndexOf,split,replace的用法详解

    substring() 方法用于提取字符串中介于两个指定下标之间的字符。 substr(start,length)表示从start位置开始,截取length长度的字符串 split 将一个字符串分割为子字符串,然后将结果作为字符串数组返回 replace 用于...

    学习DWR JavaScript函数整理

    功能:检查中英文字符的长度 参数:str 要检查的字符串 返回值:字符串的长度 ******************************************/ function checkLength(str) { num=str.length var arr=str.match(/[^\\\\\\\\\\\\\\\...

    SQL里类似SPLIT的分割字符串函数

    一,用临时表作为数组 代码如下: 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

    javascript文档

    Global 对象 是一个固有对象,目的是将全局方法集中在一个对象中。 global 属性 返回一个 Boolean 值,标记正则表达式使用的 global 标志状态 (g)。 大于运算符(>) 比较两个表达式,看一个是否大于另一个。 ...

    BJ IT公司面试题集

    3.写一个函数要求输入一个字符串和一个字符长度,对该字符串进行分隔;(Core Java) 答:函数代码如下: public String[] split(String str, int chars){ int n = (str.length()+ chars - 1)/chars; String ret[]...

    greenplum常用命令

    7)把字符串中某几个连续字符替换成指定字符:overlay('freda' placing 'fsf' from 2 for 4) 8)按照某个字符拆分字符串:split_part('adas|dada|ffr','|',2) 9)手动数据:select * from (values ('a1',3),('a2'...

    人民币小写转大写(Java 实现)

    * 处理带小数的金额,整数部分交由上一个方法处理,小数部分自己处理 * @param integer * @param decimal * @return String * @throws Exception */ public static String praseUpcaseRMB(String integer...

    微软JavaScript手册

    Global 对象 是一个固有对象,目的是将全局方法集中在一个对象中。 global 属性 返回一个 Boolean 值,标记正则表达式使用的 global 标志状态 (g)。 大于运算符(>) 比较两个表达式,看一个是否大于另一个。 ...

Global site tag (gtag.js) - Google Analytics