热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

秋招面经总结(Java后端开发)

 以下总结的面经都是我在秋招的过程中被问到的一些高频问题,后面附上的一些答案是查阅了相关文章总结而出,也是个人观点,如有错误,欢迎指出!一Java基础Java和C语言有什么区别?J

 

以下总结的面经都是我在秋招的过程中被问到的一些高频问题,后面附上的一些答案是查阅了相关文章总结而出,也是个人观点,如有错误,欢迎指出!


一 Java基础



  1. Java和C语言有什么区别?Java好在哪里?

  2. 怎么理解Java的跨平台性,一次编译到处运行?

  3. 面向对象和面向过程的区别?

  4. 如何理解面向对象三大特性:封装、继承、多态?

  5. 类继承会有什么问题吗,一般什么情况下才会去用继承?

  6. 为什么重写equals方法还要重写hashcode方法?

  7. 深克隆和浅克隆

  8. 反射相关

  9. 注解的实现原理

  10. Lambda表达式的优缺点?

  11. Stream流式编程的好处?终止方法和延迟方法的区别是?终止方法存在的意义是什么?


二 Java集合


  1. HashMap底层实现(JDK1.7使用数组+链表;JDK1.8使用数组+链表+红黑树)

  2. HashMap为什么要引进红黑树?为什么不用其他的平衡二叉树之类的?红黑树的优势在哪里?(AVL树的旋转比红黑树的旋转更加难以平衡和调试,需要更高的旋转次数)

  3. 链表会转化为红黑树的两个条件是?(①链表的长度达到8;②HashMap底层使用的table数组长度length达到64;如果不满足后者,将会触发扩容方法)

  4. 链表长度大于8转化为红黑树,小于6红黑树转化为链表;为什么不直接设置成大于8转化成红黑树,小于8转化成链表;(中间有个差值7进行过渡是为了避免链表和树频繁转换,如果一个HashMap不停的插入、删除元素,链表个数在8左右徘徊,就会频繁的发生树转链表、链表转树,效率会很低)

  5. 把链表转化为红黑树的阈值是8,为什么不设置成其他值?(遵循泊松分布,链表长度超过8的概率非常小)

  6. HashMap扩容机制,即resize方法?(JDK 1.7 会重新计算每个元素的哈希值,JDK1.8是通过高位运算(e.hash & oldCap)来确定元素是否需要移动,如果运算结果值为0,那么元素扩容后位置不变,结果值为1表示元素在扩容时位置发生了变化,新的下标位置等于原下标位置 + 原数组长度)

  7. HashMap添加元素的步骤(put方法)、计算集合元素个数(size方法)

  8. HashMap为什么是线程不安全的?(同时新增元素、同时扩容导致数据丢失,jdk1.7头部倒序插入出现死循环导致CPU占用100%)

  9. HashMap默认的加载因子是0.75,为什么不设置成1或者0.5(从容量和性能考虑)

  10. HashMap发生哈希冲突,新节点是插入到链表头部还是链表的尾部,头部倒序插入死循环是怎么产生的?(jdk1.7采用头部倒序插入,会导致死循环;jdk1.8使用尾部正序插入)

  11. Hashtable怎么控制key value 不能为null?(当调用put方法时,首先会判断value是否为null,为null的话直接抛出空指针异常;对于key,由于Hashtable计算hash值是int hash = key.hashCode();直接取对象的hashcode,key为null就会报空指针异常;而HashMap计算hash值是return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16),key为null则hash值为0)

  12. ConcurrentHashMap底层采用的结构(分jdk1.7和jdk1.8),jdk1.7和jdk1.8分别采用什么方式实现线程安全?(jdk1.7采用分段锁,也就是为每一个segment加上ReentrantLock锁;jdk1.8使用的是CAS机制加上synchronized锁)

  13. ConcurrentMap中的size方法是如何实现的?多线程操作下,如果一个线程在查size方法,一个线程在执行put方法,底层是如何控制每次计算出来的值是正确的?

  14. HashSet的底层实现?(基于HashMap来实现的,new 一个 HashSet对象底层实际就是new了一个HashMap,并且使用默认的初始容量16和默认的加载因子0.75;当我们往HashSet里面添加一个元素其实就是往HashMap里面put了一个元素,并且是以key存在的,HashMap的value值都是一样的,是一个静态常量PRESENT,源码为:private static final Object PRESENT = new Object(); )

  15. BlockingQueue(阻塞队列)如何实现生产者消费者模型?

  16. 线程安全的List有哪些?(Vector、CopyOnWriteArrayList、还可以使用Collections类的synchronizedList方法将线程不安全的List转为线程安全的)

  17. 为什么ArrayList查询速度快?(ArrayList底层是基于数组实现,可以根据元素下标进行查询,查询方式为(数组首地址+元素长度*下标,基于这个位置读取相应的字节数就可以了),如果数组存的是对象,怎么根据下标定位元素所在位置?(对象数组每个元素存放的是对象的引用,而引用类型如果开启指针压缩占用4字节,不开启则占用8字节,所以对象数组同样适用上面的公式)

  18. ArrayList的扩容?(ArrayList底层是基于数组实现,所以创建ArrayList会给数组指定一个初始容量,默认值为10,因为必须指明数组的长度才能给数组分配空间;由于数组的特性,ArrayList扩容是创建一个更大的数组,然后将原来的元素拷贝到更大的数组中,扩容的核心方法是Arrays.copyOf方法)

  19. ArrayList和LinkedList的区别,添加一个元素的时间复杂度各是多少,既然ArrayList添加元素效率没有LinkedList高,为什么我们平时用的比较多的还是ArrayList?

  20. 一般什么情况下会用ArrayList,什么情况用LinkedList?(如果只是普通的存取元素多用ArrayList,LinkedList一般用作栈、队列)

  21. 将一个Map集合变成栈,如何实现?(我的思路是用TreeMap去实现,key存的是要入栈的元素,value存的是可以记录他们入栈的一个先后顺序的,例如时间戳,然后重写Comparator比较器,根据value进行排序,遍历Map时,先进的后面出)

  22. Map集合有迭代器吗?遍历输出Map中所有元素有哪些方法?


三 多线程和Java锁


  1. 线程池的三大方法、七大参数、四种拒绝策略(可以顺带谈一下阿里巴巴开发手册对于线程池使用的规范)

  2. 最大线程数如何定义?(从CPU密集型和IO密集型考虑)

  3. 线程池的五种状态(Running、Shutdown、Stop、Tidying、Terminated)

  4. 线程池的任务执行流程、excute方法和 submit方法的区别?

  5. Synchronized锁和Lock锁的区别

  6. Java线程虚假唤醒(线程本应该处于wait状态却被唤醒了,解决方案是wait方法应该用while循环包裹,不用if)

  7. JMM的三种特性(原子性、可见性、有序性)、主内存和线程工作内存的八种交互动作

  8. volatile如何保证可见性(MESI缓存一致性协议)

  9. volatile如何保证有序性(内存屏障——lock前缀指令)

  10. synchronized和volatile的区别(volatile是一种非锁机制,这种机制可以避免锁机制引起的线程上下文切换和调度问题。因此,volatile的执行成本比synchronized更低;volatile只能保证可见性有序性;synchronized可以保证原子性可见性有序性)

  11. JUC包中的原子类如何保证原子性?(CAS机制和自旋锁)

  12. CAS机制,会引发什么问题,如何解决ABA问题?(CAS会导致ABA问题,解决ABA问题是使用版本号机制)

  13. 悲观锁和乐观锁的区别,应用?(java中的Synchronized关键字和lock锁使用的都是悲观锁;CAS机制是乐观锁的一种实现方式)

  14. 公平锁和非公平锁(公平锁按照先来先服务,不会出现饥饿;非公平锁会导致饥饿,但是效率更高,默认的锁都是非公平的)

  15. 自旋锁和互斥锁,自旋锁的优缺点?(优点:减少上下文切换和用户态内核态的切换带来的开销;缺点:循环等待消耗CPU)

  16. 可重入锁和不可重入锁(不可重入锁容易导致死锁发生,大多数锁都是可重入的,例如Synchronized锁和ReentrantLock)

  17. JDK1.6 Synchronized锁升级(偏向锁—轻量级锁—重量级锁)

  18. Synchronized锁的底层实现,锁的是什么,其它线程如何判断该锁已经被占用了?

  19. 死锁产生的四个必要条件以及死锁的处理策略


四 Mysql


  1. Myisam和InnoDB存储引擎的区别?(Myisam不支持外键也不支持事务,支持的是表锁,当执行select操作时,自动给涉及的表加表锁,当执行增删改操作,自动给涉及的表加写锁;InnoDB支持外键也支持事务,支持的是行锁,当执行select操作时,不加任何锁,当执行增删改操作,自动给涉及的行加写锁)

  2. 间隙锁是什么?行锁升级为表锁的情况?

  3. InnoDB的行锁有哪些?锁住的是行还是索引?(Record Lock、Gap Lock、Next-Key Lock;锁住的是索引,而不是行)

  4. 为什么可重复读隔离级别也可以解决幻读?(通过Next-Key Lock可以消除幻读)

  5. 并发事务处理带来的四种问题和事务的隔离级别(丢失更新、脏读、不可重复读、幻读;读未提交、读已提交、可重复读、串行化)

  6. 如何理解Mysql默认的事务隔离级别可重复读?

  7. 事务的ACID属性是如何实现的?(原子性通过回滚日志undo log实现;持久性通过重做日志redo log实现;隔离性通过锁和MVCC实现;而一致性则是通过原子性、隔离性、持久性来实现,只有满足这三个特性,才能实现事务的一致性)

  8. 聚簇索引、非聚簇索引、回表查询、覆盖索引;

  9. 索引失效的情况?(违反最左前缀法则、范围查询右边的列索引失效、字符串不加单引号、对索引列进行运算、头部模糊匹配、使用不等于!=或者<>)

  10. explain分析执行计划、SQL语句的优化

  11. mysql三大范式(1NF即原子性,2NF即消除部分依赖,3NF即消除传递依赖)

  12. mysql索引的底层实现,为什么用B+树不用B树?(B+树IO次数更少、更适合范围查询、查询效率更加稳定)

  13. 哈希表查找速度不是更快吗,为什么不直接使用哈希表来做索引的底层数据结构?(哈希表不支持范围查找)


五 Redis


  1. Redis五种基本数据类型的使用场景

  2. 缓存穿透、缓存击穿、缓存雪崩

  3. Redis的过期策略和内存淘汰机制

  4. Redis的zset底层数据结构,为什么用跳跃表而不用红黑树


六 框架相关


  1. Spring AOP的实现原理?(基于动态代理模式,如果目标类实现了接口,那么使用基于接口的动态代理,否则使用基于子类/cglib的动态代理)

  2. Spring AOP 的具体加载步骤?

  3. AOP和OOP的区别,分别适用什么场景?

  4. Spring Bean的作用域,Spring Bean的生命周期(Bean的实例化—初始化Bean—使用Bean—Bean的销毁)

  5. Spring容器创建对象的两种时机,各有什么优缺点?(一是Spring容器启动时创建Bean,二是调用getBean方法时创建)

  6. SpringMVC的执行流程(可以顺带讲一下适配器模式)

  7. Mybatis的一级缓存和二级缓存?

  8. Mybatis中#和$的区别?

  9. Mybatis如何实现批量插入?

  10. Mybatis的xml文件中,sql语句可以使用直接使用大于号小于号吗?应该用什么符号代替?


七 设计模式



  1. 请列举出在 JDK 中几个常用的设计模式?


  2. 什么是设计模式?你是否在你的代码里面使用过任何设计模式?


  3. Java 中什么叫单例设计模式?请用 Java 写出线程安全的单例模式


  4. 在 Java 中,什么叫观察者设计模式(observer design pattern)?


  5. 使用工厂模式最主要的好处是什么?在哪里使用?


  6. 举一个用 Java 实现的装饰模式(decorator design pattern)?它是作用于对象层次还是类
    层次?


  7. 在 Java 中,为什么不允许从静态方法中访问非静态变量?


  8. 设计一个 ATM 机,请说出你的设计思路?


  9. 在 Java 中,什么时候用重载,什么时候用重写?


八 网络


  1. TCP三次握手和四次挥手的过程,每次发送的包的内容,客户端和服务端的状态?



  2. TCP三次握手可以携带数据吗?TCP协议运行时阶段?



  3. 为什么是三次握手,可以四次握手或者两次握手吗?



  4. 为什么握手是三次,而挥手要四次?



  5. TCP四次挥手为什么需要TIME-WAIT阶段等待2MSL,是哪一方有TIME-WAIT阶段?(主动释放释放连接的那端)



  6. TCP的长连接和短连接



  7. 半连接队列和全连接队列,什么是syn flood攻击,如何应对syn flood攻击?



  8. 在浏览器中输入一个网址回车后发生了什么?



  9. 域名解析过程的递归查询和迭代查询



  10. 浏览器输入一个网址之后,按照TP/IP参考模型,从应用层到网络层各使用了哪些协议?

    (应用层:HTTP、DNS;传输层:TCP、UDP;网络层:IP、ICMP、ARP)



  11. ICMP协议的两个应用——Ping和Traceroute



  12. IP地址和MAC地址有什么区别?



  13. http和https的区别 



  14. 网站为什么要使用COOKIE和session;COOKIE和session有什么区别?



  15. get请求和post请求的区别?



  16. TCP和UDP的区别以及各自的应用场景?



  17. epoll和select的区别?




九 JVM


  1. JVM内存模型(程序计数器、虚拟机栈、本地方法栈、堆、方法区)



  2. JDK1.8做了哪些变化?(JDK1.7已经将原本位于永久代的字符串常量池移到堆中了,但是永久代的概念还存在,JDK1.8才彻底废除永久代,进而用元空间代替)



  3. 永久代和元空间,JDK1.8为什么要使用元空间代替永久代?



  4. 元空间溢出?(元空间不属于Java虚拟机,使用的是本地内存,存放的是类及方法的一些信息,动态加载类或者频繁加载类信息,但是没有及时卸载,会导致元空间溢出)



  5. 对象创建的两种方式(指针碰撞、空闲列表)、对象访问定位的两种方式(使用句柄、直接指针)



  6. 栈上分配与逃逸分析(JVM层面进行java性能优化的技巧)



  7. 判断对象是否存活的两种方式,引用计数法的缺点?(引用计数法、可达性分析法)



  8. 关于Object类的finalize()方法(jvm自动执行,无需手动调用,只能执行一次).



  9. java的四种引用(强引用、软引用、弱引用、虚引用)



  10. 三种垃圾回收算法,各自的优缺点(标记-清除法、标记-复制法、标记-整理法)



  11. Minor GC 和 Full GC 的区别,触发条件,以及空间分配担保策略?



  12. 内存溢出和内存泄露(内存泄露的堆积会导致内存溢出)



  13. JVM参数调优(-Xms、-Xmx、-Xss、-XX:NewRatio、-XX:SurvivorRatio、-XX:+PrintGCDetails、-HeapDumpOnOutOfMemory)



  14. 发生OOM如何解决(首先尝试通过JVM参数调优扩大堆内存空间;再者dump出堆内存存储快照,使用JProfile工具进行分析)



  15. 垃圾收集器(CMS问的居多,另外,如果谈及发生gc会给用户带来什么不好的体验,可以谈谈Stop the World)



  16. 类加载机制的过程,准备阶段做了哪些工作?(准备阶段会给类的静态变量分配内存(方法区)并赋初值,如果类的静态变量被final修饰,那么初始化的值就不是零值,而是声明的值)



  17. 类的双亲委派模型定义,双亲委派模型的好处?如何破坏类的双亲委派模型?




十 操作系统


  1. linux的僵尸进程和孤儿进程的区别,如何清理僵尸进程?(kill僵尸进程的父进程)

  2. 如何查看僵尸进程信息?如何统计僵尸进程数量?(ps - ef | grep defunct;ps -ef | grep defunct | wc - l)

  3. 并发和并行的区别?

  4. 进程和线程的区别?

  5. 进程通信的方式有哪些?(管道、消息队列、共享内存、信号量、套接字Socket)

都整理在网盘了需要的可以点击这里,暗号博客园!

 

 

 



推荐阅读
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 本文介绍了在Windows环境下如何配置php+apache环境,包括下载php7和apache2.4、安装vc2015运行时环境、启动php7和apache2.4等步骤。希望对需要搭建php7环境的读者有一定的参考价值。摘要长度为169字。 ... [详细]
  • 本文讨论了在手机移动端如何使用HTML5和JavaScript实现视频上传并压缩视频质量,或者降低手机摄像头拍摄质量的问题。作者指出HTML5和JavaScript无法直接压缩视频,只能通过将视频传送到服务器端由后端进行压缩。对于控制相机拍摄质量,只有使用JAVA编写Android客户端才能实现压缩。此外,作者还解释了在交作业时使用zip格式压缩包导致CSS文件和图片音乐丢失的原因,并提供了解决方法。最后,作者还介绍了一个用于处理图片的类,可以实现图片剪裁处理和生成缩略图的功能。 ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了操作系统的定义和功能,包括操作系统的本质、用户界面以及系统调用的分类。同时还介绍了进程和线程的区别,包括进程和线程的定义和作用。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了MysqlDump和mysqldump进行全库备份的相关知识,包括备份命令的使用方法、my.cnf配置文件的设置、binlog日志的位置指定、增量恢复的方式以及适用于innodb引擎和myisam引擎的备份方法。对于需要进行数据库备份的用户来说,本文提供了一些有价值的参考内容。 ... [详细]
  • 基于事件驱动的并发编程及其消息通信机制的同步与异步、阻塞与非阻塞、IO模型的分类
    本文介绍了基于事件驱动的并发编程中的消息通信机制,包括同步和异步的概念及其区别,阻塞和非阻塞的状态,以及IO模型的分类。同步阻塞IO、同步非阻塞IO、异步阻塞IO和异步非阻塞IO等不同的IO模型被详细解释。这些概念和模型对于理解并发编程中的消息通信和IO操作具有重要意义。 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
author-avatar
书友33947127
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有