零、java基础
1)类和对象的区别?
答:类是对象的模板,对象是类的实例。类只有通过对象才能使用。而在开发中应该先产生类,只有在产生对象。类不能直接使用,对象是可以直接使用的。
2)static关键字和final关键字?
答:static关键字常用的有3种用法:
1)修饰成员变量,将其变成类的成员,从而实现所有对象对该成员的共享;
2)修饰成员方法,将其变成类的方法,可以使用"类名.方法名"的方式调用,常用于工具类;
3)静态块用法,将多个类成员放在一起初始化;
final关键字常用的有4种用法:
1)修饰成员变量和局部变量,该成员被赋值一次就不能更改。
2)修饰方法参数,表明在变量的生存期中它的值不能被改变。
3)修饰方法,表明该方法不能被重写。
4)修饰类,表明该类无法被继承,比如String。
3)synchronized关键字怎么用?底层原理?
答: synchronized关键字作为一种互斥锁,3种用法:
1)锁代码块:传入的synchronized关键的对象。
2)锁方法:锁对象实例。
3)锁静态方法:对应的锁是当前类的Class实例对象。
synchronized关键字原理:
原理:通过反编译可以发现当 **修饰方法** 的使用,编译器会产生ACC_SYNCRONIZED关键字标识,
**修饰代码块** 会产生moniterenter和monitorexit指令。
前面说了sync锁的是对象,而对象是由 (a.对象头:MarkWord b. 对象实例数据 c.对其填充数据) 组成。重点是MarkWord的信息,其中包含了锁的信息,每个对象头还对应了一个monitor对象,monitor对象中存储着当前持有的线程和等待线程队列的信息。
synchronized关键字锁升级原理:
在JDK1.6之前sync是重量级锁,当线程进入同步方法或者同步代码块时,monitor对象就会把当前线程的id进行存储,设置MarkWord的monitor对象地址,然后把阻塞的线程存储到monitor对象的线程阻塞队列中,他加锁是依赖操作系统的mutex相关指令完成,设计到用户态和内核态的切换,性能消耗比较大。
在JDK1.6之后,引入了锁升级的概念,锁的状态有:无锁,偏向锁、轻量级锁、重量级锁4种。
偏向锁是JVM认为没有锁竞争的环境,直接在MarkWord直接记录线程id,只要有线程来就会判断线程id是不是相同,相等则当前线程能直接获取执行同步代码,如果不相同,则CAS尝试修改。修改成功则同上、修改失败说明有竞争环境,则偏向锁撤销,升级为轻量级锁。在轻量级锁状态下,当前线程会在线程栈帧下创建LockRecod,LockRecord会复制MarkWord的信息,且有个owener指针指向当前对象,线程执行到同步代码时,则使用CAS将锁对象的MarkWord执行线程栈帧的LockRecord,假设CAS修改成功,则获得轻量级素偶,失败则自旋(默认是10次)到达次数上限后,锁升级为重量级锁。
4)synchronized和Lock的区别?
1、sync的锁可重入、不可中断、非公平、
2、lock锁可重入、可中断、公平和非公平可设置。
5)Java中线程的状态?join()、yield()方法是干什么的?
5种状态: 新线程、运行状态、阻塞状态(Sleeping)、等待状态(Waiting)、定时等待(Timed Waiting) 、线程终止
join()方法: 把制定线程加入到当前线程中,比如在线程B中调用了线程A的join(),直到线程A执行完毕才会执行线程B
yield()方法:暂停当前正在执行的线程,并执行其他线程(可能没有效果)
6)Object类下有哪些方法?
1、hashCode()
2、eaquls()
3、clone()
4、toString()
5、notify()
6、notifyAll()
7、wait()
8、getClass()
9、finalize()
7)JVM中的参数-Xms和-Xmx?
-Xms:java虚拟机堆区初始内存,通常为操作系统可用内存的1/64大小
-Xmx:java虚拟机堆区内存可被分配的最大上限,通常为操作系统可用内存的1/4大小
8)spring依赖注入有几种方式?
1)通过构造函数
2)通过set方法给属性注入
3)注解
9)spring框架中的组件?
1、核心容器
容器是Spring框架的核心模式,该模块包含Bean的创建、配置、管理等功能。
2、AOP编程
AOP 编程可以帮助应用程序解耦,使用AOP编程模式,可以把系统中的核心点从对象方法中解耦,统一管理。
3、数据访问
该模块集成了JDBC,解决JDBC开发模式导致的大量代码冗余,集成常用的Dao层框架,hibernate,mybatis等,使开发环境的搭建更加便捷。
4、Web编程
Spring不仅集成各种流程的MVC框架,还自带springmvc强大的框架,有助实现界面逻辑和应用程序分离,在Web层面实现应用的解耦。
9)springMVC模式?
-
工厂设计模式 : Spring使用工厂模式通过 BeanFactory 、 ApplicationContext 创建 bean 对象。
-
代理设计模式 : Spring AOP 功能的实现。
-
单例设计模式 : Spring 中的 Bean 默认都是单例的。
-
包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会
-
去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。
-
观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。
-
适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配 Controller 。
10)spring中的bean创建过程?
11)springBoot和springMVC的区别和联系?了解SpringBoot的启动流程吗?SpringBoot自动配置是如何实现的?
一、数据结构与算法
1)B树和B+树的区别?
答:1)B树的每个结点都存储了key和data,B+树的data存储在叶子节点上。 节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。
2)树的所有叶结点构成一个有序链表,可以按照关键码排序的次序遍历全部记录 由于数据顺序排列并且相连,所以便于区间查找和搜索。而B树则需要进行每一层的递归遍历。相邻的元素可能在内存中不相邻,所以缓存命中性没有B+树好。
3)寻找两个正序数组的中位数
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int [] nums = new int[nums1.length + nums2.length];
int i = 0;
int j = 0;
if (nums1.length == 0){
if (nums2.length % 2 == 0){
int mid = nums2.length / 2;
double temp = nums2[mid] + nums2[mid - 1];
return temp / 2;
}else {
return nums2[nums2.length / 2];
}
}
if (nums2.length == 0){
if (nums1.length % 2 == 0){
int mid = nums1.length / 2;
double temp = nums1[mid] + nums1[mid - 1];
return temp / 2;
}else {
return nums1[nums1.length / 2];
}
}
int count = 0;
while (i < nums1.length && j < nums2.length){
if (nums1[i] <= nums2[j]){
nums[count++] = nums1[i++];
}else {
nums[count++] = nums2[j++];
}
}
while (i < nums1.length){
nums[count++] = nums1[i++];
}
while (j < nums2.length){
nums[count++] = nums2[j++];
}
double result = 0.0;
if (nums.length % 2 == 0){
int mid = nums.length / 2;
double temp = nums[mid] + nums[mid - 1];
result = temp / 2;
}else {
result = nums[nums.length / 2];
}
return result;
}
4)连续子数组的最大和
public int maxSubArray(int[] nums) {
int result = nums[0];
int [] dp = new int [nums.length];
dp[0] = nums[0];
for(int i = 1; i < nums.length; i++){
dp[i] = nums[i];
if(dp[i - 1] > 0){
dp[i] += dp[i - 1];
}
result = Math.max(dp[i], result);
}
return result;
}
二、计算机网络
1)TCP三次握手、四次挥手流程?为什么三次,为什么四次?
2)TCP和UDP区别,有TCP为什么还要有UDP?
3)TCP粘包和拆包问题有了解吗?
4)TCP是怎样保持连接的?
三、操作系统
1)并发编程中死锁有了解吗?死锁产生的条件是什么?你在项目中是怎样解除避免和解除死锁的?
2)进程的都有哪些状态?怎么转换的?
3)Linux下文件的操作命令
四、数据库
1)数据库索引了解吗?MySQL中索引底层是怎么实现的?
2)MySQL中存储引擎InnoDB和MyISAM有什么区别?分别用于什么场景?
3)数据库事务有了解吗?事务的隔离级别?你在项目中使用的隔离级别是什么?
4)SQL优化有什么思路?