|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net网页编程性能上肯定会站上风的。自从Java同意在switch及case语句中利用字符串以来,很多开辟职员都利用了这一特征,不外假如利用整型大概列举的话会更好。这是JDK7中最受接待的特征之一,一样的另有主动资本办理和多非常捕捉。只管我团体不太喜好这个特征,由于利用列举的体例实在更好,但我并非出格否决利用它。一个缘故原由固然是它很便利,假如程序中已用到了字符串,如许做切实其实很随手,不外我倡议在临盆情况的代码中利用新特征之前最好懂得下它是怎样事情的。我第一次传闻这个特征的时分,我以为这一定是经由过程equals()和hashCode()办法来完成的,我更体贴的是Java7中的字符串的switch是怎样完成的。我对这个感乐趣另有一个缘故原由,是我想在口试中问一下这个成绩,假如口试中有相似如许的一个成绩的话会十分风趣。考证它实在十分复杂,你只需用字符串写一段switch的代码,然后反编译一下,看看编译器是怎样翻译它们的就能够了。那末还等甚么,从速来看下switch中的字符串是怎样事情的吧?
原始代码:
这是一个复杂的测试程序,它有一个main办法,内里有一个switch块在操纵String变量。程序顶用到的字符串参数是运转时传送出去的,你能够从main办法的字符串数组中猎取到。有三种形式来启动这个程序,自动形式,主动形式,和平安形式。关于这些已知切实其实定值,实在用列举来完成要更好,但假如你已决意利用字符串了,你得确保你写的是年夜写的,不要写成小成大概骆驼式的,如许会呈现巨细写敏感的成绩。你还能够看下这篇教程,懂得下怎样在Java7的switch表达式中准确地利用字符串。- /***JavaProgramtodemonstratehowstringinswitchfunctionalityisimplementedin*JavaSE7release.*/publicclassStringInSwitchCase{publicstaticvoidmain(String[]args){Stringmode=args[0];switch(mode){case"ACTIVE":System.out.println("ApplicationisrunningonActivemode");break;case"PASSIVE":System.out.println("ApplicationisrunningonPassivemode");break;case"SAFE":System.out.println("ApplicationisrunningonSafemode");}}}
复制代码 编译运转这段代码必要安装JDK7才行。任意哪一个版本的JDK7都能够。
反编译后的代码:
上面是上述代码利用jdk1.7.040编译后再反编译的了局。假如你是Java老手,想晓得怎样反编译Java类来完成逆向工程,看下<ahref="http://javarevisited.blogspot.sg/2013/01/how-to-decompile-class-file-in-java-eclipse-javap-example.html"target="blank">这篇文章。JDK的每一个版本城市到场愈来愈多的语法糖,因而关于各个程度的Java开辟职员来讲,晓得怎样反编译Java类是想当主要的。你写的代码和完成实行的差异会愈来愈年夜。懂得Java类的文件格局和字节码指令会对你很有匡助。Java8比来公布了一个新的特征,叫做lambda表达式,它经由过程编译器来完成了外部匿名类,你能够反编译下你的类文件来看下编译器都加了些甚么。- /***ReverseEngineeredcodetoshowhowStringinSwitchworksinJava.*/importjava.io.PrintStream;publicclassStringInSwitchCase{publicStringInSwitchCase(){}publicstaticvoidmain(stringargs[]){Stringmode=args[0];Strings;switch((s=mode).hashCode()){default:break;case-74056953:if(s.equals("PASSIVE")){System.out.println("ApplicationisrunningonPassivemode");}break;case2537357:if(s.equals("SAFE")){System.out.println("ApplicationisrunningonSafemode");}break;case1925346054:if(s.equals("ACTIVE")){System.out.println("ApplicationisrunningonActivemode");}break;}}}
复制代码 看到这个代码,你晓得本来字符串的switch是经由过程equals和hashCode()办法来完成的。记着,switch中只能利用整型,好比byte。short,char和int。还好hashCode()办法前往的是int,而不是long。经由过程这个很简单记着hashCode前往的是int这个现实,现实上我本人城市常常忘了大概弄混。细心看下能够发明,举行switch的实践是哈希值,然后经由过程利用equals办法对照举行平安反省,这个反省是需要的,由于哈希大概会产生碰撞。因而它的功能是不如利用列举举行switch大概利用纯整数常量,但这也不是很差。由于Java编译器只增添了一个equals办法,假如你对照的是字符串字面量的话会十分快,好比"abc"=="abc"。假如你把hashCode()办法的挪用也思索出去了,那末还会再多一次的挪用开支,由于字符串一旦创立了,它就会把哈希值缓存起来,这个能够看下我本人对照喜好的一篇文章为何Java中的字符串是不成变的。因而假如这个siwtch语句是用在一个轮回里的,好比逐项处置某个值,大概游戏引擎轮回地衬着屏幕,这里hashCode()办法的挪用开支实在不会很年夜。不论如何,我仍旧以为利用字符串的switch来代表几个流动的值不是一个最好理论,Java里的列举的存在是有它的缘故原由的,每一个Java开辟职员都应当利用它。
这就是Java7怎样完成的字符串switch。正如我所料,它利用了hashCode()来举行switch,然后经由过程equals办法举行考证。这实在只是一个语法糖,而不是甚么内建的当地功效。选择权在你,我团体来讲不是很喜好在switch语句中利用字符串,由于它使得代码更懦弱,简单呈现巨细写敏感的成绩,并且编译器又没有做输出校验。现实上关于功能关头的代码,之前的整型常量和列举的写法是我的最爱,在这里可读性和代码质量都更主要。现实上,99。99%的情形下,列举都比利用字符串的switch大概整型要好,这也是它们存在于Java言语中的实践意义。这个特征就是为了改动这类不良的编码理论而生的,我很难找到甚么情形下非要针对一组输出值在switch分支中利用字符串,假如你有一个使人佩服的利用字符串switch的缘故原由,请告知我,我大概会改动我如今的设法。
译注:更深切的话能够懂得下Java在字节码层面是怎样完成的,可参考这篇文章。
还是要自己一点一点写代码,然后编译,改错再编译好那。还有最重要的是.net网页编程的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。 |
|