`
tjuking
  • 浏览: 195013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java中String的split()方法的一些疑问和试验

    博客分类:
  • Java
阅读更多
public String[] split(String regex, int limit)

 split函数是用于使用特定的切割符(regex)来分隔字符串成一个字符串数组,这里我就不讨论第二个参数(可选)的含义详见官方API说明

 

我在做项目期间曾经遇到一个“bug”,就是当split函数处理空字符串时,返回数组的数组竟然有值。。。查完API才发现就是这么规定的。

官方API 写道
If the expression does not match any part of the input then the resulting array has just one element, namely this string.

 原来我不能小看空字符串,它也是字符串的一种,当split函数没有发现匹配的分隔符时,返回数组就只包含一个元素(该字符串本身)。以为这样就结束了,幸亏我做了几个试验,忽然又发现了一些问题,代码如下:

public class Split {

	public static void main(String[] args) {
		String str1 = "a-b";		
		String str2 = "a-b-";
		String str3 = "-a-b";
		String str4 = "-a-b-";
		String str5 = "a";
		String str6 = "-";
		String str7 = "--";
		String str8 = "";	//等同于new String()
		
		getSplitLen(str1);
		getSplitLen(str2);
		getSplitLen(str3);
		getSplitLen(str4);
		getSplitLen(str5);
		getSplitLen(str6);
		getSplitLen(str7);
		getSplitLen(str8);
	}
	
	public static void getSplitLen(String demo){
		String[] array = demo.split("-");
		int len = array.length;
		System.out.print("\"" + demo + "\"长度为:" + len);
		if(len >= 0){
			for(int i=0; i<len; i++){
				System.out.print(" \""+array[i]+"\"");
			}			
		}
		System.out.println();
	}

}

 运行结果:

"a-b"长度为:2 "a" "b"
"a-b-"长度为:2 "a" "b"
"-a-b"长度为:3 "" "a" "b"
"-a-b-"长度为:3 "" "a" "b"
"a"长度为:1 "a"
"-"长度为:0
"--"长度为:0
""长度为:1 ""

 

和我想的还是不大一样,因为不知道源码也不知道具体是怎么实现的,我的理解如下:

  1. 当字符串只包含分隔符,返回数组没有元素;
  2. 当字符串不包含分隔符时,返回数组只包含一个元素(该字符串本身);
  3. 字符串最尾部出现的分隔符可以看成不存在,不影响字符串的分隔;
  4. 字符串最前端出现的分隔符将分隔出一个空字符串以及剩下的部分的正常分隔;

 

javascript也有split()函数,我想应该也是类似的,还没有来得及尝试。

1
1
分享到:
评论
5 楼 xuxiaoyinliu 2015-12-09  
我也遇到这个问题了,感谢你的总结,很有帮助
4 楼 cuisuqiang 2012-05-03  
小问题,处理时判断即可
3 楼 jyjava 2012-05-02  
你可以在split之前进行indexof判读
2 楼 yuxuan1215 2012-05-02  
java中的实现是这样的
1.这个是String类里的split方法
public String[] split(String regex, int limit) {
return Pattern.compile(regex).split(this, limit);
    }

2Pattern.compile(regex)如下
public static Pattern compile(String regex) {
        return new Pattern(regex, 0);
    }
3上一步new pattern
private Pattern(String p, int f) {
        pattern = p;
        flags = f;

        // Reset group index count
        capturingGroupCount = 1;
        localCount = 0;

        if (pattern.length() > 0) {
            compile();
        } else {
            root = new Start(lastAccept);
            matchRoot = lastAccept;
        }
    }

4上面几步效率应该还是挺低的
  public String[] split(CharSequence input, int limit) {
        int index = 0;
        boolean matchLimited = limit > 0;
        ArrayList<String> matchList = new ArrayList<String>();
        Matcher m = matcher(input);

        // Add segments before each match found
        while(m.find()) {
            if (!matchLimited || matchList.size() < limit - 1) {
                String match = input.subSequence(index, m.start()).toString();
                matchList.add(match);
                index = m.end();
            } else if (matchList.size() == limit - 1) { // last one
                String match = input.subSequence(index,
                                                 input.length()).toString();
                matchList.add(match);
                index = m.end();
            }
        }

        // If no match was found, return this
        if (index == 0)
            return new String[] {input.toString()};

        // Add remaining segment
        if (!matchLimited || matchList.size() < limit)
            matchList.add(input.subSequence(index, input.length()).toString());

        // Construct result
        int resultSize = matchList.size();
        if (limit == 0)
            while (resultSize > 0 && matchList.get(resultSize-1).equals(""))
                resultSize--;
        String[] result = new String[resultSize];
        return matchList.subList(0, resultSize).toArray(result);
    }
1 楼 NARUTOSJP 2012-05-02  
我觉的如果有字符串的话,就把“”这两个省略掉了,故是0开始,如果没有字符串的话,就把“”这两个当成字符串,故是01,所以返回值为1,当然这只是我的猜想。

相关推荐

    83.java中String构造方法.zip

    83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...

    85.java中String构造方法.zip

    85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中...

    java的String[] split 示例

    在Java编程语言中,`String`类提供了许多用于操作字符串的方法,其中之一便是`split`方法。这个方法在处理文本数据时极为有用,特别是在需要根据特定的分隔符将字符串分割成多个子串的情况下。下面,我们将深入探讨`...

    java中String类型转换方法.pdf

    Java 中 String 类型转换方法 Java 中 String 类型转换方法是一种常见的编程...Java 中 String 类型转换方法有多种形式,每种形式都有其特点和应用场景,掌握这些方法可以帮助开发者更好地进行数据类型之间的转换。

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义...String 类的 intern 方法和 split 方法都是非常重要的方法,它们可以帮助我们更好地处理字符串操作,避免内存的浪费,提高程序的性能。

    Java中String类中的常用方法.TXT

    简单总结可以下Java中String类中的常用方法

    java中的split的用法

    `split`方法是Java `String`类中的一个成员方法,其主要功能是从当前字符串中根据指定的正则表达式进行分割,并返回一个字符串数组。这意味着我们可以使用它来按照特定的分隔符或者模式将字符串拆分成多个子串。 ##...

    java中的String类常用方法解析(一)

    本文将深入解析`String`类的一些常用方法,帮助开发者更好地理解和使用这个核心类。 1. **构造方法** - `String()`:创建一个空字符串。 - `String(char[] value)`:根据字符数组创建字符串。 - `String(String ...

    介绍java中String类的方法

    Java中的String类是编程中非常基础且重要的一个类,它代表不可变的字符序列,即一旦创建...掌握这些基本的String类知识和方法对于Java编程至关重要,它们在日常开发中被广泛应用,理解并熟练运用能提高代码质量和效率。

    java基础String类选择题练习题

    综上所述,这份Java基础String类选择题练习题主要覆盖了String和StringBuffer类的基础概念、基本操作方法以及它们之间的区别等内容。通过这些练习题,学习者可以更好地理解和掌握这两个类的使用方法,为实际编程工作...

    Java字符串分隔方法split实践

    `split()`方法位于`java.lang.String`类中,它的基本语法如下: ```java public String[] split(String regex) ``` 这里的`regex`参数是一个正则表达式,用于定义分隔字符串的规则。正则表达式是一种强大的文本...

    String.split()方法使用总结

    `String.split()`方法是Java开发者工具箱中不可或缺的一部分,它不仅提供了基本的字符串分割功能,还支持复杂的正则表达式,使得数据解析变得更加灵活和强大。然而,正如任何强大的工具一样,理解和掌握其背后的原理...

    Java中Split的用法及注意

    Java 中的 Split 方法是通过正则表达式来拆分字符串的,它可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回。该方法的语法为 `stringObj.split(regex, [limit])`,其中 `stringObj` 是要被分解的字符...

    86.java中String对象的特点.zip

    86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点....

    java中String类型和int类型比较及相互转换

    本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...

    JAVA String.format方法使用介绍

    在JDK1.5中,String类增加了一个非常有用的静态函数format(String format, Objece... argues),可以将各类数据格式化为字符串并输出。其中format参数指定了输出的格式,是最复杂也是最难掌握的一点,而argues则是一...

    java中string和int型的相互转换.doc

    Java 中的 String 和 int 类型的相互转换是一个基本的数据类型转换操作,我们可以使用多种方法来实现这种转换,例如使用 `Integer.parseInt()` 方法、`Integer.valueOf()` 方法、`String.valueOf()` 方法等。...

    String split函数

    String split函数是 Java 中 String 类的一种常用函数,用于将一个字符串分割为子字符串,并将结果作为字符串数组返回。在实际开发中,String split函数经常被用于数据处理和字符串操作。本文将详细介绍 String ...

Global site tag (gtag.js) - Google Analytics