关于 疯狂java 程序员基本功的16课 随笔
读 疯狂java 程序员基本功的16课 总结
1,
实例变量(非 static)无论在什么地方声明和赋值,都会被 编译到 构造方法里面进行真正的定义和赋值,源代码里构造方法里面的变量最后执行。
类变量(static)在类初始化时赋初值,而 new 只是单纯的调用 构造方法,无论这个类是否已经初始化完毕(比如,在 A 类中 定义一个 A 类型的类(static)变量)
如果是 final 类型的,只有在定义时直接赋值,才会有 宏 的特性;
当 new 一个子类时,
父类调用的方法被 子类重写过,那么实际上执行的是子类的方法;
父类调用的变量恰好和子类同名同类型时,那么实际上还是调用的是父类的变量;
2,
HashSet 的 底层 是 HashMap,java把 HashSet 的 元素作为 HashMap 的 key,而这个 HashMap 的 value 是一个Object 对象,之所以说 HashSet 集合无序且不可重复,因为 HashMap的 key 无序且不可重复,当 key 重复时,会覆盖这个 key 对应的 value,但是不会重新覆盖原有的 key ,当然,我们可以使用 LinkedHashMap 来解决 顺序问题
TreeSet 的底层 是 TreeMap ,java把 TreeSet 的 元素作为 TreeMap 的 key,而这个 TreeMap 的 value 是一个Object 对象,之所以说 TreeSet 集合可以 自动排序或者 自定义排序 且不可重复,因为 HashMap的 key 可以 自动排序或者 自定义排序 且不可重复,当 key 重复时,会覆盖这个 key 对应的 value,但是不会重新覆盖原有的 key ,这里之所以会自动排序或者自定义排序,是因为 TreeMap 的数据结构是 红黑树
HashMap 的无序特性是因为 java 是采用 hashCode 对 key 进行存储,所以不会按照 插入 的顺序来存储元素,并且 HashMap 还会对 元素进行自动扩容,一旦自动扩容,那么所有元素的 hashCode 就要重新定义,所以扩容前和扩容后的 顺序也不同。
HashMap的不可重复的特性 是由 源码 决定的,通过比较 hashCode 和 (== 运算符 或者 equals方法)
TreeMap 的不可重复的特性 是由 Comparable 比较器决定的(可自定义比较方法 或者 采用默认方法)