基础与框架-java面试

2018-11-29  本文已影响0人  basicGeek

引用参考
https://segmentfault.com/a/1190000004527951

父类的静态变量
父类的静态初始化代码块
子类的静态变量
子类的静态初始化代码块

子类main方法

父类的变量
父类的初始化代码块
父类的构造函数
子类的变量
子类的初始化代码块
子类类的构造函数

参考引用
https://yikun.github.io/2015/04/01/Java-HashMap%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%8F%8A%E5%AE%9E%E7%8E%B0/

基于Map接口实现,可以为null或者空值,非同步,不保证有序,也不保证顺序随时间而不发生变化,存储Entry(hask,key,value,next)对象

put实现原理:
1、对key的hashcode进行hash,再计算索引index
2、如果索引没有碰撞,那么直接放进bucket中
3、如果有冲突,则以链表的形式挂在buckets后,如果链表过长,则将链表转换为红黑树(jdk8之后默认为8)
4、如果节点已经存在,则把原来的值替换
5、如果bucket满了,则需要重新resize(factor默认是0.75)

get实现原理:
1、bucket里的第一个节点,直接命中
2、如果有冲突,则通过key.equals(k)查找对应的entry
3、如果是树,则通过key.equals(k)查找O(logn)
4、如果是链表,则通过key.equals(k)查找O(n)
key的hashcode进行hash(hashcode的高16位和低16位进行异或),
initialCapacity : 初始化容量16
table : Entry<K,V>[] table 是用来存储数据的数组
Entry<K,V> 是HashMap的一个内部类,链表结构

ConcurrentHashMap 包括两个内部类,hashEntry和segment,hashEntry存储键值对,segment充当锁的作用。
并发性高的原因
1、是由自身特点决定的。当插入一个元素的时候,对hashcode进行hash,计算出索引,得到segment中桶的位置由于hashEntry链的final特性,只能在链头插入元素,不影响遍历;锁住的当前的segment,其他segment读写并不受影响
2、hashEntry的value是volatile变量,不同线程间可以正确的获得值
jdk
1.8 其中抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。
hashcode 定位node,如果为空,cas尝试写入,不成功,自旋保证成功
如果都不满足,就synchronized 写入数据

  • 抽象类的修饰符可以public protected default,接口的修饰符只能是public
  • 抽象类强调的是继承,只声明不实现,是单继承,接口强调的实现,是抽象方法的集合,可以多实现。
  • 抽象类可以有构造器,接口没有
  • 抽象类中可以包含非抽象方法,也就是默认实现,而接口的子类实现必须实现所有的方法

类单继承,接口可以多继承,一个类可以实现多个接口


方法区:存放已加载类信息、方法信息、常量池

String
上一篇下一篇

猜你喜欢

热点阅读