你不知道的java(SE)——优秀回复汇总

你不知道的Java(SE)

原帖内容:

LZ(也就是小弟我了):
你不知道的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范围内的哦)

得分楼摘要如下:
1L(ncist_jianeng):jdk7中switch表达式可以是String。

2L(rumlee):我们打印字符串的时候一直只知道有System.out.print和System.out.println两个函数,我也是最近才知道,原来java还有提供类似c语言的printf函数。

3L(Iamhuanhuan):java最大的特性是与平台的无关性,因为java是运行在java虚拟机上,即jvm(Java Virtual Machine),它是通过在实际计算机上仿真模拟各种计算机功能来实现的。它负责与操作系统交互,用来屏蔽操作系统环境,供java运行,使得Java程序只需生成能在Java虚拟机上运行的字节码即可。

6L(chenchenchenliu):java火起来的很大一部分跟他的跨平台有关系,但现在感觉跨平台已经不是他的优势了。.net貌似也可以跨平台了

7L(longtian1213):使用enum来实现单例类,以前不知道enum中还可以定义方法

8L(yanxing2012):String 对象不可变,相加时先转化为StringBuffer,调用append方法,最后再转化为String,原先的String再引用它

12L(tlfu_12344):类成员变量加载顺序为:父类静态块(静态变量) --> 然后是子类静态块(静态变量) --> 父类成员变量 --> 父类构造函数块 --> 子类成员变量 --> 子类构造函数块

13L(fudongrifdr):静态方法调用的限定表达式是可以计算的,但是它的值将被忽略。无非空限制

14L(kittaaron):可变参数的应用(C,CPP都有这种语法,最典型的就是字符串format的实现):public PrintWriter format(String format, Object ... args);

17L(huntor):现在使用StringBuilder。 + 操作会被编译器转成 StringBuilder的append

19L(huntor):String 的 + 操作,写段代码,编译后,用 javap -c 查看。

29L(rumlee):我们一般在编写java代码的时候,一般都是用英文字母、下划线、数字等作为类名、变量名等,但是实际上java完全可以支持使用中文作为这些名称

30L(rumlee):c的性能比java高,那得看是做什么类型的应用

31、32L(raistlic):专门去查了 JLS 7 编译时方法绑定的部分,于是有了下面的代码,猜猜看能不能编译,如果能,这些方法调用都输出什么

37L(w215230188):后自增原理:首先声明一个临时变量存储i未自增的值  int temp=i; 即此时 temp=0

41L(huntor):许多人时间转换时,自己乘一串数字,其实 java.util.concurrent.TimeUnit 提供了转换方法:

42L(huntor):null instanceof Xxxx 返回 false,所以 aObject != null && aObject instanceof Xxxx 前面的非null判断是多余的。

43L(valenon):java语言和java虚拟机将来会是两个方向独立发展,因为java虚拟机可以运行字节码文件,而字节码文件不一定只能由java语言生成,事实上,现在已经有一些语言,可以生成字节码,运行于Java虚拟机,如JRuby,Groovy等,期待jvm未来更通用。

46L(qq467339640):java四舍五入问题

52L(huntor):在定义enum类的方法中使用 switch(this)

56L(nj_dobetter):没有main函数的Java程序也可以通过java命令运行起来

59L(lin9118):不使用中间变量实现两个数互换

60L(lin9118):计算某个数乘以2的n次方不必再使用for循环实现了

61L(ldh911):静态代码段

62、63L(raistlic): ThreadLocal 的说明和文件路径的使用

原帖地址:http://bbs.csdn.net/topics/390538912

帖子里很多J2SE的小知识点很有意思,回贴的比较零散,就汇总在这里写个摘要。如果有兴趣的话,可以去帖子里看看详细楼层的详细说明。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值