一些关于JAVA的冷门知识

   Java冷知识是指Java里面一些貌似不起眼,却容易出错的地方,最近开发中也遇到一些问题,写下来一起分享。

1、Integer还是int

    大家都知道基本类型和装箱类型。先来看这段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public class Item {                                            private Integer id;                                            public Integer getId() {             return id;         }     }                                        public int getInt(Item item) {         if (item != null) {             return item.getId();         } else {             return 0;         }     }

这里在运行时,12行抛出了空指针异常。也许很多人会纳闷:我明明做了空指针检查了啊?很可惜,这里的空指针不是item.getId()抛出的,而是在return的时候,Java会对Integer对象进行拆箱,但是拆箱的时候,如果对象为null,是会抛空指针异常的!Java拆箱的异常极其具有迷惑性,应当注意。



2、Map的遍历

   对于一个Map,我使用map.put(key,null)之后,有没有改变map的内容?答案是有的,虽然map.get(key)仍然会返回null,但是在遍历EntrySet和KeySet的时候都会有内容,map.containsKey(key)也会返回true。所以在构建map的时候,如果确认某一项没有添加的意义,请不要将null值填进去。



3、序列化的陷阱

   其实这个不算是冷知识了,应该说还挺重要的。

   首先,序列化只会序列化对象不会序列化类,它会在序列化结果中用一部分区域来保存对象的类签名(注意仅仅是签名),如果反序列化的时候,JVM找不到这个类,会无情的抛出ClassNotFoundException。

   其次,如果序列化和反序列化时,类的字段发生了变化,也没有太大关系,Java会尝试对能够匹配的字段进行赋值,这点不得不说还是很高级的!当然,如果你改变了字段的类型,比如序列化的字段是个String,你给改成了int,那就会收到InvalidClassException。

   总之一句话,Java的序列化是按照签名(当然还有序列化Id来)序列化对象的。

猜你喜欢

转载自fyzg68.iteye.com/blog/2031064