面试问题总结

136 阅读4分钟

1、 锁,syncornized 和 retrantLock 介绍?

2、rocketmq 消息中间件学习?消息队列的设计?数据如何保存的?怎么存入到磁盘的? blog.csdn.net/qq_26896085…

3、 sql语句优化,调优,慢sql问题解决?

4、 jvm的垃圾回收器 g1垃圾回收器?垃圾回收算法?

5、 jvm发生OOM异常,如何解决?工具是什么?


  1. 二分查找算法?
  • 二分查找又称折半查找:每次划分一半进行下一步搜索。
  • 优点是比较次数少,查找速度快,平均性能好;
  • 其缺点是要求待查表为有序列表,且插入删除数据困难。
  • 因此,折半查找方法适用于不经常变动而查找频繁的有序列表。
public class BinarySearch { 
        /** 
        * 二分查找算法 
        * 
        * @param srcArray 有序数组 
        * @param key 查找元素 
        * @return key的数组下标,没找到返回-1 
        */  
        public static void main(String[] args) { 
            int srcArray[] = {3,5,11,17,21,23,28,30,32,50,64,78,81,95,101};   
            System.out.println(binSearch(srcArray, 0, srcArray.length - 1, 81));  
        } 

        // 二分查找递归实现   
        public static int binSearch(int srcArray[], int start, int end, int key) {   
            int mid = (end - start) / 2 + start;   
            if (srcArray[mid] == key) {   
                return mid;   
            }   
            if (start >= end) {   
                return -1;   
            } else if (key > srcArray[mid]) {   
                return binSearch(srcArray, mid + 1, end, key);   
            } else if (key < srcArray[mid]) {   
                return binSearch(srcArray, start, mid - 1, key);   
            }   
            return -1;   
        } 

        // 二分查找普通循环实现   
        public static int binSearch(int srcArray[], int key) {   
            int mid = srcArray.length / 2;   
            if (key == srcArray[mid]) {   
                return mid;   
            }   

            int start = 0;   
            int end = srcArray.length - 1;   
            while (start <= end) {   
                mid = (end - start) / 2 + start;   
                if (key < srcArray[mid]) {   
                   end = mid - 1;   
                } else if (key > srcArray[mid]) {   
                    start = mid + 1;   
                } else {   
                    return mid;   
                }   
            }   
            return -1;   
        } 
    }

时间复杂度

比如:总共有n个元素,每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是循环的次数。 由于n/2^k取整后>=1,即令n/2^k=1, 可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn)

12、选择排序算法 选择排序(Selection-sort)是一种简单直观的排序算法。它的工作原理:首先在未排序列表中找到最小(大)元素,存放到排序列表的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序列表的末尾。以此类推,直到所有元素均排序完毕。

13、线程调度和线程同步的相关方法

image.png

14、 sleep和wait的区别?

image.png

15、spring如何解决循环依赖问题

  • spring是通过递归的方式获取目标bean及其所依赖的bean的;
  • Spring实例化一个bean的时候,是分两步进行的,首先实例化目标bean,然后为其注入属性。

结合这两点,也就是说,Spring在实例化一个bean的时候,是首先递归的实例化其所依赖的所有bean,直到某个bean没有依赖其他bean,此时就会将该实例返回,然后反递归的将获取到的bean设置为各个上层bean的属性的。

www.cnblogs.com/zzq6032010/…

16、AOP相关知识

1、AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。 AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 2、将日志记录,性能统计(效率检查),安全控制(权限验证),事务处理,异常处理 3、AOP是对代码的增强 4、spring aop在什么时候加载?

  • AOP是在初始化处理器的后置处理器方法中进行实现的,也就是BanPostProcessor接口相关的实现类进行postProcessAfterInitialization方法的重写
  • AbstractAutoProxyCreator类实现重写了该方法,核心是实现了wrapIfNecessary方法 Aop阶段是在初始化处理器的的后置处理器方法中进行实现的,BeanPostProcessor接口里面有前置处理器方法与后置处理器方法

blog.csdn.net/weixin_4227…

17、双重校验锁代码谈一下volatile关键字 volatile关键字如何保证内存可见性: volatile修饰的变量保证每个线程在写操作后都把线程工作内存的数据更新到主内存, 每个线程的读操作都到主内存中去读最新的数据,具体实现的话是在JVM层面。 顺带一提volatile还能防止指令重排 保证有序性,这两者的实现方式都是内存屏障。

18、HashMap如何保证get(key)唯一正确呢? 1 先对key 做hash计算,定位到所在entry数组的位置 2 如果产生hash碰撞 此位置有多个entry元素(形成单向链表或者红黑树),遍历时,则在一次调用key.equals()方法 确定唯一的entry元素。