文档章节

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

火力全開
粉丝 21
博文 221
码字总数 18789
作品 0
卢湾
高级程序员
百词斩Java程序员面试11个问题,你会几个?2018-04-10

近日,我们在w3cschool app开发者头条上,可以看到百词斩Java程序员面经。 在分享百词斩Java面经前,w3cschool特别给程序员小伙伴们带来一些Java学习干货: 0、学习Java必备的3大神器 如果你...

W3Cschool
04/10
0
0
Top 10 Websites for Advanced Level Java Developers

Stackoverflow Stackoverflow.com is probably the most popular website in the programming world. There are millions of good questions and answers. Learning an API or a programming......

perfectspr
2014/12/11
0
0
解决Fiddler不能监听Java HttpURLConnection请求的方法

在默认情况下,Fiddler不能监听Java HttpURLConnection请求。究其原因,Java的网络通信协议栈可能浏览器的通信协议栈略有区别,Fiddler监听Http请求的原理是在应用程序和操作系统网络通信层之...

小克898
2013/05/18
0
0
关于Java常量定义的一点思考

前言 最近在分析httpclient(v4.2)源码的时候,发现了一个比较有意思的事情,那就是关于java中如何定义常量的问题。我想在Java中定义常量并使用常量是非常非常常见的,那么如此常见的问题,又...

算法与编程之美
2013/05/31
0
5
JDK之JVM中Java对象的头部占多少byte

先做个铺垫: 在32位机器上word size是32bits,CPU一次性处理32bits,在64位机器上word size是64bits,CPU一次性处理64bits。 Data bus size, instruction size, address size are usually ...

汉斯-冯-拉特
06/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发备忘

不安全的“先检查后执行”,代码形式如下: if(条件满足){ //这里容易出现线程安全问题//doSomething}else{//doOther} 读取-修改-写入 原子操作:使用CAS技术,即首先从V中读取...

Funcy1122
今天
0
0
SpringBoot2.0 停机

最近新建了个SpringBoot2.0的项目,因为原来一直使用的是传统的Tomcat部署war包的形式,所以这次SpringBoot内置Tomcat部署jar包的时候遇到了很多问题。其中一个就是因为没有外置的Tomcat容器...

Canaan_
昨天
0
1
Confluence 6 外部参考

一个外部参考的意思是任何站点链接到你 Confluence 的实例。任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考。 在默认的情况下,外部链接的参考链接...

honeymose
昨天
0
0
Android中的设计模式之抽象工厂模式

参考 《设计模式解析》 第十一章 Abstract Factory模式 《设计模式:可复用面向对象软件的基础 》3.1 Abstract Factory 抽象工厂 对象创建型模式 《Android源码设计模式解析与实战》第6章 创...

newtrek
昨天
0
0
Redis | 地理空间(GEO)的一个坑

Redis的地理空间(Geo)是个好东西,轻轻松松的就可以把地图描点的问题处理了, 最近却遇到一个坑...Redis采用的Msater-Slave模式, 运用GEORADIUS在salve读取对应的数据,新增了从节点但是从不返...

云迹
昨天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部