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

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

(3623个赞)

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


1

2

3

4

5

6

7

8

9

10

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

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

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


1

2

String str3 = "1927-12-31 23:54:08"

String str4 = "1927-12-31 23:54:09";

ld4-ld3 的结果是1.


1

2

3

4

5

6

7

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赞)

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


1

i += j;

只是一个简写的:


1

i = i + j;

但如果这样做:


1

2

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

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


1

2

short x = 3;

x += 4.6;

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


1

2

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是一种不错的方式,类似这样:


1

2

3

StringWriter writer = new StringWriter();

IOUtils.copy(inputStream, writer, encoding);

String theString = writer.toString();

甚至


1

2

3

// 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


1

2

3

4

5

6

7

8

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个赞)

我有一个数组,初始化如下:


1

Element[] array = {new Element(1), new Element(2), new Element(3)};

我希望将这个数组转化成一个ArrayList类的对象。

解决方案


1

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 之前)如下:


1

2

3

4

5

6

7

8

9

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

时间: 2024-10-27 12:01:56

Stackoverflow上人气最旺的10个Java问题的相关文章

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"

从stackoverflow上的一个问题看Java动态绑定

我们先来看stackoverflow上的一个问题,先上代码 1 public class Piece{ 2 public static void main (String [] args){ 3 Piece p2 = new Knight(); 4 Knight p1 = new Knight(); 5 p1.capture(p2); 6 p2.capture(p1); 7 } 8 public void capture(){ 9 System.out.println("Capture"

WMware 10 上安装Mac OS X 10.9 系统的正确方法

最近需要在iPad上做一个App,于是想在虚拟机中安装一个OS X 10.9试用一下.经过几十次的尝试趟过很多坑后,终于找到了在WMware 10 上安装Mac OS X 10.9 系统的正确方法.本方法不需要什么U盘,而且由于所有操作都在硬盘上,所以速度也会很快. 需要准备的工具和文件如下: VMware-workstation-full-10.0.1-1379776.exe unlock-all-v130.zip Install OS X Mavericks.dmg(大小为 4.94G) U

【坐在马桶上看算法】算法10:二叉树

二叉树是一种特殊的树.二叉树的特点是每个结点最多有两个儿子,左边的叫做左儿子,右边的叫做右儿子,或者说每个结点最多有两棵子树.更加严格的递归定义是:二叉树要么为空,要么由根结点.左子树和右子树组成,而左子树和右子树分别是一棵二叉树. 下面这棵树就是一棵二叉树. 二叉树的使用范围最广,一棵多叉树也可以转化为二叉树,因此我们将着重讲解二叉树. 二叉树中还有连两种特殊的二叉树叫做满二叉树和完全二叉树.如果二叉树中每个内部结点都有两个儿子,这样的二叉树叫做满二叉树.或者说满二叉树所有的叶结点都有同样的深

我发现:在StackOverflow上拯救歪果仁十分有意思!

菊长:火星特工们!今天是周五了,大家有什么提议? BeJavaGod:报告菊长!我发现,在StackOverflow上拯救歪果仁十分有意思! 噗哈哈,时不时遇到问题会使用到StackOverflow,上面汇聚了各路大神的各种精妙解答,不论是java,ios,android,js,.net,各种问题都有解答,当然遇到问题也能上StackOverflow来搜一下,很多问题都能迎刃而解 但是有没有突发奇想来找一些问题来回答呢?个人觉得在上面写写英文还是不错的,一方面保持自己英文水平,虽然说不上提高(曾

史上自定义 JavaScript 函数Top 10

史上自定义 JavaScript 函数Top 10 http://www.dustindiaz.com/top-ten-javascript/ 发布:wpulog | 发布时间: 2010年4月9日 10个被使用的最普遍的用户自定义函数,addEvent(),addLoadEvent(),getElementsByClass(),getCookie(),setCookie(), deleteCookie()等. 10) addEvent() function addEvent(elm, evTy

老码农教你在 StackOverflow 上谈笑风生

作为一个高大上的码农,你肯定用到过 StackOverflow,必须的.会有人否定这个断言么?那他恐怕不是真正的码农,或者说还没入门.StackOverflow 对于码农的重要性,基本就和诸葛亮对刘备的重要性差不多,它上知 Java 下知 MySQL,中间懂得各种算法.只要你拥有与它沟通的技巧,它几乎可以回答你遇到的任何技术问题. 不过,很多码农对它的体验也就仅限于此了.查询一下,找到问题,然后把里边的代码复制粘贴到自己的 IDE 里,然后接着调试代码.万一没有找到符合的条目,就只好去其他地方问

stackoverflow上关于iOS的票数最多(最常见)的15个问题

搞编程做项目的,没碰到bug.遇到问题,基本不可能.stackoverflow就是一个大型的开放的FAQ平台,你是问题制造者,也是答案提供者.本文列出至今stackoverflow上关于iOS的票数最高(最常见)的15个问题,仅为了大家能够更方便.直接.快速的找到自己想要的答案,也许其中某个(些)问题就是你已经碰到或者即将碰到的. (这里的答案都是简单描述,有需要的话可以进入问题原页面查看详细答案) 一.怎么把UILabel的内容竖直方向靠上排列 我们都知道NSTextAlignment有五个值

Stackoverflow 最受关注的 10 个 Java 问题

Stack Overflow 是一个大型的编程知识库.在 Stack Overflow 中已经有数以百万计的问题,并且很多答案有着很高的质量.这就是为什么 Stack Overflow 的答案经常位于 Google 搜索结果的顶部. 尽管 Stack Overflow 上很多问题已经有了答案,每天还是会有很多问题被提出,很多问题仍然没有被回答或者没有获得满意的答案.那么当 Stack Overflow 不能解决问题时如何去寻找答案. 随着成千上万的程序员使用 Java APIs 并在 Githu