一、Java基础和高级
1.String类为什举是final的。
用处有三:1)常量池共享 2)线程安全 3)hashCode的键值最好选择
2.HashMap的源码,实现原理,底层结构。
HashMap底层使用数组+链表+红黑树实现,putVal在链表结点数大于8的时候自旋成红黑树,使得查询速度由O(n)提升为O(log n)
3.反射中,Class.forName 和classloader的区别
Class.forName不但会加载.class文件到jvm中还会执行static块代码,classloader只会将.class文件加载到jvm只有当执行newInstance的时候都会执行static代码。
4.session和cookie的区别和联系,session的生命周期,多个服务部署时session管理。
session存储在server端,cookie存储在客户端,cookie利用server返回的信息保存,cookie如果不设过期时间会长久保留在客户端,否则浏览器关闭的时候就会清空cookie信息。server当浏览器关闭的时候session注销。
多个服务器部署时可以有几种方案:1)session信息保存到cookie中,浏览器访问服务时带回即可。2)session请求粘贴,利用负载将同一个客户端的请求都发到一个server上。3)利用独立的redis缓存服务器来存储session信息,实现共享。redis可以做成集群,定时copy session信息
5.Java中的队列都有哪些,有什举区别。
Java中队列是一个先进先出的数据结构,通常不能随机访问,根据实现的方式不同主要有两种方式:数组 & 链表。如下图:
在并发编程中,保证线程安全的队列有阻塞队列和非阻塞队列之分。
阻塞队列在队列为空时或队列满的时候,获取元素的线程会等待队列变为非空,当队列为满时,存储元素的线程会等待队列可用。阻塞队列有以下几种:
- ArrayBlockingQueue :一个由数组结构组成的有界阻塞队列。
- LinkedBlockingQueue :一个由链表结构组成的有界阻塞队列。
- PriorityBlockingQueue :一个支持优先级排序的无界阻塞队列。
- DelayQueue:一个使用优先级队列实现的无界阻塞队列。
- SynchronousQueue:一个不存储元素的阻塞队列。
- LinkedTransferQueue:一个由链表结构组成的无界阻塞队列。
- LinkedBlockingDeque:一个由链表结构组成的双向阻塞队列。
阻塞队列的实现原理:添加元素的最后一行,notEmpty.signal();表示添加完元素后,调用signal通知等待的线程,队列不空了,可以来取东西的。移除元素的最后一行,也是这样的。
非阻塞的方式可以循环使用CAS的方式来实现,非阻塞队列的一个实现方式为concurrentLinkedQueue,这是一个基于链接节点的无界线程安全队列,入队和出队操作均使用CAS(Compare and set) 更新,这样允许多个线程并发执行,并且不会因为加锁而阻塞线程。
6.Java的内存模型以及GC算法
JAVA 1.8内存模型,JVM内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈,如下图所示:
1. 每个线程都有一个私有的栈,随着线程的创建而创建。栈里面存放着栈桢的东西,栈桢中存放了局部变量表。当栈调用深度超过JVM所允许