首页 / 资讯中心 / 文章详情

面试问题总结

面试问题总结 ★ FEATURED ARTICLE
1.回答输出结果为什么Integer i new Integer(100); Integer j new Integer(100); System.out.println(i j); String a abc; String b a b c; System.out.println(a b); String c abcd; String d a d; System.out.println(c d);1.ij 输出false原因i和j对象虽然在常量池范围内但都通过new关键字分配新内存地址。2.ab输出true原因都是字符串常量都直接在字符串常量池中直接引用。3.cd输出false原因d是在堆内创建新字符串对象。2.String b在JVM中具体是怎么创建的在栈中创建一个b变量在字符串常量池招是否存在“abc“若找到了则直接引用没有找到在字符串常量池中创建。3.JVM中运行时数据区都包含那些部分分为线程私有和线程共享线程私有程序计数器本地方法栈虚拟机栈。线程共享元空间堆4.堆是干嘛的方法区是干嘛的虚拟机栈是干嘛的堆是用来存创建的对象数组等方法区存储字节码指令类的结构信息静态变量常量JIT编译器编译的目标对象识别的机器码。虚拟机栈存入一个个栈帧一层层方法每个栈帧保存了每个方法的局部变量操作数栈和动态链接方法出口等信息。5.讲讲堆分为那些部分每个部分都是啥堆分为新生代和老年代新生代约占1/3分为survive0和survive1和Eden区老年代约占2/3.6.讲讲垃圾收集新生代中对于Eden区域中的对象生命周期短所以垃圾收集频率高速率块未回收的进入到survive0中而在老年代中对象占用空间大生命周期长回收频率低速率慢。7.一个对象是怎么从新生代流转到老年代的新生代对象经过频繁的垃圾收集还存活达到阈值时会流转到老年代当新生代容量不够时survive0,survive1中的对象会直接流转为老年代对象。8.surviveo区域、survive1区域具体讲讲新生代中经历垃圾回收存活的对象的年龄加1并放入到surivie0中如果达到阈值则流转为老年代对象。survive1和survive0中总有一个为空。9.Java线程有那些状态各个状态是怎么流转的当线程新创建时未执行start()方法时处于New状态当线程准备执行或正在执行时处于RANNABLE状态执行join时间值wait时间值等方法时间处于计时等待状态等待时间结束处于RANABLE状态执行joinwait方法时处于等待状态需要通过notifynotifyall等方法唤醒如果存在锁竞争锁失败的线程处于阻塞状态执行ran()方法完毕进入终止状态。10.如果执行sleep方法会进入什么状态线程会进入计时等待状态休眠状态如果有锁并不会释放锁一直持有锁。11.线程同步机制了解吗了解过线程并发进行线程采用抢占模式为了使操作的资源正确通过同步锁Synchronize保证线程的同步安全也可以使用CAS和ReentrantLock保证线程同步安全。12.Lock有哪些实现有ReentrantLockReentrantLockReadWriteLock等实现类都是保证线程同步安全的13.Synchronize和ReentrantLock有什么区别分别在什么情况下使用Synchronize是一个关键字声明在方法上或在代码块中使用是隐式获取锁和释放锁用法简单不能中断不能判断状态不能设置超时仅支持非公平锁底层是通过Monitor监视器、而ReentrantLock是Lock类的实现类需要通过创建对象通过对象调用获取锁和释放锁的方法也可以trylock()非阻塞的方式显式获取和释放锁unlock()必须配合findlly 代码块使用用法复杂可以通过lockInterruptibly()中断通过trylock时间值设置超时时间支持公平锁和非公平锁底层是通过AQS实现的。14.讲讲Synchronize锁升级锁升级是从无锁-偏向锁-轻量级锁-重量级锁偏向锁是只有一个线程频繁的获取释放锁会记住这个线程不用通过锁直接比较实现如果过发现不同的线程会升级为轻量级锁线程竞争不激烈冲突小线程通过CAS的方式获取锁如果CAS长时间自旋说明冲突激烈锁会升级为重量级锁具有强烈的互斥性和排他性已独占的方式获取锁。15.讲讲CAS的原理会遇到什么问题怎么解决CAS是一种无锁化的并发管理操作执行流程是先获取内存中需要修改的值A通过计算得出B再将自己拿到的值A与内存中的值C比较如果相同则进行更新操作如果不同则进行重试或自旋操作。会出现ABA问题是CAS拿到内存中的值A10但是存在另一个线程修改内存中的值为10当前线程比较时内存中的值与自己的值相同边进行更新没有发现其他修改的线程可以通过加一个版本号解决。16.线程安全的集合类有哪些1.CopyOnWriteArrayList,使用ReentrantLock保证线程安全。2.CopyOnWriteArraySet内部是一个CopyOnWriteArrayList,所以使用ReentrantLock保证线程安全。3.ArrayBlockingQueue使用一个锁ReentrantLock保证线程安全4.LinkedBlockingQueue使用两个锁对象ReentrantLock保证线程安全。5.ConcurrentHashMap使用CASsynchronize保证线程安全在没有发生哈希冲突时使用CAS写入发生发哈希冲突使用链表头节点或红黑树的根节点作为锁对象进行局部上锁。6.Stack使用Synchronize保证线程安全。17.如果我想要一个线程安全的List应该怎么做可以使用CopyOnWriteArrayList适合读多写少的场景18.线程池了解嘛有哪些核心参数执行流程是什么线程池是一种池化技术实现了线程复用线程的并发管理避免了线程的重复创建。参数核心线程数最大线程数非核心线程的空闲时间的时间单位阻塞工作队列线程工厂拒绝策略。执行流程当线程任务进入线程池判断小于核心线程数则创建核心线程执行该线程任务若大于核心线程数小于工作队列则线程任务入队等待若大于工作队列小于最大线程数创建非核心线程执行线程任务若大于最大线程数执行拒绝策略。19.内存有限快速找到top10000怎么办使用优先队列小顶堆栈先遍历1000个数据通过for循环入队剩余元素入队元素队头元素对头元素出队遍历至数据结束得到top1000020. 数据量极大找到一个数在其中是否存在怎么做使用布隆过滤器穿件创建布隆过滤器对象把数据存入到布隆过滤器中来判断某个数字是否存在21.布隆过滤器的原理优缺点将数据通过不同的哈希法计算出不同的哈希值并在位数组中将计算出来的哈希值位置上的0改为1.优点可以高效率查询和插入数据占用内存极小缺点存在误判存入的数据不能取出原数据原生布隆过滤器不支持删除。22. 如果让你实现布隆过滤器的hash算法怎么写使用不同的种子seed和容量cap和传如数据datahash seed*cao-1data.hashcode^data.hashcode()16
阅读完成 · 觉得有帮助?
咨询建站