日期:2014-05-20  浏览次数:20954 次

你不知道的java(SE)
(这个标题很有种似曾相识的感觉吧?嘿嘿。)

知其然,知其所以然。我们学习、使用java,刚开始一些细节的东西可能会困扰我们,时间久了,往往会觉得理所当然,问题还是不太清楚。被人问起的时候,可能会“理所当然”的告诉别人,“这是java封装了的,知道怎么用就行啦”。长此以往,我们可能会的工具或配置很多,却无所长进。

为了一定程度上辅助我们搞清楚这种模糊的概念、细节,特此在java大版各个子板,开通一个《你不知道的java》系列帖子,希望汇聚众“Java人”的经验和汗水,发扬“开源”的思想,使我们知道一些java的细节、工具或配置文件的处理流程,成为多懂一些Java的人。

规则:
1. 留言的同学,先抛出自己发现的,别人可能不知道的细节问题,再给出这个问题的答案。
2. 围观的同学,如果觉得有哪些细节让你为之叫好,请您点一下“对我有用”。
3. 每月结贴一次,根据“对我有用”的程度和问题精彩程度,奖励相应比例积分。
(俺的权限就200分,要是僧多粥少了,希望众大大别怪俺小气哈!)

你不知道的java(SE)
这里先厚颜扔两块板砖:
1. 执行java程序,如何给main方法传参?
命令行执行的时候,在类名后跟参数,以空格分隔多个参数,例如:
java MyTest Tomcat is good in use.
"Tomcat is good in use."会分成五个字符串,传递给MyTest的main方法(作为args)。

2. 我们平时使用的String、Integer等j2se基本类,在java安装环境什么地方?
在$HOME\jre\lib\rt.jar中。(rt,无处不在啊。。)

3. 打的jar包没问题,MANIFEST.MF也设置了Main-Class,为何还是无法执行响应的main方法(报错“Invalid or corrupt jarfile”)?
Main-Class: 冒号后面要加空格,再配置上带上包路径的类,例如:
Main-Class: com.test.HelloWorld
这样就可以在命令行里执行jar包:java -jar XXX.jar
(当然,如果配置了jar文件的默认打开方式为“Java(TM) platform SE binary”,也可以双击jar文件执行)

4. 都说字符串hashCode相同,不一定equals,如何构造俩字符串,使其hashCode相同,字符串不同?
首先,为了简化问题,我们可以限定,长度同为两位的字符串。
我们知道String.hashCode方法的哈希策略(参考源码):循环遍历字符串中的字符(c表示字符,ASCc表示c的ASCII值),计算:hashcode = 31*hashcode+ASCc
因为字符串只有两位,hashcode初始值为0,我们的两个字符串假设为"XY"与"MN",则其hashcode分别为(31*ASCX+ASCY)和(31*ASCM+ASCN)。
接下来凑数就可以了:ASCX和ASCM可以取任意值(尽量小些,在ASCII码范围内),ASCY和ASCN要根据ASCX和ASCM的取值,得到曲线关系(取值也要在ASCII码范围0~127内凑)。
比如ASCX取值49,ASCM取值50,则得到等式:31*49+ASCY=31*50+ASCN ,转换:ASCY=31+ASCN。此时,不妨ASCN取值66,则ASCY取值97。
接下来大家可以用System.out.println((char)49);方式得知各ASCII码对应的字符:49,'1';  50,'2';  66,'B';  97,'a'。
于是乎,hashCode相同,字符串不同的两个字符串构造好了:"1a","2B"(我擦,不是故意构造这个字符串的。。)。
(这里为了好看,凑了个常规字符,大家也可以试试其他ASCII码字符,0~127范围内的哦)

不积跬步无以至千里,不积小流无以成江海。

题外话:
因个人能力有限,先在J2SE版试行,欢迎对java其他版块有经验的同学,以同样的标题发个话题。
如果分数有限的话,也可以给我留言,我来汇总发帖(并标注问题提供者的ID)。
欢迎大家提出改进意见。

------解决方案--------------------
jdk7中switch表达式可以是String。这算不算
------解决方案--------------------
我们打印字符串的时候一直只知道有System.out.print和System.out.println两个函数,我也是最近才知道,原来java还有提供类似c语言的printf函数。