Posted on February 16th, 2017
Posted on February 6th, 2015
今天遇到另一個 Java 的地雷,
而且一個非常簡單的一個程式碼就會吐出 OOM 錯誤:
java.lang.OutOfMemoryError: Java heap space
int fileLength = 170 * 1024 * 1024;
byte[] b2 = new byte[fileLength];
Array 不能且不應該產生這麼長的 instance, 因為會超過 java 的 default heap size.
當然可以去改 jvm 參數將 heap size 加大,
但這並不是一個長遠之計,
改天再遇到更大的檔案一樣會 OOM
這次因為想要打亂檔案的 header ,
所以求快直接使用這種方法比較簡單... 囧
byte[] b2 = new byte[b.length];
for (int i = 0; i < b.length; i++) {
b2[i] = (byte) (b[i] + k);
}
return b2;
abc
Posted on January 21st, 2015
這次遇到一個簡單到不行的 Java 小地雷,
實作物件的 equals()
時, 若要比對 non-
primitive
type 的 Integer
, Long
, Double
等物件數值,
請記得使用 equals()
不要用 ==
,
或者自己將 Integer.intValue()
或 Long.longValue()
拿出來再用 ==
比
不然 boolean eq = new Integer(1) == new Integer(1)
會永遠給你 false
,
除非夠幸運兩個 Object
發生 conflict XD
這是 Integer.equals(obj)
的實作, 也就是為什麼 equals(obj)
才會正確的原因
private final int value;
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
另外參考了 stackoverflow Compare non-
primitive
Long values 127 and 128 後, 發現 -128
到 127
之間的數值 jvm 會先 cache 起來 ,
如下程式碼:
Long a = Long .valueOf(127);
Long b = Long .valueOf(127);
boolean eq = a == b; // 是 true
Long a = Long .valueOf(128);
Long b = Long .valueOf(128);
boolean eq = a == b; // 是 false
boolean eq = new Long(1) == new Long(1); // 但這一樣永遠是 false !
用 ==
去比較 new Long(long)
的數值都不會相等,
用 ==
去比較 Long.valueOf(long)
的數值只有在 -128 到 127 之間會相等
所以若要比較 non-
primitive
type (ex: Integer
, Long
, Double
) 的數值, 請用 equals(obj)
Posted on February 27th, 2014
Notes from my experience.