1.Hashmap底层执行原理, 在多线程里Hashmap是不安全的
存储结构:数组,链表、红黑树(jdk1.8+)
特点: 快速存储,快速查找(key-value键值对,时间复杂度O(1)),可伸缩(数组默认大小16,可扩容;单向链表超过8bit扩容成红黑树)
hash算法
所有对象Object都有hashcode值。e.g String.hashCode();
hash值 ^ (hash值>>>16)
数组下标:上述算法计算的hash值 &(16-1)== hash值 %16
扩容:数组变长2倍
触发扩容条件:存储比例达到75%
Hash冲突:不同的hash值,数标相同
解决:加入一个next记录下一个节点
红黑树(一种二叉树,搞笑的检索效率)
触发条件:单向链表长度超过8,当长度小于6时,会由红黑树变成链表
2.HashTable 和 ConCurrentHashMap 如何实现线程安全?
HashMap 的get,put方法都是普通的java方法
HashTable,所有和数据交互的方法都加了锁(put,get方法),加了synchronized(内置锁)关键字。所有的数据一把锁,其他线程阻塞等待,在高并发的环境下,效率极其低下。
改进: 使用ConcurrentHashmap
分段锁,将数据分段(默认分段大小16),其他线程可以访问没被上锁的数据,大大节省阻塞等待时间,提高效率。
分段锁(jdk1.8+),在数组每个位置的头节点加锁。
ConCurrentHashMap线程安全只要通过:
a.锁分段机制保证写操作的安全性
b.HashEntry不变性,volatile可见性,加锁重读机制
c.加锁和不加锁两种方式控制跨段数据安全
3.jvm 内存布局 & 垃圾回收机制
方法区(Method Area):存储已被虚拟机加载的类信息、常量、静态变量、即时编译器所编辑后的代码等数据,运行时常量池(Runtime Constant Pool)是方法区的一部分
Java堆(Heap):是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,new对象实例在这里分配内存。是垃圾收集器(GC)管理的主要区域。
虚拟机栈(VM Stack):每个方法在被调用时就会创建一个栈帧,每一个方法从调用直至执行完成的过程,就对应一个栈帧在虚拟机中入栈到出栈的过程。
本地方法栈(Native Method Stack)
程序计数器(Progrem Counter Register):代码行号。
直接内存(Direct Memory):并不是虚拟机运行时数据区的一部分,也不是Java虚拟机规范中定义的内存区域。
垃圾回收机制 :
GC- Garbage Collection 垃圾回收,在 JVM 中是自动化的垃圾回收机制,我们一般不用去关注,在 JVM 中 GC 的重要区域是堆空间。
我们也可以通过一些额外方式主动发起它,比如 System.gc(),主动发起。(项目中切记不要使用)
垃圾回收算法:
Mark-Sweep标记-回收算法,缺点内存碎片
Coping复制算法,缺点空间浪费
Mark-Compact标记-整理算法,缺点由于内存区域快移动,影响性能。
--》分代收集:
新生代:复制算法
老年代:标记-清除、标记-整理
4.什么是一致性hash算法?
解决因增减服务器而导致的数据散列问题问题。e.g hash算法是hash%n,新增一台服务器,数据需要全部重新分配。
一致性hash算法 虚拟hash环 范围:0~2^32 -1 顺时针找服务器节点
5. http和https 区别?
http不安全:数据拦截、篡改、攻击
https安全传输:数据加密,身份验证,数据完整性
数据加密:对称(一个秘钥可以加密可以解密)& 非对称(公钥加密私钥解密 or 私钥加密公钥解密)
https三次握手:
a.客户端请求链接,服务器端返回证书(公钥)
b.客户端给服务器发送 对称加密的 随机数 、随机数+私钥的密文
c.服务器根据公钥解密出私钥
d.通过公私钥进行数据传输
6.cookie && session
cookie 数据存在客户浏览器,session 数据存放在服务器上
cookie不是很安全,考虑到安全一般使用session
session和cookie都有有效期,当访问变多时,session会影响服务器性能,考虑到减轻服务器性能,应该使用cookie。
当客户端静止使用cookie时,可通过url重写等方法,实现sessionId交互。
cookie 和session交互
浏览器第一次请求无cookie,服务端创建一个session并返回带有session的cookie
浏览器会保存cookie值并在之后的请求中,携带cookie值,服务器端根据sessionId做响应的处理
7.Redis 高性能的原因
a.redis是个持久化数据库,数据存储在内存中,存获取速度快。
b.数据结构(String,hash,list,set,zset)简单,速度快。查找速度
c.单线程
d.多路复用(请求到队列中,先请求先访问)
e.resp协议
e.g set sumLength 1--java-->
*3
$3
set
$9
sumLength
$1
1