1.-2147483648和-(2147483648)是否相等?
分析:
因为int的数值分布是不对称的,并且2147483648已经超过了Integer.MAX_VALUE,他是Integer.MIN_VALUE的字面常量。
因此2147483648只能作为一元负操作符的操作数出现。
public class PuzzleDemo86{
public static void main(String args[]){
int i = -2147483648;
System.out.println(i);
}
}
2.精度丢失问题:
int或long转型成float,或long转型为double会导致精度丢失。
public class PuzzleDemo87{
public static void main(String args[]){
System.out.println("Double.NaN==Double.NaN:"+(Double.NaN==Double.NaN));
long v1 = Long.MAX_VALUE;
float f = (float)v1;
long v2 = Long.MAX_VALUE-1;
System.out.println("v1==f:"+(v1==f));
System.out.println("f==v2:"+(f==v2));
System.out.println("v1==v2:"+(v1==v2));
}
}
3.List和List<Object>是不同的
4.避免在用泛型的代码中参杂原始类型。
5.在设计内部类时,需要考虑这个类是否需要使用外围类实例,如果不是,则建议使用静态内部类。
6.不能扩展一个内部类。
7.HashSet结构解析
readObject方法调用了HashMap的put方法,因此也就调用了hashCode方法。
private void readObject(java.io.ObjectInputStream s)
throws java.io.IOException, ClassNotFoundException {
// Read in any hidden serialization magic
s.defaultReadObject();
// Read in HashMap capacity and load factor and create backing HashMap
int capacity = s.readInt();
float loadFactor = s.readFloat();
map = (((HashSet)this) instanceof LinkedHashSet ?
new LinkedHashMap<E,Object>(capacity, loadFactor) :
new HashMap<E,Object>(capacity, loadFactor));
// Read in size
int size = s.readInt();
// Read in all elements in the proper order.
for (int i=0; i<size; i++) {
E e = (E) s.readObject();
map.put(e, PRESENT);
}
}
8.在readObject中,避免直接或间接的在正在进行反序列化的对象上调用任何方法。因为可能会调用被覆写的方法。
9.常量表达式的规定:
形如 static final 的常量在被调用时是在编译期将他转换成对应常量的。其他的不管常量还是变量都是在运行期决定值的。
比如:
package a; class A{ public static void main(){ int a = B.B1; //在这里,编译期就将B.B1转换成"b1"; } } package b; class B{ public static final String B1 = "b1"; } |
10. 私有成员不能被继承。
11.null不是一个编译期的常量表达式,
因此如果
String str = null;
System.out.print(str);则str的值不是在编译期决定,而是在运行期决定。