欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

Stackoverflow上人气最旺的10个Java问题(1)

来源: javaer 分享于  点击 5724 次 点评:185

Stackoverflow上人气最旺的10个Java问题(1)


1、为什么两个1927年)时间相减得到一个奇怪的结果?

3623个赞)

如果执行下面的程序,程序解析两个间隔1秒的日期字符串并比较:

  1. public static void main(String[] args) throws ParseException { 
  2.  
  3.     SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
  4.  
  5.     String str3 = "1927-12-31 23:54:07";  
  6.  
  7.     String str4 = "1927-12-31 23:54:08";  
  8.  
  9.     Date sDt3 = sf.parse(str3);  
  10.  
  11.     Date sDt4 = sf.parse(str4);  
  12.  
  13.     long ld3 = sDt3.getTime() /1000;  
  14.  
  15.     long ld4 = sDt4.getTime() /1000
  16.  
  17.     System.out.println(ld4-ld3); 
  18.  

输出是:

  1. 353 

为什么 ld4-ld3 不是1因为我希望这两个时间差是一秒),而是353?

如果将日期字符串各加一秒:

  1. String str3 = "1927-12-31 23:54:08";  
  2.  
  3. String str4 = "1927-12-31 23:54:09"

ld4-ld3 的结果是1.

  1. sun.util.calendar.ZoneInfo[id="Asia/Shanghai"
  2.  
  3. offset=28800000,dstSavings=0
  4.  
  5. useDaylight=false
  6.  
  7. transitions=19
  8.  
  9. lastRule=null
  10.  
  11.   
  12.  
  13. 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赞)

直到今天我认为这个例子:

  1. i += j; 

只是一个简写的:

  1. i = i + j; 

但如果这样做:

  1. int i = 5
  2. 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

[...] 下面的代码是正确的:

  1. short x = 3
  2. x += 4.6

x的结果等于7,因为它等价于:

  1. short x = 3
  2. 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是一种不错的方式,类似这样:

  1. StringWriter writer = new StringWriter(); 
  2. IOUtils.copy(inputStream, writer, encoding); 
  3. String theString = writer.toString(); 

甚至

  1. // NB: does not close inputStream, you can use IOUtils.closeQuietly for that 
  2. // 注意:不关闭inputStream,你可以使用 IOUtils.closeQuietly 
  3. String theString = IOUtils.toString(inputStream, encoding); 

或者,如果不想混合Stream和Writer,可以使用 ByteArrayOutputStream。




相关栏目:

用户点评