Stackoverflow上人气最旺的10个Java问题(1)
Stackoverflow上人气最旺的10个Java问题(1)
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 有几个不同点:
因为同步对你来说不是个问题,我推荐使用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。
用户点评