SCJP笔记(二)

1、可变长参数总是最后匹配。

2、多态只适合于方法,并不适用于变量。

3、多态进行方法参数的匹配时,先加宽,后装箱,并不能加宽并装箱。

4、hashCode决定了Object在HashMap中的位置,equals决定改位置上是否有相等的对象,所以,只有这两个方法的返回值都相等时,才会在HashMap中判定为重复。

5、Object放入HashMap中后,如果进行了会导致hashCode改变的操作,会导致找不到该Object。

6、只有当“+”两边至少有一个字符串时,才会进行连接操作,如42+1+a=43a。

7、静态初始化化块只在加载类的时候执行一次,非静态初始化块会在父类构造方法结束后紧跟着执行。

8、有多个构造方法时,public的无参构造方法最好手动补全,不然子类在继承时,会有一点小痛苦,毕竟编译器会自动查找的只有无参的构造方法,除非你故意这么做。

9、静态导入使用import static ,且要导入精确的成员或者使用“*”。

10、静态内部类只能使用 类名.内部类 变量名=new 类名.内部类()。

11、内部类的查找顺序:局部内部类,成员内部类。当有重名的内部类时,你会知道先执行哪一个。

12、泛型因为存在“类型擦除”,所以在JVM中,它们是不带类型信息的,所以,为了安全考虑,只能放入声明的类型,例如,Cat,Dog都是Animal,如果List<Animal>中放入了Cat与Dog,我们怎么才能确定取到的究竟是谁?

13、泛型的类型信息(<?>)被看做final的,不允许更改并且必须初始化,但是允许在上下限范围内变动,如:public void set(List<A> list){list = new ArrayList<Object>();}是不允许的,但是public void set(List<? entends Parent> list){list = new ArrayList<Child>();}与public void set(List<? super Child> list){list = new ArrayList<Parent>();}是允许的。

14、如果类的定义中有引用类型的实例变量,那么这个类也应实现Serializable接口,除非这个引用没有指向new出的对象,否则会跑出NotSerializableException而不是编译错误。

15、如果子类实现了Serializable接口而父类没有实现,则反序列化时会调用父类的构造方法(你觉得会调用哪一个构造方法呢?)。

16、多态在运行时虽然会调用子类的实现,但是,有时候你必须去捕获父类抛出的异常。

17、字符串在初始化时,是编译器放入常量池中的,并不是在执行期创建一个新的对象。

18、访问静态变量的非静态方法,由于运行在不同的实例上,所以并不会阻塞。要想做到线程安全,应该将其改为静态方法。

19、Collections.binarySearch()需要对传入的list进行排序,否则返回的结果将是不确定的,如放入的顺序是{“b”,“c”,“a”},你将找不到“a”,这是由二分法的算法特性决定的。

 

你可能感兴趣的:(jvm,算法)