互联网大厂Java求职者口试场景及技能问答

打印 上一主题 下一主题

主题 1957|帖子 1957|积分 5871

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
互联网大厂Java求职者口试场景对话

第一轮提问

口试官:王铁牛,首先问你个底子的,ArrayList和HashMap的区别是什么? 王铁牛:ArrayList是一个有序的数组列表,它存储的是有序的元素集合,通过索引来访问元素,查询速率快。HashMap是一个键值对的集合,它通过键来快速查找值,是非有序的。 口试官:回复得不错。那HashMap的底层数据结构是什么? 王铁牛:HashMap底层是数组和链表大概红黑树,在JDK1.8之前是数组加链表,之后引入了红黑树,当链表长度达到一定阈值(8)时,链表会转化为红黑树,进步查询效率。 口试官:很好。那ArrayList扩容机制是怎样的? 王铁牛:ArrayList在初始化时会有一个默认容量,假如添加元素时凌驾了这个容量,它会进行扩容,一般是扩容为原来的1.5倍。
第二轮提问

口试官:接下来聊聊多线程,线程池的作用是什么? 王铁牛:线程池就是管理和复用线程的,克制频繁创建和烧毁线程带来的开销,进步性能。 口试官:那常见的线程池有哪些? 王铁牛:有FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool等。 口试官:很好,那说说JUC包下的CountDownLatch的作用。 王铁牛:嗯……这个似乎是用来让一个或多个线程等候其他线程完成一组操作的。
第三轮提问

口试官:再谈谈Spring相关的,Spring的IOC和AOP是什么? 王铁牛:IOC就是控制反转,把对象的创建和管理交给Spring容器。AOP是面向切面编程,能在不修改原有代码的情况下,在特定的切点实行额外的逻辑,比如日志记录、事务管理等。 口试官:那Spring Boot的自动设置原理是什么? 王铁牛:这个……就是Spring Boot会根据引入的依赖,自动设置一些默认的组件,但是具体原理我不太清晰。 口试官:MyBatis中#{}和${}有什么区别? 王铁牛:#{}是预编译的,能防止SQL注入,${}是直接拼接SQL,有SQL注入风险。
口试官:最后问你下分布式相关的,Dubbo是什么,有什么作用? 王铁牛:Dubbo是一个分布式服务框架,用于服务的注册与发现、负载平衡等,让差别服务之间可以通讯调用。 口试官:RabbitMQ在项目中一般怎么用? 王铁牛:就是用来做消息队列的,比如异步处理、削峰填谷这些场景。 口试官:xxl - job知道吗,有什么用? 王铁牛:似乎是一个分布式任务调度平台,用来调度任务的。 口试官:Redis的长期化方式有哪些? 王铁牛:有RDB和AOF,RDB是定时快照,AOF是记录操作日志。
口试官:好了,本日的口试就到这里,你回家等通知吧。
问题答案详解


  • ArrayList和HashMap的区别:ArrayList是实现了List接口的动态数组,它是有序的,通过索引访问元素,查询速率快,增删元素特别是在中央位置增删时效率较低。HashMap实现了Map接口,以键值对的情势存储数据,是非有序的,通过键来快速查找值,查询效率高,增删元素效率也不错。
  • HashMap的底层数据结构:在JDK1.8之前,HashMap底层是数组加链表结构。数组的每个元素是一个链表的头节点,当发生哈希辩论时,新元素会添加到链表的尾部。JDK1.8之后,当链表长度达到8且数组长度大于64时,链表会转化为红黑树,以进步查询效率。红黑树是一种自平衡的二叉查找树,能保证在最坏情况下,查询、插入和删除操作的时间复杂度为O(log n)。
  • ArrayList扩容机制:ArrayList在初始化时,假如没有指定容量,会有一个默认容量10。当添加元素时,假如当前元素个数凌驾了数组的容量,就会进行扩容。扩容的方式是创建一个新的数组,新数组的长度是原数组长度的1.5倍,然后将原数组的元素复制到新数组中。
  • 线程池的作用:线程池可以管理和复用线程,克制频繁地创建和烧毁线程带来的性能开销。它可以控制线程的数量,防止线程过多导致系统资源耗尽。同时,线程池还可以对线程进行同一的管理,比如设置线程的优先级、名称等。
  • 常见的线程池

    • FixedThreadPool:固定巨细的线程池,线程池中的线程数量固定,当有任务提交时,假如线程池中有空闲线程,则直接使用空闲线程处理任务;假如没有空闲线程,则将任务放入壅闭队列中等候。
    • CachedThreadPool:可缓存的线程池,线程池中的线程数量不固定,可以根据任务的数量动态调解。假如线程池中有空闲线程,则直接使用空闲线程处理任务;假如没有空闲线程,则创建新的线程处理任务。当线程空闲时间凌驾60秒时,线程会被回收。
    • SingleThreadExecutor:单线程的线程池,线程池中只有一个线程。全部任务都会按照顺序依次被这个线程处理。
    • ScheduledThreadPool:支持定时和周期性任务的线程池,可以按照指定的耽误时间或周期实行任务。

  • JUC包下的CountDownLatch的作用:CountDownLatch是一个同步辅助类,它允许一个或多个线程等候其他线程完成一组操作。它有一个计数器,在初始化时指定计数器的初始值。当一个线程完成操作时,调用countDown()方法将计数器减1。其他线程可以调用await()方法等候计数器变为0,当计数器变为0时,等候的线程会被唤醒继续实行。
  • Spring的IOC和AOP

    • IOC(控制反转):是一种计划思想,将对象的创建和管理从应用步调代码中转移到Spring容器中。Spring容器负责创建对象、管理对象的生命周期、依赖注入等。通过IOC,应用步调代码只需要关注业务逻辑,而不需要关心对象的创建和管理细节。
    • AOP(面向切面编程):是一种编程范式,它允许在不修改原有代码的情况下,在特定的切点实行额外的逻辑。在Spring中,AOP重要用于实现横切关注点,比如日志记录、事务管理、权限控制等。通过界说切面、切点和通知,Spring可以在目标方法实行前后、抛出异常时等时机实行相应的通知逻辑。

  • Spring Boot的自动设置原理:Spring Boot的自动设置是基于条件设置(@Conditional)和自动设置类实现的。Spring Boot会根据引入的依赖,自动扫描并加载对应的自动设置类。这些自动设置类会根据一定的条件(比如是否存在某个类、某个属性是否设置等)来决定是否生效。自动设置类中会使用@Bean注解来创建和设置一些默认的组件,从而实现自动设置的功能。
  • MyBatis中#{}和${}的区别:#{}是预编译的,它会将SQL语句中的参数用占位符?代替,然后通过PreparedStatement来实行SQL语句,能有用防止SQL注入。${}是直接拼接SQL,它会将参数的值直接替换到SQL语句中,存在SQL注入风险。因此,在使用MyBatis时,尽量使用#{}来传递参数。
  • Dubbo是什么,有什么作用:Dubbo是一个开源的分布式服务框架,用于办理分布式系统中服务的注册与发现、负载平衡、服务调用、服务治理等问题。它提供了高性能、透明化的RPC长途服务调用方案,以及服务的自动注册与发现机制,使得差别服务之间可以方便地进行通讯和调用。
  • RabbitMQ在项目中一般怎么用:RabbitMQ是一个开源的消息队列中央件,在项目中常用于异步处理、削峰填谷、解耦等场景。比如在电商系统中,用户下单后,可以将订单信息发送到消息队列中,由其他服务异步处理订单的后续操作,如库存扣减、物流通知等。在高并发场景下,消息队列可以缓存请求,克制瞬间大量请求对系统造成压力,实现削峰填谷的功能。同时,消息队列还可以将差别的服务解耦,使得服务之间的依赖关系更加清晰。
  • xxl - job知道吗,有什么用:xxl - job是一个分布式任务调度平台,它提供了任务的调度、管理、实行等功能。可以用于定时任务、批量任务等场景。比如在电商系统中,可以使用xxl - job定时实行数据统计任务,如每天凌晨统计前一天的销售额、订单量等数据。它支持分布式摆设,可以在多个节点上实行任务,进步任务的实行效率和可靠性。
  • Redis的长期化方式


  • RDB(Redis Database):是一种快照长期化方式,它会在指定的时间间隔内对数据进行快照,将内存中的数据以二进制的情势生存到磁盘上。RDB的优点是恢复速率快,由于它是直接将快照文件加载到内存中。缺点是可能会丢失最后一次快照到发生故障之间的数据。
  • AOF(Append Only File):是一种日志长期化方式,它会将Redis实行的每一个写操作命令追加到AOF文件中。当Redis重启时,会重新实行AOF文件中的命令来恢复数据。AOF的优点是数据的完备性和一致性更好,由于它记录了每一个写操作。缺点是文件体积较大,恢复速率相对较慢。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表