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

本文討論了使用Maven和Gradle進行Java項目管理,構建自動化和依賴性解決方案,以比較其方法和優化策略。

本文使用Maven和Gradle之類的工具討論了具有適當的版本控制和依賴關係管理的自定義Java庫(JAR文件)的創建和使用。

本文討論了使用咖啡因和Guava緩存在Java中實施多層緩存以提高應用程序性能。它涵蓋設置,集成和績效優勢,以及配置和驅逐政策管理最佳PRA

本文討論了使用JPA進行對象相關映射,並具有高級功能,例如緩存和懶惰加載。它涵蓋了設置,實體映射和優化性能的最佳實踐,同時突出潛在的陷阱。[159個字符]

Java的類上載涉及使用帶有引導,擴展程序和應用程序類負載器的分層系統加載,鏈接和初始化類。父代授權模型確保首先加載核心類別,從而影響自定義類LOA


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

Atom編輯器mac版下載
最受歡迎的的開源編輯器

Dreamweaver CS6
視覺化網頁開發工具

Dreamweaver Mac版
視覺化網頁開發工具