文章目录
1.面向对象特征
封装
隐藏内部实现 隐藏对象属性和实现细节,仅对外提供公共访问方式。 “变化隔离,提高重用性”。
继承
重用父类代码对现有类进行扩展而不重写它
多态
- 运行时多态通过动态绑定
- 编译时多态通过方法重载
程序定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用是不确定的。
实现条件:
继承,重写,向上转型(eg: Animal a = new Dog())
当超类对象引用变量引用子类对象时,被引用对象的类型而不是引用变量的类型决定了调用谁的成员方法,但是这个被调用的方法必须是在超类中定义过的,也就是说被子类覆盖的方法。
2.Map总结
map:键值对映射的抽象接口,键唯一。
Hashmap(非线程安全)
基于哈希表的map接口实现
- HashMap():构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap
- 底层:散列桶 数组加链表 链表处理冲突,jdk1.8后当hash值相等的元素较多,使用红黑树。
- Hashmap底层数组长度为2^m,(n-1)& hash 为数组中应存储的位置,n为数组长度,hash为计算的hash值。
- 可以存储null值,一个null键
put过程:
(1) key 求hash值
(2) 判断是否碰撞,无则直接放入桶中。
(3) 有则链表链接, >8时转为红黑树,<6转回链表
(4) key值已存在的替换旧的value
(5) 桶满时扩容,resize两倍
get过程:
考虑Hash值相同时,先根据Hash求数组下标,再用equals求得链表中的位置。
ConcurrentHashmap(线程安全)
相比hashtable效率更高,同步时锁定map某个部分,通过Segment数组、HashEntry数组、链表实现
LinkedHashmap(非线程安全)
继承自Hashmap,用链表扩展可Hashmap类,“有序”
维护了一个 双向循环链表。
Treemap(非线程安全)
继承自sortedmap, 有序 key不能为空,基于红黑树,键值通过comparable接口来排序。
HashTable(线程安全)
数组加链表,默认容量:11,不允许key/value为null