《互联网大厂Java求职者面试:核心知识大考验》

86 阅读5分钟

面试官:请简要介绍一下Java核心知识中的面向对象编程的三大特性。

王铁牛:嗯,三大特性就是封装、继承、多态。封装就是把数据和操作数据的方法封装在一起;继承就是子类继承父类的属性和方法;多态就是同一个行为具有多个不同表现形式。

面试官:回答得不错。那说说在多线程环境下,如何保证数据的一致性?

王铁牛:可以用锁啊,比如synchronized关键字,还有Lock接口。

面试官:嗯,有一定了解。再问一个,JVM的内存模型主要分为哪几个部分?

王铁牛:这个……好像是堆、栈、方法区吧。

第一轮结束。

面试官:接下来谈谈线程池,线程池有哪些主要参数?

王铁牛:这个……我想想,有corePoolSize、maximumPoolSize、keepAliveTime这些吧。

面试官:回答得不太准确。那说说HashMap在多线程环境下可能会出现什么问题?

王铁牛:嗯……会出现死循环吧。

面试官:那如何解决HashMap在多线程环境下的问题?

王铁牛:这个……我不太清楚。

第二轮结束。

面试官:说说Spring框架的核心特性。

王铁牛:这个……能让代码更简洁,方便管理吧。

面试官:Spring Boot和Spring相比,有哪些优势?

王铁牛:嗯……好像启动更方便,配置更少。

面试官:那MyBatis的核心原理是什么?

王铁牛:这个……不太清楚。

第三轮结束。

面试官:今天的面试就到这里,回去等通知吧。

答案:

  • 面向对象编程的三大特性:
    • 封装:将数据和操作数据的方法封装在一起,对外提供统一的接口,隐藏内部实现细节,提高数据的安全性和程序的可维护性。例如,一个类中的成员变量可以使用private修饰,通过public的方法来访问和修改这些变量。
    • 继承:子类继承父类的属性和方法,实现代码的复用。子类可以扩展父类的功能,同时也可以重写父类的方法。例如,一个类A有一些属性和方法,类B继承自类A,那么类B就可以直接使用类A的属性和方法,并且可以根据需要进行扩展和修改。
    • 多态:同一个行为具有多个不同表现形式。可以通过方法重载和方法重写来实现多态。方法重载是指在同一个类中定义多个同名的方法,但参数列表不同;方法重写是指子类重写父类的方法,实现不同的行为。例如,一个父类有一个方法print,子类可以重写这个方法,实现不同的打印逻辑。
  • 多线程环境下保证数据一致性:
    • 使用synchronized关键字:可以修饰方法或代码块,保证同一时间只有一个线程能访问被修饰的部分。例如,在一个共享资源的操作方法上使用synchronized,防止多个线程同时操作导致数据不一致。
    • 使用Lock接口:如ReentrantLock,提供了更灵活的锁控制。可以通过lock()方法获取锁,unlock()方法释放锁,还可以实现公平锁等特性。
  • JVM的内存模型主要分为:
    • 堆:存放对象实例,是垃圾回收的主要区域。
    • 栈:存放局部变量、方法调用等信息。
    • 方法区:存储类信息、常量、静态变量等。
  • 线程池的主要参数:
    • corePoolSize:核心线程数,当提交的任务数小于corePoolSize时,线程池会创建新线程来执行任务。
    • maximumPoolSize:最大线程数,当提交的任务数大于corePoolSize且任务队列已满时,会创建新线程直到线程数达到maximumPoolSize。
    • keepAliveTime:线程存活时间,当线程数大于corePoolSize时,多余的线程在空闲时间超过keepAliveTime后会被销毁。
    • unit:keepAliveTime的时间单位。
    • workQueue:任务队列,用于存放提交的任务。
    • threadFactory:线程工厂,用于创建线程。
    • handler:拒绝策略,当线程数达到maximumPoolSize且任务队列已满时,如何处理新提交的任务。
  • HashMap在多线程环境下可能出现的问题及解决方法:
    • 问题:在扩容时可能会出现死循环。因为HashMap的扩容机制会导致链表结构发生变化,在多线程环境下可能会导致链表形成环形结构,从而导致死循环。
    • 解决方法:
      • 使用ConcurrentHashMap:它是线程安全的哈希表,内部采用分段锁机制,提高了并发性能。
      • 使用Collections.synchronizedMap(new HashMap<>()):将HashMap包装成线程安全的Map。
  • Spring框架的核心特性:
    • 依赖注入(Dependency Injection):通过控制反转(IoC)容器将对象之间的依赖关系注入到对象中,降低对象之间的耦合度。
    • 面向切面编程(AOP):可以在不修改原有代码的基础上,对系统进行功能增强,如日志记录、事务管理等。
    • IoC容器:管理对象的生命周期和依赖关系,提供对象的创建、配置和管理等功能。
  • Spring Boot和Spring相比的优势:
    • 快速启动:Spring Boot采用了自动配置的机制,能够快速创建一个独立的、生产级别的Spring应用,减少了大量的配置工作。
    • 内置服务器:内置了Tomcat等服务器,无需手动配置和部署,方便开发和部署。
    • 简化配置:通过约定大于配置的原则,减少了繁琐的XML配置,使代码更加简洁。
  • MyBatis的核心原理:
    • 基于SQL映射文件:通过XML或注解定义SQL语句和参数映射关系。
    • 动态SQL:可以根据不同的条件动态生成SQL语句。
    • 映射器接口:通过接口定义方法,MyBatis会根据接口方法的参数动态生成SQL语句并执行,将结果映射到Java对象中。
    • 缓存机制:包括一级缓存(本地缓存)和二级缓存(全局缓存),提高查询性能。