`
nannan408
  • 浏览: 1783455 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

架构师之jdk的bug排查(一)---------------split的点号陷阱

 
阅读更多
1.前言.
   jdk1.6的lang包的split方法是有bug的,它不能有效识别A.b.c这种类型,导致截取长度始终是0.而对于其他字符,则无此问题.不知道官方有没有修复这个bug.
2.代码
String[] paths = "object.object2.prop11".split("'");
System.out.println(paths.length);




结果将是0.
String[] paths = "object_object2_prop11".split("_");
System.out.println(paths.length);



结果将是3.
String[] paths=StringUtils.split("object.object2.prop11", ".");
System.out.println(paths.length);



结果将是3
3.结论

最好用apache的stringutls包来做split.
 
0
4
分享到:
评论
18 楼 nannan408 2015-03-23  
  正是因为看到你还有点水平,所以我留了很多余地,一般的竟然还在叫嚣那些,我不是有力回击就是不值搭理. 我向来说话有根有据想的不是一个方面.
  程序员分很多种级别,一是努力在看别人代码的,而是努力看jdk的,三是努力看编译器的,四是努力看汇编的,五是努力看硬件cpu的,六是要改造科学院的. 所以告诉你为什么 一看你们回答,什么水平我就心理有数了. 我也丝毫不避讳把自己的心得贡献出来.至于一些瑕疵,让它存在吧,几分钟敲出来的东西不可能完美 .
  到此为止吧,还是要多贡献,少嘴皮比较好.
17 楼 hubertstar 2015-03-23  
咱们的讨论就此打住吧,本来是有人鄙视你我替你说几句话而已的,哪想到你跟我对上了。
16 楼 hubertstar 2015-03-23  
nannan408 写道
  (1)你仔细点看我的文章,我向来是很注意细节的。 我很多文章都是不管是oracle还是goole直接批。当然你如果有开源,不要被我看到还在戏耍开发者,有一定要批。
   (2)初学者往往喜欢说人家是初学者,自己水平几斤先算准了。不要随大流,读死书。本来我看了你有回答还是觉得水平可以的,但看你的观念,就觉得没前途了,你适合做个本分的程序员,但我的公司不会要你做架构师的,因为这种岗位需要的不仅仅是技术。
 


唉,还是年轻气盛。你肯定猜不到我是做什么的,但肯定不是做架构师或程序员,你们工资可能也给不起我。

我很多年不写代码了,那既然你说到你的细节,恩,指出你的几个错误,别生气,也通过这几个错误重新认识一下自己。

1. 记得你写的一篇文章,好像是判断enum什么的,我当时就想:这货没不知道异常?
2. utils这个简写一般没人会写成utls,同样google也没人会少些个g
3. 你回帖时的括号大小写

所以,按我说的,过个几年,反过头来看看自己的东西,说不定是另一番感受。

你发了这么多博客,很多初学者受益,很赞。但,正因为这样,更要注意,不要误导。

15 楼 nannan408 2015-03-22  
http://nannan408.iteye.com/blog/2082049
  这是我另一篇批的东西。我始终是站在开发者角度看问题,也没有自认为是架构师,相反,我认为我什么都不懂(因为我身边高手实在太多,有些领域我认为我不可能超越他们,但java我自认为还行),但如果被我发现有歧义并且还引以为荣不思改进的东西,就不要怪我了。
14 楼 nannan408 2015-03-22  
  (1)你仔细点看我的文章,我向来是很注意细节的。 我很多文章都是不管是oracle还是goole直接批。当然你如果有开源,不要被我看到还在戏耍开发者,有一定要批。
   (2)初学者往往喜欢说人家是初学者,自己水平几斤先算准了。不要随大流,读死书。本来我看了你有回答还是觉得水平可以的,但看你的观念,就觉得没前途了,你适合做个本分的程序员,但我的公司不会要你做架构师的,因为这种岗位需要的不仅仅是技术。
 
13 楼 hubertstar 2015-03-22  
nannan408 写道
(1)没有正面回答问题,说明逻辑思维有问题。 
(2)建议你去看下jdk9。你该知道jdk向什么方向发展了,我和你的区别就是你只拿着源码背书,而我随时要走在时代最前沿,亲自去修正源码,随时在比较几千种可行方案,不符合时代前沿的地方直接淘汰。有些地方我甚至不能直接用java,比如嵌入式jni。 正则在大数据时代已经基本淘汰,但在小数据应用还是很广的。更前沿的东西我不想说了,说了你也不懂,因为你只停留在jdk.
(3)jdk9已经采用了我的建议,在向脚本和加密,简化这个方向在走 。


这么说吧,当时看到这个帖子,看到你很武断说是bug,好心提醒你一下而已:说明一下这不是bug,以免给初学者不正确的误导。

之后看到别人的讨论,有些回复比较直接,所以替你说几句好话而已:阐述一下这个方法的历史和对你的一些建议;

再之后你直接扔过来问题要求别人回答,其实我们是在谈两个话题不是吗?所以告诉你去看jdk代码,这样你就不需要担心在近期版本中存在的内存泄露和正则效率问题了(为什么不去关心可以看我给你回的帖子)。其实到这里以后,你去看看源代码就应该恍然大悟了,也不会再在这边纠结了。

说实话也是我晚上有时间来看看,平常看到这种态度理都不理了。作为一个学习者,我认为你是有可造之才的,只不过太执着了,这样不会成为一个成功的架构师,你的路还很远。

我不知道你是否清楚一个建议被jdk采用是要走怎样的流程。但是我还真的认识一个朋友有做过jcp执委的代表参加过jdk9技术评审会议,所以我可以很明确告诉你jdk9的发展方向不是上述三种,尤其是Process API可能比以前更复杂。

在这个论坛上有很多初学者,希望他们不会被一些似是而非的言论误导。仅此而已。
12 楼 nannan408 2015-03-22  
(1)没有正面回答问题,说明逻辑思维有问题。 
(2)建议你去看下jdk9。你该知道jdk向什么方向发展了,我和你的区别就是你只拿着源码背书,而我随时要走在时代最前沿,亲自去修正源码,随时在比较几千种可行方案,不符合时代前沿的地方直接淘汰。有些地方我甚至不能直接用java,比如嵌入式jni。 正则在大数据时代已经基本淘汰,但在小数据应用还是很广的。更前沿的东西我不想说了,说了你也不懂,因为你只停留在jdk.
(3)jdk9已经采用了我的建议,在向脚本和加密,简化这个方向在走 。
11 楼 hubertstar 2015-03-22  
nannan408 写道
hubertstar 写道
nannan408 写道
skyline_tu 写道
简直就是对架构师的侮辱啊   

我所有文章都是站在易用性的角度看问题,所以不利于易用性的我都叫bug,包括hbase和hadoop,spark等我都有提bug,欢迎去看下是不是这样.


也不是侮辱吧

初学者很多时候认为自己的想法很对,这个没有问题。

split怎么用仁者见仁,为什么用正则还是要从split的历史说起。

可能楼主的大部分应用就是要去用固定的字符串来分割,没有问题,你自己写一个封装后的stringutils去处理你特殊的逻辑,但是对于别的人来说就会非常奇怪:明明是正则关键字为什么结果不对?调试了一大圈发现,靠,哪个sb把这个.给额外处理了。

要认识到作为核心api必须要提供一个满足大部分应用场景的api,而string的split还真就是非常典型的一个例子,简单的入口,灵活的功能。我们有一个项目,大量使用split提供的正则,要是按你的说法,代码里面在我看来就会一大堆Pattern.xxx了。

你看源码就知道,没有re关键字的时候这个方法是直接用分割来解析字符串,存在re关键字才用正则机制来解析。既保证性能,又能提供强大的功能,还有一个非常统一和简单的入口,明确而又高效,为什么会变成一个bug?

比如array copy的问题,还有线程方面的问题,很多时候要跟场景结合在一起才能真正理解。





  我问你一下,split的内存泄露等问题和正则的效率问题,你是否有研究,你只需要回答是或者不是?


我建议你有时间去阅读一下jdk的代码。

10 楼 nannan408 2015-03-21  
hubertstar 写道
nannan408 写道
skyline_tu 写道
简直就是对架构师的侮辱啊   

我所有文章都是站在易用性的角度看问题,所以不利于易用性的我都叫bug,包括hbase和hadoop,spark等我都有提bug,欢迎去看下是不是这样.


也不是侮辱吧

初学者很多时候认为自己的想法很对,这个没有问题。

split怎么用仁者见仁,为什么用正则还是要从split的历史说起。

可能楼主的大部分应用就是要去用固定的字符串来分割,没有问题,你自己写一个封装后的stringutils去处理你特殊的逻辑,但是对于别的人来说就会非常奇怪:明明是正则关键字为什么结果不对?调试了一大圈发现,靠,哪个sb把这个.给额外处理了。

要认识到作为核心api必须要提供一个满足大部分应用场景的api,而string的split还真就是非常典型的一个例子,简单的入口,灵活的功能。我们有一个项目,大量使用split提供的正则,要是按你的说法,代码里面在我看来就会一大堆Pattern.xxx了。

你看源码就知道,没有re关键字的时候这个方法是直接用分割来解析字符串,存在re关键字才用正则机制来解析。既保证性能,又能提供强大的功能,还有一个非常统一和简单的入口,明确而又高效,为什么会变成一个bug?

比如array copy的问题,还有线程方面的问题,很多时候要跟场景结合在一起才能真正理解。





  我问你一下,split的内存泄露等问题和正则的效率问题,你是否有研究,你只需要回答是或者不是?
9 楼 nannan408 2015-03-21  
   对于目前的回复,我进行统一辩答。 首先你们的水平我就不评价了。
   我的文章始终坚持马上能用,一定能用,一个例子搞定的原则。或许你们第一次看我的文章,没关系,人个有自己的风格,编程的世界不是一两个人能主宰的,百家争鸣才是主流。
   我的文章不会针对个人或者公司,是什么,我一定是坚持说出来,不会有余地给。
8 楼 hubertstar 2015-03-20  
nannan408 写道
qsb19920212 写道
1楼说得对。在正则表达式中.的匹配为:\\.
System.out.println("a.b.c".split("\\.").length);结果为3


这虽然解决了问题,但是不利于理解,这些东西都不利于开发者简化工作和阅读代码.


在我看来,恰恰是初学者才不会搞错\.和.
7 楼 hubertstar 2015-03-20  
nannan408 写道
skyline_tu 写道
简直就是对架构师的侮辱啊   

我所有文章都是站在易用性的角度看问题,所以不利于易用性的我都叫bug,包括hbase和hadoop,spark等我都有提bug,欢迎去看下是不是这样.


也不是侮辱吧

初学者很多时候认为自己的想法很对,这个没有问题。

split怎么用仁者见仁,为什么用正则还是要从split的历史说起。

可能楼主的大部分应用就是要去用固定的字符串来分割,没有问题,你自己写一个封装后的stringutils去处理你特殊的逻辑,但是对于别的人来说就会非常奇怪:明明是正则关键字为什么结果不对?调试了一大圈发现,靠,哪个sb把这个.给额外处理了。

要认识到作为核心api必须要提供一个满足大部分应用场景的api,而string的split还真就是非常典型的一个例子,简单的入口,灵活的功能。我们有一个项目,大量使用split提供的正则,要是按你的说法,代码里面在我看来就会一大堆Pattern.xxx了。

你看源码就知道,没有re关键字的时候这个方法是直接用分割来解析字符串,存在re关键字才用正则机制来解析。既保证性能,又能提供强大的功能,还有一个非常统一和简单的入口,明确而又高效,为什么会变成一个bug?

比如array copy的问题,还有线程方面的问题,很多时候要跟场景结合在一起才能真正理解。




6 楼 nannan408 2015-03-20  
qsb19920212 写道
1楼说得对。在正则表达式中.的匹配为:\\.
System.out.println("a.b.c".split("\\.").length);结果为3


这虽然解决了问题,但是不利于理解,这些东西都不利于开发者简化工作和阅读代码.
5 楼 nannan408 2015-03-20  
hubertstar 写道
其实,这个真不是bug。

String的方法:public String[] split(String regex)

仔细看看方法的参数是啥?从名字上就能知道吧?

这个点是正则的关键字,你用\.就可以了。

oracle需要与时俱进,容易造成误解的也要进行进化,split的正则用处很少,且正则表达式很占用性能,早被证明需要适当抛弃了.
4 楼 nannan408 2015-03-20  
skyline_tu 写道
简直就是对架构师的侮辱啊   

我所有文章都是站在易用性的角度看问题,所以不利于易用性的我都叫bug,包括hbase和hadoop,spark等我都有提bug,欢迎去看下是不是这样.
3 楼 skyline_tu 2015-03-20  
简直就是对架构师的侮辱啊   
2 楼 qsb19920212 2015-03-20  
1楼说得对。在正则表达式中.的匹配为:\\.
System.out.println("a.b.c".split("\\.").length);结果为3
1 楼 hubertstar 2015-03-20  
其实,这个真不是bug。

String的方法:public String[] split(String regex)

仔细看看方法的参数是啥?从名字上就能知道吧?

这个点是正则的关键字,你用\.就可以了。

相关推荐

    jdk-7u80-windows-x64安装包

    jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-windows-x64安装包 jdk-7u80-...

    开发工具 jdk-8u121-windows-i586

    开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8u121-windows-i586开发工具 jdk-8...

    bcprov-jdk15to18-1.69.jar

    bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-1.69.jar bcprov-jdk15to18-...

    jdk-8u60-windows-i586-JDK1.8-32位

    jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586 jdk-8u60-windows-i586

    jdk-8u202-linux-arm64-vfp-hflt-demos.tar.gz

    标题中的"jdk-8u202-linux-arm64-vfp-hflt-demos.tar.gz"表明这是一个针对Linux ARM架构(具体为vfp-hflt变体)的Java Development Kit(JDK)版本8更新202的示例(demos)压缩包。这个压缩文件采用tar.gz格式,是...

    jdk-8u231-windows-x64.exe 安装版

    文件名称:C:\Users\LBWNB\Desktop\jdk-8u231-windows-x64\jdk-8u231-windows-x64.exe 文件大小:220392992 字节 文件版本:8.0.2310.11 修改时间:2019年11月11日 13:31:03 MD5 :F8A35AB83D651DC52CC77B19CD818167...

    jdk8-jdk-8u121-linux-x64.tar.gz

    2. **解压**:使用`tar -zxvf jdk8-jdk-8u121-linux-x64.tar.gz`命令解压文件,这将创建一个名为`jdk1.8.0_121`的目录。 3. **配置环境变量**:编辑`~/.bashrc`或`~/.bash_profile`文件,添加以下内容: ```bash ...

    腾讯地图jdk qqmap-wx-jssdk

    腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk qqmap-wx-jssdk 腾讯地图jdk...

    bcmail-jdk14-1.38-API文档-中文版.zip

    赠送jar包:bcmail-jdk14-1.38.jar; 赠送原API文档:bcmail-jdk14-1.38-javadoc.jar; 赠送源代码:bcmail-jdk14-1.38-sources.jar; 赠送Maven依赖信息文件:bcmail-jdk14-1.38.pom; 包含翻译后的API文档:bcmail...

    jdk-8u202-linux-arm64-vfp-hflt.tar.gz

    jdk-8u202-linux-arm64-vfp-hflt.tar.gz适用于Linux ARM v6/v7 Soft Float ABI 64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中; 对于 2019 年 4 月 16 日开始...

    jdk-7u80-windows-x64.zip

    总的来说,"jdk-7u80-windows-x64.zip"是一个至关重要的工具包,为Windows 64位系统的Java开发者提供了可靠和高效的开发环境。无论是新手还是经验丰富的开发者,都需要这样的JDK版本来支持他们的Java项目。

    jdk-8u231-linux-x64.tar.zip

    标题中的"jdk-8u231-linux-x64.tar.zip"表明这是一个针对Linux操作系统的64位Java Development Kit(JDK)的压缩文件,版本为8u231。这个压缩包采用的是tar和zip两种格式的组合,首先是一个tar归档文件,然后再用zip...

    jdk-8u202-windows-x64.exe

    jdk-8u202-windows-x64.exe适用于Windows x64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中;对于 2019 年 4 月 16 日开始的版本,Oracle JDK 许可协议已更改,...

    jdk1.8 jdk-8u5-windows-i586 32位官方正式版

    jdk1.8 jdk-8u5-windows-i586 32位官方正式版 jdk1.8 jdk-8u5-windows-i586 32位官方正式版

    jdk-8u131-windows-x64

    jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-windows-x64jdk-8u131-...

    jdk8安装包: jdk-8u202-windows-x64

    这里的"jdk-8u202-windows-x64"是一个针对Windows 64位操作系统的JDK 8更新202版本的安装包。在本文中,我们将深入探讨JDK 8的重要特性和安装过程。 首先,JDK 8是Oracle公司发布的Java平台标准版(Java SE)的一个...

    java-jdk1.8-8u361-all-jdk-win-linux

    java-jdk1.8-8u361-all-jdk-win-linux 该压缩包中包含jdk1.8-8u361下windows版本和linux版本,其包含快速安装包和对应的jdk压缩包版本,具体内容如下: jdk-8u361-linux-aarch64.rpm jdk-8u361-linux-i586.rpm jdk-8...

    JDK-7u80-windows-x64版本

    JDK版本:JDK-7u80-windows-x64版本,即为jdk1.7,此版本会自动安装JRE(Java的一个运行环境).

    jdk-8u202-linux-x64.rpm

    jdk-8u202-linux-x64.rpm适用于Linux 64位系统,是在Binary Code License (“BCL”)许可协议下提供最后的免费商业版本,允许用在生产环境中; 对于 2019 年 4 月 16 日开始的版本,Oracle JDK 许可协议已更改,也...

    jdk-7u80-windows-x64

    "jdk-7u80-windows-x64" 是Oracle公司发布的JDK的一个特定版本,主要针对Windows操作系统64位架构。这个版本的JDK对于那些在Windows环境下开发和运行64位Java应用的程序员来说至关重要。 JDK 7是Java的第七个主要...

Global site tag (gtag.js) - Google Analytics