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

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

Nov 30, 2016 am 11:39 AM
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";  
    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来完成这个工作,就没有必要重复制造轮子了。


本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解鎖Myrise中的所有內容
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

Java 中的完美數 Java 中的完美數 Aug 30, 2024 pm 04:28 PM

Java 完美數指南。這裡我們討論定義,如何在 Java 中檢查完美數?

Java 中的隨機數產生器 Java 中的隨機數產生器 Aug 30, 2024 pm 04:27 PM

Java 隨機數產生器指南。在這裡,我們透過範例討論 Java 中的函數,並透過範例討論兩個不同的生成器。

Java中的Weka Java中的Weka Aug 30, 2024 pm 04:28 PM

Java 版 Weka 指南。這裡我們透過範例討論簡介、如何使用 weka java、平台類型和優點。

Java 中的史密斯數 Java 中的史密斯數 Aug 30, 2024 pm 04:28 PM

Java 史密斯數指南。這裡我們討論定義,如何在Java中檢查史密斯號?帶有程式碼實現的範例。

Java Spring 面試題 Java Spring 面試題 Aug 30, 2024 pm 04:29 PM

在本文中,我們保留了最常被問到的 Java Spring 面試問題及其詳細答案。這樣你就可以順利通過面試。

突破或從Java 8流返回? 突破或從Java 8流返回? Feb 07, 2025 pm 12:09 PM

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

Java 中的時間戳至今 Java 中的時間戳至今 Aug 30, 2024 pm 04:28 PM

Java 中的時間戳記到日期指南。這裡我們也結合範例討論了介紹以及如何在java中將時間戳記轉換為日期。

創造未來:零基礎的 Java 編程 創造未來:零基礎的 Java 編程 Oct 13, 2024 pm 01:32 PM

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

See all articles