当前位置: 首页 > Java > 正文

Java问答集锦(一)

关键字:
1 星2 星3 星4 星5 星 (2 次投票, 评分: 5.00, 总分: 5)
Loading ... Loading ...
baidu_share

1. 在设置LANG即可改变Java的默认编码的原因分析的那篇文章发出后,有同事给我反馈其中的这段话:“顺带说一句,其实即使在启动时带上-Dfile.encoding也不会改变Charset.defaultCharset(这个默认编码还是以LC_CTYPE为准),加上这个参数只会改变系统属性中的file.encoding值而已。”

和他测试时的表现不一致,后来我确认才发现这段话是我过于武断的判断了,在这里要纠正为“,-Dfile.encoding是可以生效的,只是在指定的file.encoding没有对应的Charset实现时,会默认为UTF-8,这里要稍微注意的一点是,file.encoding的指定方法和LANG有些不同,LANG通常的语言大集.小集,例如zh_CN.gbk,而file.encoding就直接是语言的小集,例如gbk。“。

问: String.intern那篇文章里关于s1 == s2的那个case,为什么要保证s1.intern是在String s2赋值的那行之前,因为如果String s2赋值是在s1.intern之后,那么即使是在jdk 7中s1 == s2也会是false。

答: 这里的原因是在JDK 7中,当执行String.intern时,如String Pool中没有相同内容的,则会将此内容作为key,而value即为此String对象,在对String进行赋值时,会先在String pool中找是否会相同内容的,有的话则直接就指向改对象,没有就新创建一个对象,因此在那篇文章的case里,如果在String s2赋值之前执行s1.intern,那么String pool里就已经有了”GoodMorning“对应的String对象实例了,也就是s1,因此之后在执行String s2 = “GoodMorning”时,就已经是直接将s1赋给了s2,但调转这行代码后就不一样了。

问:你说之前那个cpu us诡异的case的根本原因是BeanUtils里频繁调用Class.getMethod造成的,那不是很容易出现这个现象?

答:其实出现这个现象不会太容易,原因是如果传入的methodName基本是固定的,那么其实执行String.intern真正放进String pool的并不会多,而在我之前碰到的case里为什么有问题,原因是类似struts之类的结构,通常是会把一个form里的所有域直接填充到对应的对象里去,而如果form里有一些隐藏域,是和每次请求有关的话,那么BeanUtils在执行class.getMethod时传入的methodName可能就是经常变化的,如果这个页面访问量又比较大的话,那就很容易导致String pool性能疯狂下降,建议最好是在用BeanUtils填充对象时,先检查下是否有必要。

本文固定链接: http://www.chepoo.com/java-problem-one.html | IT技术精华网

Java问答集锦(一):等您坐沙发呢!

发表评论