【面试题】高级Java 面试知识点总结

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


 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值