文档章节

Stackoverflow上人气最旺的十个Java问题

火力全開
 火力全開
发布于 2016/10/05 18:30
字数 1958
阅读 5
收藏 0

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 有几个不同点:

  1. Hashtable 是同步的,然而 HashMap不是。 这使得HashMap更适合非多线程应用,因为非同步对象通常执行效率优于同步对象。
  2. Hashtable 不允许 null 值和键。HashMap允许有一个 null 键和一个 NULL 值。
  3. 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中,有一个很好的方式可以产生真正的内存泄露(通过执行代码使对象不可访问但仍存在于内存中):

  1. 应用产生一个长时间运行的线程(或者使用一个线程池加速泄露)。
  2. 线程通过一个(可选的自定义)类加载器加载一个类。
  3. 该类分配大内存(例如,new byte[1000000]),赋值给一个强引用存储在静态字段中,再将它自身的引用存储到ThreadLocal中。分配额外的内存是可选的(泄露类实例就够了),但是这样将加速泄露工作。
  4. 线程清除所有自定义类的或者类加载器载入的引用。
  5. 重复上面步骤。

这样是有效的,因为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来完成这个工作,就没有必要重复制造轮子了。

 

原文链接: nolsit 翻译: ImportNew.com - liken
译文链接: http://www.importnew.com/16841.html

本文转载自:http://www.importnew.com/16841.html

火力全開
粉丝 23
博文 241
码字总数 19372
作品 0
卢湾
高级程序员
私信 提问
50 个 Java 开发常见错误及规避技巧 (Part 2)

在上一篇文章中,我们介绍了20种常见的编译器错误,并就如何避免这些错误做了说明。现在,我们将重点转移(尽管不只是专注于某一块),来探讨一下运行时异常以及导致这些异常的原因。接下来我...

oschina
2017/06/22
3.8K
1
Java 已死?听听这些重量级大咖是怎么说的

在 Java 的世界发生了什么事?事实上,很多。Java 9 在 9 月将会来临,Jigsaw 终于获批,而 Java 大咖正在给我们提供关于这一编程语言的未来的有价值的洞察。在这分为 3 部分的访谈系列中,我...

oschina
2017/07/13
5.1K
17
50 个 Java 开发常见错误及规避技巧 (Part 1)

在开发 Java 软件时可能会遇到许多类型的错误,但大多数可以避免。 我们列举了 50 个最常见的 Java 软件错误,其中包含代码示例和教程,以帮助您解决常见的编码问题。 更多关于编写更好的 Ja...

oschina
2017/06/21
6K
12
JavaScript 仍然位居榜首,TypeScript 也不甘落后

根据以开发人员为中心的分析公司RedMonk的2018年第一季度排名,JavaScript仍然是最受欢迎的编程语言,但微软提供的两款产品正在稳步增长。 RedMonk的排名是基于GitHub中的pull请求和在开发人...

周其
03/11
4.6K
4
为什么我不再向 Stackoverflow 社区贡献

曾有一段时间我活跃于StackOverflow(和更大的StacExchange)。可是现在我不再参与这些社区,原因如下。 引言 我在StackOverflow有一个账号。点击该链接你能查看到一些数据: 直到我写这篇文...

oschina
2014/01/01
23.5K
42

没有更多内容

加载失败,请刷新页面

加载更多

在PC上测试移动端网站和模拟手机浏览器的5大方法

总结很全面,保存下来以备不时之需。原文地址:https://www.cnblogs.com/coolfeng/p/4708942.html

kitty1116
26分钟前
1
0
分布式Session共享解决方案

分布式Session一致性? 说白了就是服务器集群Session共享的问题 Session的作用? Session 是客户端与服务器通讯会话跟踪技术,服务器与客户端保持整个通讯的会话基本信息。 客户端在第一次访...

Java干货分享
31分钟前
4
0
开源软件和开源模式面临的生存危机

导读 开源模式可能正面临一场危机。越来越多的开源软件和平台被大型云计算服务商融入自家的云服务体系,并以此获利颇丰,但并不支付费用,也没有对开源社区做出相应的回馈。而实际上,大部分...

问题终结者
33分钟前
3
0
让看不见的AI算法,助你拿下看得见的广阔市场

人工智能技术的飞速发展给各行各业都带来了深远的影响,AI已被视为企业提升运营效能、应对市场竞争的必经之路。然而对于一些企业而言,让AI真正实现落地和应用,并且创造价值,仍是一件需要努...

个推
38分钟前
2
0
用SAN还是NAS?我来告诉你

存储区域网络(SAN)是以一种结构连接的存储,通常通过交换机连接,使许多不同的服务器能够轻松访问存储设备。从服务器应用程序和操作系统的角度来看,访问SAN中的数据存储或直接连接的存储之间...

linux-tao
41分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部