写点什么

Java 面试题总结(乱序版,2020-08-20,面试总结 + 详细解答

用户头像
Java高工P7
关注
发布于: 21 分钟前
  1. unlock

  2. read

  3. load

  4. assign

  5. use

  6. store

  7. write


volatile 修饰的变量,只有对 volatile 进行 assign 操作,才可以 load,只有 load 才可以 use,,这样就保证了在工作内存操作 volatile 变量,都会同步到主内存中。


六、为什么说 Synchronized 是一个悲观锁?乐观锁的实现原理又是什么?什么是 CAS,它有什么特性?




Synchronized 的并发策略是悲观的,不管是否产生竞争,任何数据的操作都必须加锁。


乐观锁的核心是 CAS,CAS 包括内存值、预期值、新值,只有当内存值等于预期值时,才会将内存值修改为新值。


七、乐观锁一定就是好的吗?




乐观锁认为对一个对象的操作不会引发冲突,所以每次操作都不进行加锁,只是在最后提交更改时验证是否发生冲突,如果冲突则再试一遍,直至成功为止,这个尝试的过程称为自旋。


  1. 乐观锁没有加锁,但乐观锁引入了 ABA 问题,此时一般采用版本号进行控制;

  2. 也可能产生自旋次数过多问题,此时并不能提高效率,反而不如直接加锁的效率高;

  3. 只能保证一个对象的原子性,可以封装成对象,再进行 CAS 操作;


八、forward 和 redirect 的区别?




  1. forward 是直接请求转发;redirect 是间接请求转发,又叫重定向。

  2. forward,客户端和浏览器执行一次请求;redirect,客户端和浏览器执行两次请求。

  3. forward,经典的 MVC 模式就是 forward;redirect,用于避免用户的非正常访问。(例如用户非正常访问,servlet 就可以将 HTTP 请求重定向到登录页面)。

  4. forward,地址不变;redirect,地址改变。

  5. forward 常用方法:RequestDispatcher 类的 forward()方法;redirect 常用方法:HttpServletRequest 类的 sendRedirect()方法。


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




保证程序只有一个对象的实例,叫做单例模式;


内部类的方式实现单例模式,是线程安全的;


双重验证方式实现单例模式也是线程安全的;


【源码分析设计模式 1】JDK中的单例模式


十、Spring 有几种配置方式?



1、xml 配置文件

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"


xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://www.springframework.org/schema/beans


http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">


<bean id="jackma" class="com.tyq.dto.User">


<property name="name" value="jackma" />


<property name="age" value="55" />


<property name="dog" ref="jm" />


</bean>


<bean id="jm" class="com.tyq.dto.Dog">


<property name="name" value="jack" />


<property name="breed" value="金毛" />


<property name="age" value="2" />


</bean>


</beans>

2、基于注解的方式

项目越来越大,基于 xml 配置太麻烦,Spring 2.x 时代提供了声明 bean 的注解。


(1)Bean 的定义


@Component、@Controller、@Service、@Repository。


(2)Bean 的注入


@Autowire

3、基于 Java 的方式

Spring 3.x 以后,可以


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


通过 Java 代码装配 Bean。


@Configuration


public class DemoConfig {


@Bean


public User jackma(){


return new User();


}


@Bean


public Dog dog(){


return new Dog();


}


@Bean //两个狗


public Dog haqi(){


return new Dog();


}


}


@Component("jackma")


public class User {


private String name;


private int age;


private Dog dog;


//get,set 方法略


}


原来就是配置类啊,通过 @Bean、@Component、getBean 方式进行 Bean 的注册和发现。


十一、Spring Boot 中的监视器是什么?




监听器也叫 listener,是 servlet 的监听器,可以用于监听 web 应用程序中某些对象的创建、销毁、增加、修改、删除等动作的发生,然后做出相应的响应处理。当范围对象的状态发生变化时,服务器自动调用监听器对象中的方法,常用于系统加载时进行信息初始化,统计在线人数和在线用户,统计网站的访问量。


配置监听器的方法:


  • 通过 @Component 把监听器加入 Spring 容器中管理;

  • 在 application.properties 中添加 context.listener.classes 配置;

  • 在方法上加 @EventListener 注解;


十二、hibernate 中如何在控制台查看打印的 sql 语句?




spring.jpa.properties.hibernate.show_sql=true


spring.jpa.properties.hibernate.format_sql=true


spring.jpa.properties.hibernate.use_sql_comments=true


十三、说一下 mybatis 的一级缓存和二级缓存?




一级缓存是 session 级别的缓存,默认开启,当查询一次数据库时,对查询结果进行缓存,如果之后的查询在一级缓存中存在,则无需再访问数据库;


二级缓存是 sessionFactory 级别的缓存,需要配置才会开启。当进行 sql 语句查询时,先查看一级缓存,如果不存在,访问二级缓存,降低数据库访问压力。


十四、RabbitMQ 中 vhost 的作用是什么?




vhost 可以理解为 mini 版的 RabbitMQ,其内部均含有独立的交换机、绑定、队列,最重要的是拥有独立的权限系统,可以做到 vhost 范围内的用户控制。从 RabbitMQ 全局考虑,不同的应用可以跑在不同的 vhost 上,作为不同权限隔离的手段。


十五、如何获取当前数据库版本?




//MySQL,,mysql -v


select version();


//Oracle?


select * from v$version;


十六、Redis 和 memecache 有什么区别?




1、Redis 相比 memecache,拥有更多的数据结构和支持更丰富的数据操作。


(1)Redis 支持 key-value,常用的数据类型主要有 String、Hash、List、Set、Sorted Set。


(2)memecache 只支持 key-value。


2、内存使用率对比,Redis 采用 hash 结构来做 key-value 存储,由于其组合式的压缩,其内存利用率会高于 memecache。


3、性能对比:Redis 只使用单核,memecache 使用多核。


4、Redis 支持磁盘持久化,memecache 不支持。


Redis 可以将一些很久没用到的 value 通过 swap 方法交换到磁盘。


5、Redis 支持分布式集群,memecache 不支持。


十七、怎么判断对象是否可以被回收?



1、引用计数算法

(1)判断对象的引用数量


  • 通过判断对象的引用数量来决定对象是否可以被回收;

  • 每个对象实例都有一个引用计数器,被引用+1,完成引用-1;

  • 任何引用计数为 0 的对象实例可以被当做垃圾回收;


(2)优缺点


  • 优点:执行效率高,程序受影响较小;

  • 无法检测出循环引用的情况,导致内存泄漏;

2、可达性分析算法

通过判断对象的引用链是否可达来决定对象是否可以被回收。


如果程序无法再引用该对象,那么这个对象肯定可以被回收,这个状态称为不可达。


那么不可达状态如何判断呢?


答案是 GC roots,也就是根对象,如果一个对象无法到达根对象的路径,或者说从根对象无法引用到该对象,该对象就是不可达的。


以下三种对象在 JVM 中被称为 GC roots,来判断一个对象是否可以被回收。


(1)虚拟机栈的栈帧


每个方法在执行的时候,JVM 都会创建一个相应的栈帧(操作数栈、局部变量表、运行时常量池的引用),当方法执行完,该栈帧就从栈中弹出,这样一来,方法中临时创建的独享就不存在了,或者说没有任何 GC roots 指向这些临时对象,这些对象在下一次 GC 的时候便会被回收。


(2)方法区中的静态属性


静态属性数据类属性,不属于任何实例,因此该属性自然会作为 GC roots。这要这个 class 在,该引用指向的对象就一直存在,class 也由被回收的时候。


class 何时会被回收?


  • 堆中不存在该类的任何实例

  • 加载该类的 classLoader 已经被回收

  • 该类的 java.lang.class 对象没有在任何地方被引用,也就是说无法通过反射访问该类的信息


(3)本地方法栈引用的对象


十八、java 中都有哪些引用类型?




1、强引用


Java 中默认声明的就是强引用,比如:


Object obj = new Object();


obj = null;


只要强引用存在,垃圾回收器将永远不会回收被引用的对象。如果想被回收,可以将对象置为 null;?


2、软引用(SoftReference)


在内存足够的时候,软引用不会被回收,只有在内存不足时,系统才会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会跑出内存溢出异常。


byte[] buff = new byte[1024 * 1024];


SoftReference<byte[]> sr = new SoftReference<>(buff);


3、弱引用(WeakReference)

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
Java面试题总结(乱序版,2020-08-20,面试总结+详细解答