`

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等几个以正则表达式作为参数时需要将特殊字符转义处理了。

 

       

分享到:
评论

相关推荐

    SQL server中实现类似split功能的函数

    在SQL Server中,"split功能"通常指的是将一个字符串拆分成多个部分,这在处理以特定分隔符分隔的数据时非常有用。SQL Server并没有内置的`SPLIT`函数,但可以通过其他方式来实现这个功能。下面我们将详细介绍如何在...

    java函数速查

    Java函数速查是一个非常实用的资源,对于程序员来说,它是一个高效的工具,帮助开发者快速查找和理解Java语言中的各种函数用法。这个压缩包可能包含了详细的函数文档、示例代码和可能的分类索引,方便用户按需查找。...

    Java常用函数大全

    Java的`String`类提供了大量方法,如`substring()`截取子串,`indexOf()`查找子串,`trim()`去除空格,`concat()`连接字符串,以及`split()`分割字符串等。开发者可能会根据需求自定义一些额外的实用函数。 3. **...

    JavaScript几个函数 - split()、join()、substring()和indexOf()

    ### JavaScript 函数详解:split()、join()、substring() 和 indexOf() #### 一、split() 方法 **定义与用途:** `split()` 方法用于将一个字符串分割成字符串数组。此方法通过一个指定的分隔符来拆分字符串,并...

    SQL的split函数(自定义)new

    本文介绍了如何在SQL Server环境中实现一个支持Ntext类型字符串输入的自定义Split函数。通过这个函数,我们可以轻松地将大型文本数据分割成多个部分,这对于处理复杂的数据集非常有用。希望本文能对您理解和应用...

    SQL中实现SPLIT函数几种方法总结(必看篇)

    这里我们将讨论两种在SQL中实现SPLIT函数的方法。 **方法1** 首先,我们来看第一种实现方式,创建名为`f_split`的用户定义函数(UDF)。这个函数接受两个参数:`@SourceSql`是要被分割的字符串,`@StrSeprate`是...

    java读取文件内容的函数

    本文将深入探讨一个用于读取文件内容的Java函数,同时分析其工作原理、潜在问题以及如何使用该函数来处理文件数据。 ### 函数定义与解析 首先,我们来看函数的定义: ```java public static String readFile...

    db2字符串分隔,函数,过程的使用

    总的来说,理解和掌握DB2中的字符串分隔函数、字符串函数以及过程的使用,对于日常的数据处理工作至关重要。它们能够帮助我们有效地操作和管理数据库中的字符串数据,提高工作效率。在实际应用中,应根据具体场景...

    java编写一个截取字符串的函数,输入为一个字符串和字节数.docx

    Java 中有多种方式可以实现字符串截取,包括使用 `substring`、`split` 和 `StringTokenizer` 等方法。在本例中,我们使用 `substring` 方法来实现字符串截取。 substring 方法 `substring` 方法用于从字符串中...

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

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

    sql实现split函数的脚本

    SQL实现Split函数的脚本是指使用SQL语言创建一个函数,以实现将一个字符串按照指定的分隔符拆分成多个子字符串,并将其返回为一个表的形式。下面是该函数的详细介绍。 函数定义 首先,我们需要定义一个函数,函数...

    hive函数大全(中文版)

    1. 个数统计函数: count 29 2. 总和统计函数: sum 29 3. 平均值统计函数: avg 30 4. 最小值统计函数: min 30 5. 最大值统计函数: max 30 6. 非空集合总体变量函数: var_pop 30 7. 非空集合样本变量函数: var_samp 31...

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

    你可以使用这个函数来分割字符串,例如`SELECT * FROM dbo.f_split('dfkd,dfdkdf,dfdkf,dffjk', ',')`,这将返回一个包含所有分隔元素的表。 其次,如果你只需要知道一个字符串中有多少个分隔符,可以创建一个函数...

    C#对各种字符串的操作,及函数使用方法的实例

    根据给定的文件标题、描述、标签以及部分内容,本文将深入探讨C#中字符串操作及其函数使用方法。在C#编程语言中,字符串是极为重要的数据类型,它们用于存储和处理文本信息。C#提供了丰富的内置函数和方法来操作字符...

    一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载.zip

    在IT行业中,尤其是在大数据处理领域,Hive是一个广泛使用的数据仓库工具,它允许用户通过SQL-like语法查询和管理大规模的数据集。"一些有用的自定义配置单元udf函数、特殊数组、json、数学、字符串函数。___下载....

    AxureRP8.0函数大全Axure函数手册用法及说明.pdf

    `length`、`charAt(index)`、`charCodeAt(index)`、`concat()`、`indexOf()`、`lastIndexOf()`、`replace()`、`slice()`、`split()`、`substr()`、`substring()`、`toLowerCase()`、`toUpperCase()` 和 `trim()` ...

    C#中字符串操作函数

    第二个`CutString`函数则更为简单,它直接通过`Substring`方法来截取字符串,如果输入字符串的长度超过指定长度,则返回前`len`个字符加上一个省略号。这通常用于显示预览或限制文本的显示长度。 ### 2. 字符串长度...

    mysql函数split功能实现

    在MySQL数据库中,`SPLIT`函数并不是内置的函数,但我们可以使用其他方式来实现类似的功能,即字符串分隔。通常,我们用`SUBSTRING_INDEX()`或`REGEXP_REPLACE()`结合`FIND_IN_SET()`来分割字符串。这些函数在处理...

    hive函数大全

    - 分割字符串函数“split”,集合查找函数“find_in_set”。 八、集合统计函数 集合统计函数用于进行数据的统计分析。 - 个数统计函数“count”,总和统计函数“sum”。 - 平均值统计函数“avg”,最小值统计函数...

Global site tag (gtag.js) - Google Analytics