Stack Overflow 上人气最旺的 10 个 Java 问题
1、 为什么两个(1927年)时间相减得到一个奇怪的结果?
(3623个赞)
如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较:
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); }
输出是:
353
为什么 ld4-lD3 不是1(因为我希望这两个时间差是一秒),而是353?
如果将日期字符串各加一秒:
String str3 = "1927-12-31 23:54:08"; String str4 = "1927-12-31 23:54:09";
ld4-ld3 的结果是1.
sun.util.calendar.ZoneInfo[id="Asia/Shanghai", offset=28800000,dstSavings=0, useDaylight=false, transitions=19, lastRule=null] Locale(Locale.getDefault()): zh_CN
解决方案
这是上海时区,在12月31日有一个变化。
查阅这个网址来了解上海在1927年时区变化的细节。基本上在1927年年底的午夜,始终会回拨5分52秒。所以“1927-12-31 23:54:08”实际上发生了两次,看起来Java解析了后一次的时间作为当地的日期和时间导致了差异。
2、Java是“引用传递”还是“值传递”?
(2480个赞)
我一直认为Java是引用传递;然而,我看了一堆博客(例如这篇)声称不是这样的。我认为我没有理解它们之间的区别。
给个解释?
解决方案
Java一直是值传递。不幸的是,他们决定把指针叫做引用,因此新人总是被搞晕。因为这些引用也是通过值传递的。
3、一个关于Java += 操作符的问题
(2223赞)
直到今天我认为这个例子:
i += j;
只是一个简写的:
i = i + j;
但如果这样做:
int i = 5; long j = 8;
然而 i = i + j; 没法编译,而 i += j; 就可以编译。
这意味着i += j;
实际上是i = (type of i) (i + j)
的简写么?
解决方案
总有人问这类问题,JLS里有答案。参见 §15.26.2复合赋值运算符。摘录:
E1 op= E2 型的复合赋值表达式等价于 E1 = (T)((E1) op (E2)),这里 T 是 E1 的类型,不同的是 E1 只计算一次。
一个例子,引自 §15.26.2
[...] 下面的代码是正确的:
short x = 3; x += 4.6;
x的结果等于7,因为它等价于:
short x = 3; x = (short)(x + 4.6);
换句话说,你的假设是正确的。
4、HashMap 和 Hashtable 之间的不同?
(1769个赞)
Java中 HashMap
和 Hashtable的不同是什么?
非多线程应用中使用哪个更有效率?
解决方案
Java 中 HashMap 和 HashTable 有几个不同点:
Hashtable
是同步的,然而HashMap
不是。 这使得HashMap更适合非多线程应用,因为非同步对象通常执行效率优于同步对象。- Hashtable 不允许 null 值和键。HashMap允许有一个 null 键和人一个 NULL 值。
- HashMap的一个子类是
LinkedHashMap。所以,如果想预知迭代顺序(默认的插入顺序),只需将HashMap转换成一个LinkedHashMap。用Hashtable就不会这么简单。
因为同步对你来说不是个问题,我推荐使用HashMap。如果同步成为问题,你可能还要看看ConcurrentHashMap。
5、(如何) 读取或者把一个 InputStream 转成一个 String
(1724个赞)
如果你有一个 java.io.InputStream 对象,如处理这个对象并生成一个字符串?
假定我有一个 InputStream
对象,它包含文本数据,我希望将它转化成一个字符串(例如,这样我可以将流的内容写到一个log文件中)。
InputStream
转化成 String 最简单方法是什么?
解决方案
使用 Apache commons IOUtils库来拷贝InputStream到StringWriter是一种
不错的方式,类似这样:
StringWriter writer = new StringWriter(); IOUtils.copy(inputStream, writer, encoding); String theString = writer.toString();
甚至
// NB: does not close inputStream, you can use IOUtils.closeQuietly for that // 注意:不关闭inputStream,你可以使用 IOUtils.closeQuietly String theString = IOUtils.toString(inputStream, encoding);
或者,如果不想混合Stream和Writer,可以使用 ByteArrayOutputStream。
6、为什么Java中的密码优先使用 char[] 而不是String?
(1574个赞)
在Swing中,密码字段有一个getPassword()(返回 char数组)方法而不是通常的getText()(返回String)方法。同样的,我遇到过一个建议,不要使用 String 来处理密码。
为什么String涉及到密码时,它就成了一个安全威胁?感觉使用char数组不太方便。
解决方案
String是不可变的。这意味着一旦创建了字符串,如果另一个进程可以进行内存转储,在GC发生前,(除了反射)没有方法可以清除字符串数据。
使用数组操作完之后,可以显式地清除数据:可以给数组赋任何值,密码也不会存在系统中,甚至垃圾回收之前也是如此。
所以,是的,这是一个安全问题 – 但是即使使用了char数组,仅仅缩小了了攻击者有机会获得密码的窗口,它值针对制定的攻击类型。
7、遍历HashMap的最佳方法
(1504个赞)
遍历HashMap中元素的最佳方法是什么?
解决方案
这样遍历entrySet:
public static void printMap(Map mp) { Iterator it = mp.entrySet().iterator(); while (it.hasNext()) { Map.Entry pair = (Map.Entry)it.next(); System.out.println(pair.getKey() + " = " + pair.getValue()); it.remove(); // avoids a ConcurrentModificationException } }
更多请查阅Map。
8、(如何)从数组创建ArrayList
(1468个赞)
我有一个数组,初始化如下:
Element[] array = {new Element(1), new Element(2), new Element(3)};
我希望将这个数组转化成一个ArrayList类的对象。
解决方案
new ArrayList<Element>(Arrays.asList(array))
9、产生一个Java的内存泄露
(1478个赞)
我有过一个面试,被问到如何产生一个Java内存泄露。不用说,我感到相当傻,甚至如何产生一个的线索都没有。
那么怎么才能产生一个内存泄露呢?
解决方案
在纯Java中,有一个很好的方式可以产生真正的内存泄露(通过执行代码使对象不可访问但仍存在于内存中):
- 应用产生一个长时间运行的线程(或者使用一个线程池加速泄露)。
- 线程通过一个(可选的自定义)类加载器加载一个类。
- 该类分配大内存(例如,new byte[1000000]),赋值给一个强引用存储在静态字段中,再将它自身的引用存储到ThreadLocal中。分配额外的内存是可选的(泄露类实例就够了),但是这样将加速泄露工作。
- 线程清除所有自定义类的或者类加载器载入的引用。
- 重复上面步骤。
这样是有效的,因为ThreadLocal持有对象的引用,对象持有类的引用,接着类持有类加载器的引用。反过来,类加载器持有所有已加载类的引用。这会使泄露变得更加严重,因为很多JVM实现的类和类加载都直接从持久带(permgen)分配内存,因而不会被GC回收。
10、使用Java在一个区间内产生随机整数数
(1422个赞)
我试着使用Java生成一个随机整数,但是随机被指定在一个范围里。例如,整数范围是5~10,就是说5是最小的随机值,10是最大的。5到10之间的书也可以是生成的随机数。
解决方案
标准的解决方式(Java1.7 之前)如下:
import java.util.Random; public static int randInt(int min, int max) { Random rand; int randomNum = rand.nextInt((max - min) + 1) + min; return randomNum; }
请查看相关的JavaDoc。在实践中,java.util.Random 类总是优于 java.lang.Math.random()。
特别是当标准库里有一个直接的API来完成这个工作,就没有必要重复制造轮子了。
Stack Overflow 上人气最旺的 10 个 Java 问题的更多相关文章
- Stackoverflow上人气最旺的10个Java问题(转ImportNew)
本文转自:http://www.importnew.com/16841.html 写的确实太好了 1.为什么两个(1927年)时间相减得到一个奇怪的结果? 如果执行下面的程序,程序解析两个间隔1秒的日 ...
- Stackoverflow上人气最旺的10个Java问题
1. 为什么两个(1927年)时间相减得到一个奇怪的结果? (3623个赞) 如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较: 01 public static void main(Str ...
- Stack Overflow上关于Java Collections的几个常见问题
下面列出Stack Overflow上最常见的几个关于Java Collections的问题并给出答案. 1. 什么时候用LinkedList,什么时候用ArrayList? ArrayList是使用 ...
- 为什么开发者热衷在Stack Overflow上查阅API文档?
摘要:一项新研究跟踪了Android开发者的访问历史,发现开发者多达二分之一的文档是从Stack Overflow上获取到的,而Stack Overflow上的示例也多于官方指南,开发者通过搜索更多时 ...
- Stack Overflow 上排名前十的与API相关的问题
Stack Overflow是一个庞大的编程知识仓库,在Stack Overflow 上,数百万的提问被回答,并且这些回答都是高质量的.这就是为什么在Google搜索结果的排行榜上,Stack Ove ...
- Stack Overflow 上 370万浏览量的一个问题:如何比较 Java 的字符串?
在逛 Stack Overflow 的时候,发现了一些访问量像喜马拉雅山一样高的问题,比如说这个:如何比较 Java 的字符串?访问量足足有 370万+,这不得了啊!说明有很多很多的程序员被这个问题困 ...
- [转帖]Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递?
Stack Overflow上188万浏览量的提问:Java 到底是值传递还是引用传递? http://www.itpub.net/2019/12/03/4567/ 在逛 Stack Overfl ...
- JavaScript超越了Java,c,python等等成为Stack Overflow上最热门的
JavaScript超越了Java,c,python等等成为Stack Overflow上最热门的标签 在2015年6月至今,JavaScript超越了Java,c,python等等成为Stack O ...
- Stack Overflow 上 250W 浏览量的一个问题:你对象丢了
在逛 Stack Overflow 的时候,发现最火的问题竟然是:什么是 NullPointerException(java.lang.NullPointerException),它是由什么原因导致的 ...
随机推荐
- ExtJS4加载FormPanel数据的几种方式
我们做web应用最多的就是处理表单,extjs为我们提供了很多处理表单的功能,很多初学者疑惑怎么加载表单数据,到底能用什么方式加载?本文中,我将我自己实验过的进行一下总结,自己备忘,也希望能帮助到其他 ...
- SQL 返回数量一定的行
1. 限制返回的行 select top 10 * from tablename 2. 返回随机n行 select top n * from tablename order by newid()
- zoj 3761
很简单但很虐心的一道题: 我感觉自己的算法没错,但是老是过不了:= = 但是还是把代码贴出来: 我的方法,用并查集的方式做一课树,然后对树进行遍历: 有多少棵树就有多少个点剩余: #include&l ...
- Error format not a string literal and no format arguments解决方案
原地址: http://blog.csdn.net/joeblackzqq/article/details/25985299 cData.cpp:355:30:error:format not a s ...
- 对 APM 用户的一次真实调查分析(上)
一.前言 国内的 APM 行业这两年刚刚起步,但是在国外却比较成熟了,并且由于这两年人力成本的快速提高,国内外涌现了几家非常不错的 APM 企业,例如,OneAPM,APPdynamic,Dynami ...
- Cassandra命令行CLI的基本使用
启动cassandra-cli服务之后,可以进行CQL的使用. 1. 创建keyspace 可以理解成关系数据库的database [default@testkeyspace] create keys ...
- [转贴]超级懒汉编写的基于.NET的微信SDK
一.前言 特别不喜欢麻烦的一个人,最近碰到了微信开发.下载下来了一些其他人写的微信开发“框架”,但是被恶心到了,实现的太臃肿啦. 最不喜欢的就是把微信返回的xml消息在组装成实体类,所以会比较臃肿,现 ...
- JavaScript实现命令行交互
原文地址: http://www.cnblogs.com/liaoyu/p/js-terminal.html 周末闲着想试试用 JavaScript 模拟命令行交互的功能,希望达到的几个功能点如下: ...
- 基于dojo模板的widget
参考:http://niweiwei.iteye.com/blog/1539863 http://dojotoolkit.org/reference-guide/1.8/dijit/_Template ...
- BZOJ_1626_[Usaco2007_Dec]_Building_Roads_修建道路_(Kruskal)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1626 给出\(n\)个点的坐标,其中一些点已经连通,现在要把所有点连通,求修路的最小长度. 分 ...