【Java split】split() 函数分割空字符串后数组长度为1的原因以及规避措施(105)

问题现象:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test06 {
	public static void main(String[] args) {
		
		// Java split()函数 分割空字符串长度为1的解释;
		String s2 = "";
		String[] arr2 = s2.split(",");
		System.out.println("arr2.len:"+arr2.length);
		
	}
}

输出:

arr2.len:1

这是为什么?
查看源码:

public String[] split(String regex, int limit) {
        /* fastpath if the regex is a
         * (1) one-char String and this character is not one of the
         *     RegEx's meta characters ".$|()[{^?*+\\", or
         * (2) two-char String and the first char is the backslash and
         *     the second is not the ascii digit or ascii letter.
         */
        char ch = 0;
        if (((regex.length() == 1 &&
             ".$|()[{^?*+\\".indexOf(ch = regex.charAt(0)) == -1) ||
             (regex.length() == 2 &&
              regex.charAt(0) == '\\' &&
              (((ch = regex.charAt(1))-'0')|('9'-ch)) < 0 &&
              ((ch-'a')|('z'-ch)) < 0 &&
              ((ch-'A')|('Z'-ch)) < 0)) &&
            (ch < Character.MIN_HIGH_SURROGATE ||
             ch > Character.MAX_LOW_SURROGATE))
        {
            int off = 0;
            int next = 0;
            boolean limited = limit > 0;
            ArrayList<String> list = new ArrayList<>();
            while ((next = indexOf(ch, off)) != -1) {
                if (!limited || list.size() < limit - 1) {
                    list.add(substring(off, next));
                    off = next + 1;
                } else {    // last one
                    //assert (list.size() == limit - 1);
                    int last = length();
                    list.add(substring(off, last));
                    off = last;
                    break;
                }
            }
            // If no match was found, return this
            if (off == 0)
                return new String[]{this};

            // Add remaining segment
            if (!limited || list.size() < limit)
                list.add(substring(off, length()));

            // Construct result
            int resultSize = list.size();
            if (limit == 0) {
                while (resultSize > 0 && list.get(resultSize - 1).isEmpty()) {
                    resultSize--;
                }
            }
            String[] result = new String[resultSize];
            return list.subList(0, resultSize).toArray(result);
        }
        return Pattern.compile(regex).split(this, limit);
    }

发现问题:

【Java split】split() 函数分割空字符串后数组长度为1的原因以及规避措施(105)_第1张图片
问题原因:当正则表达式匹配不到时,实际返回了一个数组,并且数组里面包含了当前的空字符串,所以就导致结果数组长度为1了;

如何规避:

需判空处理:举例如下;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class test06 {
	public static void main(String[] args) {
		
		// 三元运算生成空集合和空数组;规避split()函数 分割空字符串长度为1的问题;
		String str2 = "";
		//String str2 = "北京,上海,广州";
		String[] str_arr = str2.isEmpty()? new String[]{}:str2.split(",");
		System.out.println("str_arr.len:"+str_arr.length);
		List<String> str_list = str2.isEmpty()? new ArrayList<>():Arrays.asList(str2.split(","));
		System.out.println("str_list.len:"+str_list.size());
		
	}
}

打印输出:

str_arr.len:0
str_list.len:0

问题完美解决!

你可能感兴趣的:(java,java,开发语言)