互联网大厂Java求职者面试大揭秘:核心知识大考验
面试官:好了,咱们开始面试吧。首先第一轮,我问你几个Java核心知识的问题。Java中,接口和抽象类有什么区别?
王铁牛:嗯……接口就是不能实例化,里面全是抽象方法。抽象类能有普通方法,也能有抽象方法。
面试官:回答得还挺准确。那类的访问修饰符有哪些?
王铁牛:有public、private、protected,还有默认的不写的那种。
面试官:不错。再问一个,String类为什么是不可变的?
王铁牛:这……这我不太清楚。
第一轮结束。
面试官:接下来第二轮,咱们聊聊JUC相关的。什么是AQS?
王铁牛:AQS就是那个……那个啥,抽象队列同步器吧。
面试官:具体讲讲它的原理呢?
王铁牛:原理……原理不太好说,反正就是用来实现同步的。
面试官:那CountDownLatch和CyclicBarrier有什么区别?
王铁牛:这……我只知道CountDownLatch是倒计数,CyclicBarrier是循环等待。
第二轮结束。
面试官:最后一轮,说说Spring的相关知识。Spring的核心特性有哪些?
王铁牛:有依赖注入、面向切面编程。
面试官:Spring Boot的优点是什么?
王铁牛:这个……不太能说清楚。
面试官:MyBatis的缓存机制了解吗?
王铁牛:知道一点,有一级缓存和二级缓存。
面试结束。
面试官总结:整体面试下来,你对一些基础知识有一定的了解,但对于复杂点的问题回答得不是很清晰。我们会综合评估后给你通知,回家等消息吧。
答案详解
- 接口和抽象类的区别:
- 接口:
- 接口中的方法默认是public abstract的,即都是抽象方法,不能有方法体。
- 接口不能实例化对象。
- 接口主要用于实现多继承的功能,一个类可以实现多个接口。
- 抽象类:
- 抽象类中可以有抽象方法,也可以有非抽象方法。
- 抽象类不能被实例化,但可以有抽象类的引用指向它的子类实例。
- 一个类只能继承一个抽象类。
- 接口:
- 类的访问修饰符:
- public:被public修饰的类、方法、成员变量可以被任何其他类访问。
- private:被private修饰的类、方法、成员变量只能在本类中访问。
- protected:被protected修饰的类、方法、成员变量可以在本类、同包类以及子类中访问。
- 默认(不写):这种情况下,类、方法、成员变量可以在同包类中访问。
- String类不可变的原因:
- String类被声明为final,这意味着它不能被继承。
- String类的内部使用char数组来存储字符串内容,并且这个char数组被声明为final,即一旦初始化,其引用不能再指向其他数组,保证了数据的安全性。
- 当对String对象进行修改时,实际上是创建了一个新的String对象,而不是在原对象上修改。例如,s = s + "world"; 这里s会指向一个新创建的包含原字符串和"world"的新String对象,原对象不变。
- AQS(抽象队列同步器)原理:
- AQS是一个用来构建锁和同步器的框架。
- 它内部通过一个FIFO队列来管理等待获取同步状态的线程。
- 主要通过一个state变量来表示同步状态,线程通过调用acquire方法尝试获取同步状态,如果获取失败则会被加入到等待队列中。当同步状态被释放时,会从等待队列中唤醒一个线程来尝试获取同步状态。
- 子类可以通过继承AQS并重写tryAcquire、tryRelease等方法来实现自己的同步逻辑。
- CountDownLatch和CyclicBarrier的区别:
- CountDownLatch:
- 它是一个倒计数的同步工具。通过构造函数传入一个计数值,调用countDown方法会使计数值减1,当计数值为0时,所有等待在await方法上的线程会被唤醒。
- 主要用于一个线程等待其他多个线程完成某项操作后再继续执行。例如,主线程等待多个子线程完成任务后进行汇总操作。
- CyclicBarrier:
- 它是一个循环等待的同步工具。通过构造函数传入一个计数值,当每个线程调用await方法时,会等待直到所有线程都调用了await方法,此时会触发一个屏障动作(可传入一个Runnable任务),之后所有线程可以继续执行,并且计数器会重置,可以再次使用。
- 主要用于多个线程相互等待,直到满足某个条件后一起继续执行。例如,多个运动员在起跑线等待,当所有人都准备好后一起起跑。
- CountDownLatch:
- Spring的核心特性:
- 依赖注入(Dependency Injection):通过控制反转(IoC)容器,将对象之间的依赖关系由程序主动创建改为由容器注入,降低了对象之间的耦合度。例如,在一个类中需要使用另一个类的实例时,不需要在本类中new创建,而是由容器提供。
- 面向切面编程(Aspect Oriented Programming,AOP):可以将一些横切关注点(如日志、事务管理等)从业务逻辑中分离出来,以切面的形式进行统一处理。比如在方法执行前后添加日志记录,或者对业务方法进行事务控制。
- Spring Boot的优点:
- 快速构建项目:提供了大量的starter依赖,能够快速搭建一个Spring应用,减少了配置文件的编写。
- 自动配置:根据项目引入的依赖自动进行一些合理的默认配置,大大简化了开发过程。
- 嵌入式容器:内置了如Tomcat等嵌入式容器,无需外部部署容器,方便开发和部署。
- 微服务友好:很适合构建微服务架构,方便与其他微服务进行集成和交互。
- MyBatis的缓存机制:
- 一级缓存:
- 是SqlSession级别的缓存。当在同一个SqlSession中执行相同的查询时,会直接从缓存中获取结果,不会再次查询数据库。
- 当执行insert、update、delete操作或者调用SqlSession的clearCache方法时,一级缓存会被清空。
- 二级缓存:
- 是Mapper级别的缓存。多个SqlSession可以共享二级缓存。
- 开启二级缓存后,在不同的SqlSession中执行相同的查询,会先从二级缓存中查找,如果没有则查询数据库并将结果放入二级缓存。
- 二级缓存的更新需要手动配置,比如可以通过在Mapper.xml中设置flushCache属性等方式来控制缓存的刷新。
- 一级缓存:
711

被折叠的 条评论
为什么被折叠?



