仓酷云

标题: JAVA教程之Java中字符串switch的完成细节仓酷云 [打印本页]

作者: 爱飞    时间: 2015-1-18 11:17
标题: JAVA教程之Java中字符串switch的完成细节仓酷云
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net网页编程性能上肯定会站上风的。自从Java同意在switch及case语句中利用字符串以来,很多开辟职员都利用了这一特征,不外假如利用整型大概列举的话会更好。这是JDK7中最受接待的特征之一,一样的另有主动资本办理和多非常捕捉。只管我团体不太喜好这个特征,由于利用列举的体例实在更好,但我并非出格否决利用它。一个缘故原由固然是它很便利,假如程序中已用到了字符串,如许做切实其实很随手,不外我倡议在临盆情况的代码中利用新特征之前最好懂得下它是怎样事情的。我第一次传闻这个特征的时分,我以为这一定是经由过程equals()和hashCode()办法来完成的,我更体贴的是Java7中的字符串的switch是怎样完成的。我对这个感乐趣另有一个缘故原由,是我想在口试中问一下这个成绩,假如口试中有相似如许的一个成绩的话会十分风趣。考证它实在十分复杂,你只需用字符串写一段switch的代码,然后反编译一下,看看编译器是怎样翻译它们的就能够了。那末还等甚么,从速来看下switch中的字符串是怎样事情的吧?
原始代码:

这是一个复杂的测试程序,它有一个main办法,内里有一个switch块在操纵String变量。程序顶用到的字符串参数是运转时传送出去的,你能够从main办法的字符串数组中猎取到。有三种形式来启动这个程序,自动形式,主动形式,和平安形式。关于这些已知切实其实定值,实在用列举来完成要更好,但假如你已决意利用字符串了,你得确保你写的是年夜写的,不要写成小成大概骆驼式的,如许会呈现巨细写敏感的成绩。你还能够看下这篇教程,懂得下怎样在Java7的switch表达式中准确地利用字符串。
  1. /***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表达式,它经由过程编译器来完成了外部匿名类,你能够反编译下你的类文件来看下编译器都加了些甚么。
  1. /***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网页编程的编译环境非常好,你甚是不需要了解太多工具,对于简单的系统,你可以之了解一些语法就哦了。
作者: 金色的骷髅    时间: 2015-1-18 16:48
你可以去承接一些项目做了,一开始可能有些困难,可是你有技术积累,又考虑周全,接下项目来可以迅速作完,相信大家以后都会来找你的,所以Money就哗啦啦的。。。。。。
作者: 山那边是海    时间: 2015-1-22 13:43
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 柔情似水    时间: 2015-1-27 22:21
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 不帅    时间: 2015-2-6 00:28
[url]http://www.jdon.com/[/url]去下载,或到同济技术论坛的服务器[url]ftp://nro.shtdu.edu.cn[/url]去下,安装上有什么问题,可以到论坛上去提问。
作者: 灵魂腐蚀    时间: 2015-2-8 08:40
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 愤怒的大鸟    时间: 2015-2-11 08:17
那么我书也看了,程序也做了,别人问我的问题我都能解决了,是不是就成为高手了呢?当然没那么简单,这只是万里长征走完了第一步。不信?那你出去接一个项目,你知道怎么下手吗,你知道怎么设计吗,你知道怎么组织人员进行开发吗?你现在脑子里除了一些散乱的代码之外,可能再没有别的东西了吧!
作者: 海妖    时间: 2015-2-20 13:56
象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。
作者: 活着的死人    时间: 2015-3-6 17:27
一般学编程语言都是从C语开始学的,我也不例外,但还是可能不学过程语言而直接学面向对象语言的,你是刚接触语言,还是从C开始学比较好,基础会很深点,如果你直接学习JAVA也能上手,一般大家在学语言的时候都记一些语言的关键词,常有的包和接口等。再去做逻辑代码的编写,以后的学习过程都是从逻辑代码编写中提升的,所以这方面都是经验积累的。你要开始学习就从
作者: 小妖女    时间: 2015-3-6 20:06
你就该学一学Servlet了。Servlet就是服务器端小程序,他负责生成发送给客户端的HTML文件。JSP在执行时,也是先转换成Servlet再运行的。虽说JSP理论上可以完全取代Servlet,这也是SUN推出JSP的本意,可是Servlet用来控制流程跳转还是挺方便的,也令程序更清晰。接下来你应该学习一下Javabean了,可能你早就看不管JSP在HTML中嵌Java代码的混乱方式了,这种方式跟ASP又有什么区别呢?
作者: 莫相离    时间: 2015-3-7 10:22
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 因胸联盟    时间: 2015-3-14 20:35
如果你学过HTML,那么事情要好办的多,如果没有,那你快去补一补HTML基础吧。其实JSP中的Java语法也不多,它更象一个脚本语言,有点象ASP。
作者: 简单生活    时间: 2015-3-21 14:06
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2