首頁 > Java > java教程 > stackoverflow上人氣最旺的10個java問題

stackoverflow上人氣最旺的10個java問題

伊谢尔伦
發布: 2016-11-30 11:39:09
原創
1220 人瀏覽過

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;
登入後複製
🀜 〜〜

  然而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

[...] 下面的程式碼是正確的:

int i = 5;
long j = 8;
登入後複製

  x的結果等於7,因為它等價於:

short x = 3;
x += 4.6;
登入後複製

  是正確的。

  4、HashMap 和 Hashtable 之間的不同?

 (1769個讚)

  Java中 HashMap 和 Hashtable的不同是什麼?

  非多執行緒應用中使用哪個更有效率?

  解決方案

  Java 中 HashMap 和 HashTable 有幾個不同點:

Hashtable 是同步的,然而 HashMap不是。 這使得HashMap更適合非多執行緒應用,因為非同步物件通常執行效率優於同步物件。

Hashtable 不允許 null 值和鍵。 HashMap允許有一個 null 鍵和人一個 NULL 值。

HashMap的一個子類別是LinkedHashMap。所以,如果想預知迭代順序(預設的插入順序),只要將HashMap轉換成一個LinkedHashMap。用Hashtable就不會這麼簡單。

  因為同步對你來說不是個問題,我推薦使用HashMap。如果同步成為問題,你可能還要看看ConcurrentHashMap。

  5、(如何) 讀取或將一個 InputStream 轉成一個 String

  (1724個讚)

  如果你有一個 java.io.InputStreamStreamStream 物件處理這個物件並產生一個處理這個物件?

  假定我有一個 InputStream 對象,它包含文字數據,我希望將它轉換成一個字串(例如,這樣我可以將流的內容寫到一個log檔中)。

  InputStream 轉換成 String 最簡單方法是什麼?

  解決方案

  使用 Apache commons IOUtils庫來拷貝InputStream到StringWriter是一種不錯的方式,類似這樣:

short x = 3;
x = (short)(x + 4.6);
登入後複製
🀜 OutputStream。

  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中,有一个很好的方式可以产生真正的内存泄露(通过执行代码使对象不可访问但仍存在于内存中):

应用产生一个长时间运行的线程(或者使用一个线程池加速泄露)。

线程通过一个(可选的自定义)类加载器加载一个类。

该类分配大内存(例如,new byte[1000000]),赋值给一个强引用存储在静态字段中,再将它自身的引用存储到ThreadLocal中。分配额外的内存是可选的(泄露类实例就够了),但是这样将加速泄露工作。

线程清除所有自定义类的或者类加载器载入的引用。

重复上面步骤。

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


相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板