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的值不是在编译期决定,而是在运行期决定。