(3623個贊)html
若是執行下面的程序,程序解析兩個間隔1秒的日期字符串並比較:java
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?apache
若是將日期字符串各加一秒:api
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解析了後一次的時間做爲當地的日期和時間致使了差別。oracle
(2480個贊)dom
我一直認爲Java是引用傳遞;然而,我看了一堆博客(例如這篇)聲稱不是這樣的。我認爲我沒有理解它們之間的區別。
給個解釋?
解決方案
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
);
|
換句話說,你的假設是正確的。
(1769個贊)
Java中 HashMap
和 Hashtable的不一樣是什麼?
非多線程應用中使用哪一個更有效率?
解決方案
Java 中 HashMap 和 HashTable 有幾個不一樣點:
Hashtable
是同步的,然而 HashMap
不是。 這使得HashMap更適合非多線程應用,由於非同步對象一般執行效率優於同步對象。
Hashtable 不容許 null 值和鍵。HashMap容許有一個 null 鍵和人一個 NULL 值。
HashMap的一個子類是LinkedHashMap。因此,若是想預知迭代順序(默認的插入順序),只需將HashMap轉換成一個LinkedHashMap。用Hashtable就不會這麼簡單。
由於同步對你來講不是個問題,我推薦使用HashMap。若是同步成爲問題,你可能還要看看ConcurrentHashMap。
(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。
(1574個贊)
在Swing中,密碼字段有一個getPassword()(返回 char數組)方法而不是一般的getText()(返回String)方法。一樣的,我遇到過一個建議,不要使用 String 來處理密碼。
爲何String涉及到密碼時,它就成了一個安全威脅?感受使用char數組不太方便。
解決方案
String是不可變的。這意味着一旦建立了字符串,若是另外一個進程能夠進行內存轉儲,在GC發生前,(除了反射)沒有方法能夠清除字符串數據。
使用數組操做完以後,能夠顯式地清除數據:能夠給數組賦任何值,密碼也不會存在系統中,甚至垃圾回收以前也是如此。
因此,是的,這是一個安全問題 – 可是即便使用了char數組,僅僅縮小了了攻擊者有機會得到密碼的窗口,它值針對制定的攻擊類型。
(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。
(1468個贊)
我有一個數組,初始化以下:
1
|
Element[] array = {
new
Element(
1
),
new
Element(
2
),
new
Element(
3
)};
|
我但願將這個數組轉化成一個ArrayList類的對象。
解決方案
1
|
new
ArrayList<Element>(Arrays.asList(array))
|
(1478個贊)
我有過一個面試,被問到如何產生一個Java內存泄露。不用說,我感到至關傻,甚至如何產生一個的線索都沒有。
那麼怎麼才能產生一個內存泄露呢?
解決方案
在純Java中,有一個很好的方式能夠產生真正的內存泄露(經過執行代碼使對象不可訪問但仍存在於內存中):
應用產生一個長時間運行的線程(或者使用一個線程池加速泄露)。
線程經過一個(可選的自定義)類加載器加載一個類。
該類分配大內存(例如,new byte[1000000]),賦值給一個強引用存儲在靜態字段中,再將它自身的引用存儲到ThreadLocal中。分配額外的內存是可選的(泄露類實例就夠了),可是這樣將加速泄露工做。
線程清除全部自定義類的或者類加載器載入的引用。
重複上面步驟。
這樣是有效的,由於ThreadLocal持有對象的引用,對象持有類的引用,接着類持有類加載器的引用。反過來,類加載器持有全部已加載類的引用。這會使泄露變得更加嚴重,由於不少JVM實現的類和類加載都直接從持久帶(permgen)分配內存,於是不會被GC回收。
(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來完成這個工做,就沒有必要重複製造輪子了。
原文連接: nolsit 翻譯: ImportNew.com - liken
譯文連接: http://www.importnew.com/16841.html
[ 轉載請保留原文出處、譯者和譯文連接。]