StackOverflow(后边简称so)发展到目前,已经成为了全球开发者的金矿。它能够帮助我们找到在各个领域遇到的问题的最有用的解决方案,同时我们也会从中学习到很多新的东西。这篇文章是在我们审阅了so上最流行的Java问题以及答案后从中挑出来的。即使你是一个有丰富经验的开发者,也能从中学到不少东西。
分支预测
SO上最多投票的一个Java问题是:为什么处理一个排序数组要比非排序数组快的多。为了回答这个问题,你需要使用分支预测(branch prediction)。分支预测是一种架构,旨在通过在真实的路径发生前猜测某一分支的下一步来提升处理过程。
分支在这里即一个if语句。这样的话,如果是一个排序数组,那么分支预测将会进行,否则不会进行。Mysticial(so上的一个回答者)试图使用铁路和火车来简单介绍这个概念。假设你在铁轨连接处要决定火车要走哪条路,你会选择左边还是右边?你可以拦住火车,然后问司机该往那里,但是这样会让整个过程变慢。因此你只能去猜正确的方向,那么如何去猜呢?最好的办法就是通过观察目前这个火车每次经过时的路线,推测出正确的方向。
这就是分支预测:识别模式并使用它。
不幸的是,这个问题的提问者是分支预测失败的受害者。因为他的分支没有任何可以识别出的模式,所以预测出的行为是随机的。
Java中的安全
另一个流行的Java问题是:为什么在Java中有关密码的地方更加喜欢使用char[]而不是String?其实原始的问题更加具体一些,就是问的在Swing中,password控件有一个getPassword方法(返回char[]而不是getText()返回的String)。
其实这里不用惊讶-这是一个安全问题。String是不可变的,意味着一旦它被创建了,那么你就不可能去修改它。这也意味着在GC之前,你对这些数据不能做任何处理。因此,只要有人能够访问你的内存,那么String就有可能被他获取到。
这也就是为什么要使用char数组。你可以显示地清除数据或者覆盖它。这样密码这种敏感数据即使GC还没有进行也不会再在系统留下痕迹。
异常
即使很多开发者倾向于忽略对受检异常的处理,SO上仍然有很多关于异常的问题。其中一个最流行的问题是:什么是NullPointerException,我该怎么处理它?对此,我们并没有感到惊讶,因为这个问题也是在生产环境的Java应用中排名第一的异常。
实际上,当NullPointerException(或者其他exception)在系统出现的时候,我们可以发出一个告警。因为这种异常一般情况下都是业务代码逻辑有问题造成(笔者注)。
为什么这段代码使用随机字符串打印出了”hello world”
问题链接:http://stackoverflow.com/questions/15182496/why-does-this-code-using-random-strings-print-hello-world
这个问题给出了下面的代码,并打印出了”hello world”
System.out.println(randomString(-229985452) + " " + randomString(-147909649));
public static String randomString(int i){
Random ran = new Random(i);
StringBuilder sb = new StringBuilder();
while (true)
{
int k = ran.nextInt(27);
if (k == 0)
break;
sb.append((char)('`' + k));
}
return sb.toString();
}
其实,选择一组随机的整数并不是随机的。给定一个seed参数(在这个例子中是-229985452和-147909649), 那么每次随机,同样的seed则会产生同样的输出。
Random(-229985452).nextInt(27)产生的前六个数字:8, 5, 12, 12, 15, 0
Random(-147909649).nextInt(27)产生的前六个数字:23, 15, 18, 12, 4, 0
这样,最终输出的就是”hello world”。
为什么两个时间戳相减(in 1927)得出一个奇怪的结果?
问题链接:http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result
public static void main(String[] args) throws ParseException {
SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String str3 = "1927-12-31 23:54:07";
String str4 = "1927-12-31 23:54:08";
Date sDt3 = sf.parse(str3);
Date sDt4 = sf.parse(str4);
long ld3 = sDt3.getTime() /1000;
long ld4 = sDt4.getTime() /1000;
System.out.println(ld4-ld3);
}
按说上面的代码最后的结果应该是1,但实际的输出却是353。其实,这是一个时区的问题。1927年12月31号24:00,上海时间往回调整了5分钟52秒,因此”1927-12-31 23:54:08”发生了两次,Java将后面一次实例化成了本地的这个时间。因此和前一秒的差距成了353。
我们需要指出,如果你试着来运行这段代码,结果并不一定是353。Jon Skeet指出了这一点,在时区数据库项目2014版中,这个改变的时间点改到了1900-12-31,因此成了344秒的差距。
无法被捕获的ChuckNorrisException
问题链接:http://stackoverflow.com/questions/13883166/uncatchable-chucknorrisexception
这里有一个很明显的问题:如果有exception被抛出,但是没有任何办法去catch,那么应用会崩溃吗?或者如这个问题所问:是否可以写一段Java代码让一个假设的java.lang.ChuckNorrisException无法被捕获。
答案是可以,但是这里有一个”但是”。你可以编译一段代码抛出一个ChuckNorrisException,但是在Runtime时动态生成一个并不继承于Throwable接口的ChuckNorrisException类。当然,为了让这个过程可以进行,你需要关闭掉字节码验证。jtahlborn给出了完整的解决办法。
哈希表
哈希表是另外一个在SO上流行的问题系列。许多用户都想要知道所有集合类之间的区别,什么时候该使用哪种集合。
迭代顺序是主要考虑的因素。使用HashMap则忽略了所有的顺序信息,也就是获取元素的顺序和你插入元素的顺序是没有任何关系的;使用TreeMap则会得到一个排序好的迭代集合;使用LinkedHashMap则是一个FIFO的顺序。
如果你还是对这些感到困惑,这里有一个相关说明的图表可以参考(Rebel Labs制作)。
总结
对于Java,其实关键的不在于你懂多少,而是在于你可以一直学到更多的东西。StackOverflow不仅在code上的一些问题可以帮助我们,也有助于我们回过头来去深入地学习一些我们已经知道的知识。
该文章转自:
http://www.iteye.com/news/31784
- 大小: 436.2 KB
分享到:
相关推荐
在Java编程中,`java.lang.StackOverflowError` 是一个常见的运行时异常,它通常发生在程序执行过程中,当Java虚拟机(JVM)的调用栈溢出时。调用栈是每个线程用来存储方法调用信息的数据结构,当递归调用过深或者...
stackoverflow java mobi 电子书 ebook java学习好资料
堆栈溢出 ...在此项目中,questions文件夹是带有的问题样本,如果要查找帖子,则应使用链接: https://stackoverflow.com/questions/<id> : https://stackoverflow.com/questions/<id> 。 执照 免费软件:
10. **性能优化**:Java的性能调优是另一个热门话题,包括JVM内存配置、垃圾回收策略、代码优化等。开发者在Stack Overflow上交流如何提升Java应用的性能。 总的来说,"stackoverflow-java"是一个宝贵的资源,它...
本压缩包“StackOverflow:包含样本以支持StackOverflow答案”显然是为了帮助用户更好地理解和应用在StackOverflow上找到的解决方案。下面我们将详细探讨与这个主题相关的C#编程知识。 首先,C#是一种面向对象的编程...
这七个页面很可能包含了Java编程的基础知识、进阶主题,以及解决上述人气问题的具体方法。通常,这类文档会涉及内存管理、多线程、异常处理、性能优化、集合框架、IO流、网络编程、设计模式等核心内容。 基于这些...
转载须知以下所有文章全部都是鸭哥(公众号:鸭哥聊Java)的原创,转载在文首注明出处: : ,如发现恶意抄袭/搬运,会通过法律武器维护自己的权益。热门问题公众号如果大家想要实时关注我更新的文章以及分享的干货的...
突出显示接受的Stackoverflow / Stack Exchange绿色复选标记,这个问题并不是最有效的答案 接受的答案并不总是最好的答案!这个扩展可能会有更好的警告。 支持语言:English
堆栈溢出问题在问题文件夹中是带有的项目,如果要查找该帖子,则应使用链接: https://stackoverflow.com/questions/<id> : https://stackoverflow.com/questions/<id> 。问题您只应报告此存储库中托管的代码有问题...
使用这个标签可以(在StackOverflow上)查找有关 Java 编程语言或者 Java 平台工具的问题。 Java 是一种高性能、跨平台、面向对象的编程语言和运行环境。Java 大部分语法起源于 C 和 C++,但是其对象模型比 C++ ...
在StackOverflow这个全球知名的编程问答社区中,用户们分享了丰富的技术知识和经验。...在StackOverflow的这个压缩包文件"stackoverflow-main"中,你可以找到这些宝贵的知识点的详细记录,供你学习和参考。
matlab按行归一化代码从StackOverflow中提取的用于分类和聚类的短文本数据集 注意: 如果您使用此短文本数据集,请引用我们的论文: [1]。 2015NAACL-“通过卷积神经网络的短文本聚类” 并感谢Kaggle使数据集可用。 ...
标题 "适用于 Firefox OS 的 Stackoverflow 应用程序" 暗示了我们正在讨论一个专为 Firefox 操作系统(Firefox OS)开发的应用程序,该应用是 Stack Overflow 社区的本地化版本。Stack Overflow 是一个知名的在线...
Back2stackoverflow 从机器翻译的站点重定向到stackoverflow.com的用户脚本。 必需的或或或其他支持用户脚本支持的浏览器扩展。 支持的站点: Qaru.site (关闭?) fooobar.com askdev.info ubuntugeeks.com ...
11. **Spring框架**:Java企业级开发中广泛使用的IoC和AOP框架,包括依赖注入、事务管理、Spring MVC等。 12. **数据库操作**:JDBC基础,以及与MySQL、Oracle等数据库的交互。 13. **网络编程**:TCP/IP协议、套...
当遇到一个Stack Overflow上的问题时,你需要仔细阅读问题描述,确保你完全明白提问者所面临的问题。这包括他们遇到的错误消息、他们的代码片段以及他们已经尝试过的解决方案。分析问题的上下文,可以帮助你判断问题...
StackOverflow是一个程序员问答社区,其中蕴含了大量的编程问题、答案和讨论,这些数据对于分析编程趋势、了解热门技术以及解决编程问题非常有价值。 JavaScript作为Web开发的主要语言之一,其在数据可视化领域的...
stackoverflow-Java-top-qa 对stackoverflow上Java相关、投票数TOP100的问答进行翻译,欢迎点star,我们会持续更新!!! 为了让“翻译”更有意义,给阅读者带来更多、更有效的收获,我们会有一些加工: 例如,对问题...
这是基于StackOverflow网站的thinknetica.com课程的测试项目 需要什么: Ruby版本-2.2.0 Rails版本-4.2.1 数据库-Postgres v9.3 查找config / database.yml.example并将文件名更改为database.yml
在StackOverflow中,一个问题通常会有多个回答,而被提问者或社区认可的那个答案会被标记为“接受”,并显示一个绿色的复选标记,表示这个问题已经得到了满意的解答。 "Accepted Answer Has Less Votes-crx插件"是...