CSDN-CSDN社区-Java-Web 开发

收藏 一半 以上的java程序员都不知道的问题[问题点数:20,结帖人:dsgdsg]

  • dsgdsg
  • 等 级:
  • 结帖率:
楼主发表于:2009-07-02 13:31:23
String aaa = "##";
String bbb[] = aaa.split("#");
String ccc = "## ";
String ddd[] = ccc.split("#");
                System.out.println(bbb.length);//0
System.out.println(ddd.length);//3
why?
回复次数:93
  • sd5816690用户头像
  • sd5816690
  • (神仙?妖怪?谢谢!)
  • 等 级:
#1楼 得分:10回复于:2009-07-02 13:44:00
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素

对于 aaa = "##" 来说,最后一个是 "" 所以 length = 0
对于 bbb = "## " 来说,最后一个是 " " 所以 length = 3

如果想将空字符串也记录,需要用 String[] java.lang.String.split(String regex, int limit)

---------------------------------------------------------------------------------------
String[] java.lang.String.split(String regex)

split
public String[] split(String regex)
Splits this string around matches of the given regular expression.
This method works as if by invoking the two-argument split method with the given expression and a limit argument of zero. Trailing empty strings are therefore not included in the resulting array.

The string "boo:and:foo", for example, yields the following results with these expressions:

Regex Result
: { "boo", "and", "foo" }
o { "b", "", ":and:f" }


Parameters:
regex - the delimiting regular expression
Returns:
the array of strings computed by splitting this string around matches of the given regular expression
Throws:
PatternSyntaxException - if the regular expression's syntax is invalid
Since:
1.4
See Also:
Pattern
--------------------------------------------------------------------------------


String[] java.lang.String.split(String regex, int limit)

split
public String[] split(String regex,
                      int limit)
Splits this string around matches of the given regular expression.
The array returned by this method contains each substring of this string that is terminated by another substring that matches the given expression or is terminated by the end of the string. The substrings in the array are in the order in which they occur in this string. If the expression does not match any part of the input then the resulting array has just one element, namely this string.

The limit parameter controls the number of times the pattern is applied and therefore affects the length of the resulting array. If the limit n is greater than zero then the pattern will be applied at most n - 1 times, the array's length will be no greater than n, and the array's last entry will contain all input beyond the last matched delimiter. If n is non-positive then the pattern will be applied as many times as possible and the array can have any length. If n is zero then the pattern will be applied as many times as possible, the array can have any length, and trailing empty strings will be discarded.

The string "boo:and:foo", for example, yields the following results with these parameters:

Regex Limit Result
: 2 { "boo", "and:foo" }
: 5 { "boo", "and", "foo" }
: -2 { "boo", "and", "foo" }
o 5 { "b", "", ":and:f", "", "" }
o -2 { "b", "", ":and:f", "", "" }
o 0 { "b", "", ":and:f" }

An invocation of this method of the form str.split(regex, n) yields the same result as the expression

Pattern.compile(regex).split(str, n)

Parameters:
regex - the delimiting regular expression
limit - the result threshold, as described above
Returns:
the array of strings computed by splitting this string around matches of the given regular expression
Throws:
PatternSyntaxException - if the regular expression's syntax is invalid
Since:
1.4
See Also:
Pattern
--------------------------------------------------------------------------------
#2楼 得分:0回复于:2009-07-02 13:51:56
引用 1 楼 sd5816690 的回复:
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素

对于 aaa = "##" 来说,最后一个是 "" 所以 length = 0
对于 bbb = "## " 来说,最后一个是 " " 所以 length = 3

如果想将空字符串也记录,需要用 String[] java.lang.String.split(String regex, int limit)

---------------------------------------------------------------------------------------
String[] java.lang.Strin…

楼上的英文看不懂啊!
  • ZangXT用户头像
  • ZangXT
  • (深入JVM)
  • 等 级:
  • 2

#3楼 得分:10回复于:2009-07-02 13:52:31
CSDN 的老题目了
split 如果分割之后,如果在最后存在""(空串),默认是舍去的。比如"##",分割之后实际是"","","",可以从后面看,将""舍去,因此数组最后是0.
String ccc = "## ";
String ddd[] = ccc.split("#");
这种,因为最后存在一个空格,所以不存在这种舍去的情况。

为了避免舍去,可以这样
String aaa = "##";
String bbb[] = aaa.split("#",-1);
#4楼 得分:0回复于:2009-07-02 13:58:27
引用楼主 dsgdsg 的帖子:
String aaa = "##";
String bbb[] = aaa.split("#");
String ccc = "## ";
String ddd[] = ccc.split("#");
                System.out.println(bbb.length);//0
System.out.println(ddd.length);//3
why?

 
  支持!
#5楼 得分:0回复于:2009-07-02 13:58:48
原来这么多人都知道..是我寡闻了!!!!
见笑.........
#6楼 得分:0回复于:2009-07-02 14:15:25
关键就在那个空格。把楼主的例子中的"#"换成",",把空格换成"2",这样看更容易理解。相信看完下面就明白是怎么回事了。
                  如:字符串是str=",,,,";strA[]=str.split(",");str.length=0;
                      字符串是str="2,,,,";strA[]=str.split(",");str.length=1;
                  字符串是str=",2,,,";strA[]=str.split(",");str.length=2;
                  字符串是str=",,2,,";strA[]=str.split(",");str.length=3;
                  字符串是str=",,,4,";strA[]=str.split(",");str.length=4;
                   
                  上面三种情况是我们常用见得。楼主的疑问我觉得是我们经常会犯得错误,“空格”=“不存在”
#7楼 得分:0回复于:2009-07-02 14:24:26
让更多的人知道..明天来结吧!!
  • longtenggdf用户头像
  • longtenggdf
  • (在哪里跌倒了,就在哪里躺下!)
  • 等 级:
#8楼 得分:0回复于:2009-07-02 14:28:49
我来凑个不知道的人数!
#9楼 得分:0回复于:2009-07-02 14:45:52
简单,低调……
#10楼 得分:0回复于:2009-07-02 14:47:32
终于看懂了,学习了
#11楼 得分:0回复于:2009-07-02 14:59:23
路过的~~~~
#12楼 得分:0回复于:2009-07-02 15:02:51
弱弱地问句,酱油铺怎么走?
#13楼 得分:0回复于:2009-07-02 15:04:15
明白了
#14楼 得分:0回复于:2009-07-02 15:04:50
我一始不知道,现在知道了!
  • duckcma用户头像
  • duckcma
  • (不要做老实人)
  • 等 级:
#15楼 得分:0回复于:2009-07-02 15:05:50
我一始不知道,现在知道了!
  • java_cxrs用户头像
  • java_cxrs
  • (鄙视不结贴的人)
  • 等 级:
#16楼 得分:0回复于:2009-07-02 15:08:19
学习了!
#17楼 得分:0回复于:2009-07-02 15:49:50
这瓶酱油味道不错!
  • VistaKobe用户头像
  • VistaKobe
  • (一只在IT路上慢慢前行的蜗牛!)
  • 等 级:
#18楼 得分:0回复于:2009-07-02 16:50:18
jf
#19楼 得分:0回复于:2009-07-02 17:10:40
现在知道了  惭愧。
#20楼 得分:0回复于:2009-07-02 17:13:42
空格
  • wqmain用户头像
  • wqmain
  • (半杯凉茶)
  • 等 级:
#21楼 得分:0回复于:2009-07-02 17:28:11
8错
  • sjkof用户头像
  • sjkof
  • (sjkof)
  • 等 级:
#22楼 得分:0回复于:2009-07-02 17:30:32
引用 3 楼 ZangXT 的回复:
CSDN 的老题目了
split 如果分割之后,如果在最后存在""(空串),默认是舍去的。比如"##",分割之后实际是"","","",可以从后面看,将""舍去,因此数组最后是0.
String ccc = "## ";
String ddd[] = ccc.split("#");
这种,因为最后存在一个空格,所以不存在这种舍去的情况。

为了避免舍去,可以这样
String aaa = "##";
String bbb[] = aaa.split("#",-1);


支持
  • ZiSheng用户头像
  • ZiSheng
  • (不给分我就打你屁股)
  • 等 级:
#23楼 得分:0回复于:2009-07-02 17:48:59
我知道了。
  • xdbjzhhh用户头像
  • xdbjzhhh
  • (下雨时,她总是怕打雷.....)
  • 等 级:
#24楼 得分:0回复于:2009-07-02 17:49:01
引用 5 楼 dsgdsg 的回复:
原来这么多人都知道..是我寡闻了!!!!
见笑.........


赚了不少回贴
  • ZiSheng用户头像
  • ZiSheng
  • (不给分我就打你屁股)
  • 等 级:
#25楼 得分:0回复于:2009-07-02 17:52:04
不认真不行啊
#26楼 得分:0回复于:2009-07-02 17:58:17
up
  • ffqq58用户头像
  • ffqq58
  • (ffqq58)
  • 等 级:
#27楼 得分:0回复于:2009-07-02 18:00:19
这我知道的....
#28楼 得分:0回复于:2009-07-02 18:00:52
支持  看看
#29楼 得分:0回复于:2009-07-02 18:23:29

学习了
#30楼 得分:0回复于:2009-07-02 19:08:03
平時還真沒有注意到這個問題
#31楼 得分:0回复于:2009-07-02 19:56:56
引用 6 楼 nanking04 的回复:
关键就在那个空格。把楼主的例子中的"#"换成",",把空格换成"2",这样看更容易理解。相信看完下面就明白是怎么回事了。
                  如:字符串是str=",,,,";strA[]=str.split(",");str.length=0;
                      字符串是str="2,,,,";strA[]=str.split(",");str.length=1;
                  字符串是str=",2,,,";strA[]=str.split(",");str.length=2;
                  字符串是str=",,2,,";strA[]=s…

一目了然
#32楼 得分:0回复于:2009-07-02 20:57:57
真的是长见识了
#33楼 得分:0回复于:2009-07-02 21:07:06
学习
#34楼 得分:0回复于:2009-07-02 21:17:40
学习
#35楼 得分:0回复于:2009-07-02 21:28:49
#在。。。里面为什么变成空呀
#36楼 得分:0回复于:2009-07-02 21:45:25
我现在后悔了。。。其实大一得时候就要经常到这里来看看帖子。。。。这里让我知道我很多不知道的知识。。。
#37楼 得分:0回复于:2009-07-02 22:39:45
现在清楚了
#38楼 得分:0回复于:2009-07-02 23:04:23
了解sqlit了。。。
#39楼 得分:0回复于:2009-07-02 23:47:22
学习……
  • SimonYeung用户头像
  • SimonYeung
  • (編程三日,唯有硬盤在歌唱)
  • 等 级:
#40楼 得分:0回复于:2009-07-02 23:59:15
学习
#41楼 得分:0回复于:2009-07-03 00:03:36
学习下
#42楼 得分:0回复于:2009-07-03 00:47:47
学习
#43楼 得分:0回复于:2009-07-03 01:30:34
路过学习!
#44楼 得分:0回复于:2009-07-03 09:13:30
工作十年还没见哪个项目需要这样瞎折腾的。
#45楼 得分:0回复于:2009-07-03 10:00:34
DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD
#46楼 得分:0回复于:2009-07-03 10:00:54
长知识!
#47楼 得分:0回复于:2009-07-03 11:42:46
更多关于JAVA开源项目,JAVA算法,JS开源项目,WEB AJAX应用,请到126Code开源时代,让我们一起将开源进行到底.
#48楼 得分:0回复于:2009-07-03 13:11:45
java初学者  学习过了。。
#49楼 得分:0回复于:2009-07-03 13:23:52
又长知识了。
  • xl376用户头像
  • xl376
  • (xl376)
  • 等 级:
#50楼 得分:0回复于:2009-07-03 13:23:53
学习一下~~~~~~~
#51楼 得分:0回复于:2009-07-03 13:25:59
谢谢了 长见识 学习!
#52楼 得分:0回复于:2009-07-03 13:56:09
我是新手,也不知道
  • zz101b用户头像
  • zz101b
  • (zz101b)
  • 等 级:
#53楼 得分:0回复于:2009-07-03 16:22:41
我也是新手,不知道应该正常吧
#54楼 得分:0回复于:2009-07-03 17:54:39
学习

#55楼 得分:0回复于:2009-07-03 18:13:00
学习了哈,自己真的还有好多知识不懂呢,谢谢楼主了
#56楼 得分:0回复于:2009-07-04 06:21:40
见识了,呵呵 能力啊!
#57楼 得分:0回复于:2009-07-04 10:55:10
看过,谢谢!
  • yoyo82用户头像
  • yoyo82
  • (优游)
  • 等 级:
#58楼 得分:0回复于:2009-07-04 11:08:30
长见识了……
#59楼 得分:0回复于:2009-07-04 14:11:24
看过了就成了另一半了
  • yyjava用户头像
  • yyjava
  • (弹跳间的时速)
  • 等 级:
#60楼 得分:0回复于:2009-07-04 16:06:38
又是一道好面试题啊
#61楼 得分:0回复于:2009-07-04 19:38:59
长见识了..
#62楼 得分:0回复于:2009-07-04 20:06:59
平時還真沒有注意到這個問題
#63楼 得分:0回复于:2009-07-05 09:30:21
受教了.好帖
#64楼 得分:0回复于:2009-07-05 11:19:43
要拿这些来 分析的话,那肯定很多我们都不知道了,因为 现在很少人会去 专研 每一个API。

不过 这样的分享 也让更多的人 了解了更多的API了。
谢谢。
#65楼 得分:0回复于:2009-07-05 14:27:15
学习。。。。。。。
  • AK4585用户头像
  • AK4585
  • (AK4585)
  • 等 级:
#66楼 得分:0回复于:2009-07-05 17:56:52
果然有道理
#67楼 得分:0回复于:2009-07-05 23:11:09
我也弄明白了,谢谢分析
#68楼 得分:0回复于:2009-07-06 00:31:47
字符串处理的时候一般都trim()下,split和转数字前都写正则验证一下.

编程要有好习惯

原来被properties里面的空格搞死过,唉
#69楼 得分:0回复于:2009-07-06 08:52:59
好似脑筋急转弯似的~~
呵呵~~学习了
  • wang8用户头像
  • wang8
  • (wang8)
  • 等 级:
#70楼 得分:0回复于:2009-07-06 09:04:44
学习了
#71楼 得分:0回复于:2009-07-06 09:33:23
学习了
  • raineo用户头像
  • raineo
  • (raineo)
  • 等 级:
#72楼 得分:0回复于:2009-07-06 13:46:35
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素
  • raineo用户头像
  • raineo
  • (raineo)
  • 等 级:
#73楼 得分:0回复于:2009-07-06 13:51:53
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素
如:
字符串是str=",,,,";strA[]=str.split(",");str.length=0; //[""][""][""][""][""]=>
字符串是str="2,,,,";strA[]=str.split(",");str.length=1;//["2"][""][""][""][""]=>["2"]
字符串是str=",2,,,";strA[]=str.split(",");str.length=2;//[""]["2"][""][""][""]=>[""]["2"]
字符串是str=",,2,,";strA[]=str.split(",");str.length=3;//[""][""]["2"][""][""]=>[""][""]["2"]
字符串是str=",,,4,";strA[]=str.split(",");str.length=4;//[""][""][""]["2"][""]=>[""][""][""]["2"]

#74楼 得分:0回复于:2009-07-06 14:09:47
引用 73 楼 raineo 的回复:
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素 
如: 
字符串是str=",,,,";strA[]=str.split(",");str.length=0; //[""][""][""][""][""]=> 
字符串是str="2,,,,";strA[]=str.split(",");str.length=1;//["2"][""][""][""][""]=>["2"] 
字符串是str=",2,,,";strA[]=str.split(",");str.length=2;//[""]["2"][""][""][""]=>[""]["2"] 
字符串是str=",,2,,";strA[]=str.split(",");str.length=3;//[""][""]["2"][""][""]=>[""][""]["2"]
字符串是str=",,,4,";strA[]=str.split(",");str.length=4;//[""][""][""]["2"][""]=>[""][""][""]["2"]


一目了然,解释的非常清楚,支持
#75楼 得分:0回复于:2009-07-06 15:54:24
mark
#76楼 得分:0回复于:2009-07-06 16:45:39
没意思,这个可以试出来,我们用的是别人写的方法,知道它能做什么就可以了,不必这么细节。
要是哪天人家把方法实现改了,这个就没意思了
#77楼 得分:0回复于:2009-07-07 08:51:58
路过,打酱油的。
#78楼 得分:0回复于:2009-07-07 10:28:47
引用 3 楼 ZangXT 的回复:
CSDN 的老题目了
split 如果分割之后,如果在最后存在""(空串),默认是舍去的。比如"##",分割之后实际是"","","",可以从后面看,将""舍去,因此数组最后是0.
String ccc = "## ";
String ddd[] = ccc.split("#");
这种,因为最后存在一个空格,所以不存在这种舍去的情况。

为了避免舍去,可以这样
String aaa = "##";
String bbb[] = aaa.split("#",-1);


学习
  • panpete用户头像
  • panpete
  • (飞雪连心)
  • 等 级:
#79楼 得分:0回复于:2009-07-07 10:35:01
进来,学习了。
  • wuyou6用户头像
  • wuyou6
  • (该用户很懒,没有填写自己的个人)
  • 等 级:
#80楼 得分:0回复于:2009-07-07 10:40:53
恩,学习了啦
#81楼 得分:0回复于:2009-07-07 15:53:59
挺有意思,学习思路,在哪都能用!~
#82楼 得分:0回复于:2009-07-07 15:56:29
我想稍微学过C/C++的都应该知道吧,
结束符啊,我记得书上很以前的书页就有
#83楼 得分:0回复于:2009-07-07 17:07:32
public class Main {
String ppp[] = {"","",""};
String bbb[] = "##".split("#",3);
public static void main(String[] args) {
// TODO Auto-generated method stub
Main m = new Main();
System.out.println("m.ppp is "+m.ppp.length+"\n"
+"m.bbb is "+m.bbb.length
);
}

/* (non-Java-doc)
* @see java.lang.Object#Object()
*/
public Main() {
super();
}

}
--------------
Result:

m.ppp is 3
m.bbb is 3
--------------
Analysis:

1。没有指定第二个参数的大小的情况下,拆分的字符串数组中,最后一个不是空字符串的元素是生成的数组的最后一个元素。P.S. 这个元素后面的空字符串元素将被删除。
2。在指定第二个参数大小的情况下,按参数指定的次数进行匹配,生成的所有空字符串都将被保留。
#84楼 得分:0回复于:2009-07-28 13:11:05
dd
#85楼 得分:0回复于:2009-07-28 14:02:55
学习了
#86楼 得分:0回复于:2009-07-28 17:51:19
还有一个容易犯错的地方,就是在String.split()中的分割字符时一个正则表达式的特殊字符,那样就分割不出来了。如:
                  String aa="h11$hhj$k333$G111";
String[] a=aa.split("$");
System.out.println(a.length);
  • hzq237用户头像
  • hzq237
  • (heyman)
  • 等 级:
#87楼 得分:0回复于:2009-07-28 19:13:39
我晕
我以为 String ccc = "## "; 后面没空格.

  String aa="h11$hhj$k333$G111";
String[] a=aa.split("$");
System.out.println(a.length);

应写为String [] a=aa.split("\\$");

特殊字符要转译
#88楼 得分:0回复于:2009-07-28 20:04:41
路过
#89楼 得分:0回复于:2009-07-29 09:36:40
引用 2 楼 robyjeffding 的回复:
引用 1 楼 sd5816690 的回复:
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素

对于 aaa = "##" 来说,最后一个是 "" 所以 length = 0
对于 bbb = "## " 来说,最后一个是 " " 所以 length = 3

如果想将空字符串也记录,需要用 String[] java.lang.String.split(String regex, int limit)

---------------------------------------------------------------------------------------
String[] java.lang.Strin…

楼上的英文看不懂啊!


搞java看不懂英文。。。 NB
#90楼 得分:0回复于:2009-07-29 10:47:26
顺路!
#91楼 得分:0回复于:2009-07-29 14:56:49
引用 89 楼 sumaoyi 的回复:
引用 2 楼 robyjeffding 的回复:
引用 1 楼 sd5816690 的回复:
java.lang.String.split(String regex) 以最后一个不为 "" 的字符串作为最后元素

对于 aaa = "##" 来说,最后一个是 "" 所以 length = 0
对于 bbb = "## " 来说,最后一个是 " " 所以 length = 3

如果想将空字符串也记录,需要用 String[] java.lang.String.split(String regex, int limit)

---------------------------------------------------------------------------------------
String[] java.lang.Strin…

楼上的英文看不懂啊!


搞java看不懂英文。。。 NB


请问你们公司搞 Java 的是不是英文都NB的不得了!
真要是那样,算你 NB, 不是那样就别来 ZB
#92楼 得分:0回复于:2009-07-29 16:47:36
学习了
#93楼 得分:0回复于:2009-07-31 09:53:48
哗众取宠的老题目
出现了不知道多少次了
看了些高人的解释 还是不明所以
我承认我弱了

但是确实没有啥好学习的
over