目录
在使用 HashMap 的时候,用 String 做 key 有什么好处?
HashMap、LinkedHashMap、TreeMap的区别?
Stringbuffer 和 Stringbuilder 的区别是什么?
ArrayList和LinkedList的区别和优缺点,以及使用场景
说一说 Synchronized 和 Volatile 的区别是什么?
Spring 中 BeanFactory 和 ApplicationContext 有什么区别?
在Spring的特性,除利用AOP面向切面做日志编程,你还用过哪些特性
Springboot 中怎么区分 Jpa 和 Mybties 使用场景?
Spring 框架中的 Bean 是线程安全的么?如果线程不安全,那么如何处理?
你都用过SpringCloud的哪些组件,它们的原理是什么?
如何进行JVM调优?JVM参数有哪些?怎么查看一个JAVA进程的JVM参数?谈谈你了解的JVM参数。如果一个java程序每次运行一段时间后,就变得非常卡顿,你准备如何对他进行优化?
系统上的文件导入、导出如何设计的?(如何做百万级的导入、导出)
JAVA初级
请简述你对 MVC 模式的理解
Mvc全程model view controller模型视图控制器 将业务数据模型 视图页面分开来控制,而且才用mvc三层架构可以降低模块之间的耦合性,提高代码的复用性。缺点是简单系统太过于追求mvc模式的话,会增加系统业务
Sprint Bean的生命周期
Spring Bean的生命周期可以分为以下几步:
1.通过Spring框架的beanFactory工厂利用反射机制创建bean对象;
2.根据set方法或者有参构造方法给bean对象的属性进行依赖注入;
3.判断当前bean对象是否实现相关的aware接口,诸如beanNameAware、beanFactoryAware接口,如果有的话执行对应的方法;
4.执行bean对象的后置处理器postprocessbeforinitialztion
5.执行初始化方法initMethod
6.执行bean对象的后置处理器postprocessafterinitialztion
7.判断当前bean对象是否为单例,是则放到spring对象容器中,多例直接返回bean对象;
8.使用bean对象;
9.关闭容器,调用destroy方法销毁对象。
简要概括:
1.实例化 Instantiation
2.属性赋值 Populate
3.初始化 Initialization
4.销毁 Destruction
Spring 自动装配 bean 有哪些方式?
自动装配有三种方式:
byName
byType
constructor
byName
byName 通过匹配 bean 的 id是否跟 setter 对应,对应则自动装配。
byType
byType 通过匹配 bean 中所需要的依赖类型在容器上下文中自动寻找装配。
byName 和 byType区别
使用 byName 需要保证 bean 的 id 唯一,且这个 bean 需要自动注入的属性和set方法与 bean 的 id 要一致。
使用 byType 需要保证 bean 的 class 唯一,且这个 bean 需要自动注入的属性和类型要一致。
说一下类的加载过程?
jvm主要组成部分:类加载器,执行引擎,运行时数据区,本地库接口
Java源代码经javac编译为字节码文件,类加载器加载字节码文件到内存,放入到运行时数据区方法区。再由执行引擎将字节码转为系统指令,并通过本地库接口交给cpu调用。
总的来说有三部分:
一、加载
将类的class文件读入到内存,并为之创建class文件(这个过程是由类加载器完成的)
二、链接(链接又分为三部分)
1、验证
2、准备(为静态变量分配空间,并赋初始值)
3、解析
三、初始化
赋真实值
在使用 HashMap 的时候,用 String 做 key 有什么好处?
HashMap内部实现是通过key的hashcode来确定value的存储位置,因为字符串是不可变的,所以当创建字符串时,它的hashcode被缓存下来,不需要再次计算,所以相比于其他对象更快
HashMap、LinkedHashMap、TreeMap的区别?
1、HashMap是根据键的hashcode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,取得的数据完全是随机的
2、LinkedHashMap保存了记录的插入顺序,在使用Iterator进行遍历的时候,先得到的肯定是先插入的数据,可以在构造时带参数,按照应用次数来进行排序
3、TreeMap实现SortMap接口,能够把它保存的记录根据键排序。默认的是升序排序,也可以指定排序的比较器,进行遍历的时候得到的是排序过的记录。
this 与 super 之间有什么区别?
在Java中,this和super的区别主要是:所表示的实例不同、调用的构造不同、访问的成员不同以及使用方式不同。
1、所表示的实例不同
this代表本类的当前实例,即可以通过this访问本类中的成员(this可以单独使用)
super用于访问从父类继承的、可见的成员,所以super不能表示父类实例,不能单独使用
2、调用的构造不同
this用于调用本类内部的其它重载的构造方法
super用于调用父类的构造方法
3、访问的成员不同
通过this. 可以访问本类中以及父类中继承的、可见的成员(方法 和属性(字段))
通过super.可以访问从父类中继承的、可见的成员( 方法、字段(属性) )
4、使用方式不同
this关键字可以单独使用,比如直接输出this或当作返回值
this关键字在本类中可以省略
super关键字不可以单独使用,必须通过super(参数)或super.形式使用
从本质上讲,this是一个指向本对象的指针, 然而super是一个Java关键字。
乐观锁和悲观锁的实现是怎么样的?
悲观锁一般都是通过加锁的方式来解决,而乐观锁的底层实现是CAS,也就是比较并替换,定义一个期望值,其他线程每次进行操作时,先和期望值进行比较,如果相同就修改原来的数据,如果不同,直接返回操作失败。
java中的乐观锁的实现最典型的就是原子类的操作
== 与 equals的区别
==:
如果==比较的是基本数据类型,那就是比较他们的值是否相等。
如果==比较是的引用数据类型,就是比较他们的地址是否相等。
equals():
比较两个对象是否相等。如果没有重写equals,作用和==类似。如果重写了equals,一般重写都是比较内容了
拿String来说:
String 中的 equals 方法是被重写过的,因为 object 的 equals 方法是比较的对象的内存地址,而 String 的 equals 方法比较的是对象的值。
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
Final 在 java 中有什么作用?
final关键字修饰类,表示被修饰的类不能被继承,参考String类。final关键字修饰方法,表示继承这个方法的类不能重写(override)被修饰方法,参考Object里面的wait方法。final修饰的变量,如果变量参数是八种原生数据类型,那么当前值不可以修改;如果是对象,则当前对象(对象的地址)不可修改,但是对象里面的变量不受影响,可以修改。
Stringbuffer 和 Stringbuilder 的区别是什么?
Stringbuffer线程安全,Stringbuilder线程不安全,Stringbuilder效率更快,因为它不需要加锁,不具备多线程安全
相对来说Stringbuffer就效率慢一些
ArrayList和LinkedList的区别和优缺点,以及使用场景
1、ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表结构。
2、对于随机访问的get和set方法,ArrayList要优于LinkedList,因为LinkedList要移动指针。
3、对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。
优缺点:
1、对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。
2、在ArrayList集合中添加或者删除一个元素时,当前的列表移动元素后面所有的元素都会被移动。而LinkedList集合中添加或者删除一个元素的开销是固定的。
3、LinkedList集合不支持 高效的随机随机访问(RandomAccess),因为可能产生二次项的行为。
4、ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
使用场景:
ArrayList使用在查询比较多,但是插入和删除比较少的情况,而LinkedList用在查询比较少而插入删除比较多的情况
说一说 Synchronized 和 Volatile 的区别是什么?
synchronized 可以作用于变量、方法、对象;volatile 只能作用于变量。
synchronized 可以保证线程间的有序性(个人猜测是无法保证线程内的有序性,即线程内的代码可能被 CPU 指令重排序)、原子性和可见性;volatile 只保证了可见性和有序性,禁止指令重排序,无法保证原子性。
synchronized 线程阻塞,volatile 线程不阻塞。
volatile 本质是告诉jvm当前变量在寄存器中的值是不安全的需要从内存中读取;sychronized 则是锁定当前变量,只有当前线程可以访问到,该变量其他线程被阻塞。
volatile 标记的变量不会被编译器优化;synchronized 标记的变量可以被编译器优化。
Java 中的 notify 和 notifyAll 有什么区别?
线程调用对象的wait方法那么线程会处在该对象的等待池中,等待池中的线程不会去竞争该对象的锁。
当线程调用对象notify,只会唤醒一个线程由等待池进入锁池中。当调用notifyAll方法,所有线程会有等待池进入锁池中等待竞争,这要看优先级了,竞争到对象锁的线程继续执行,直到执行完synchronized模块,才会释放掉该对象锁,被其他线程继续竞争
一个有@Transaction注解的方法中有锁,需要注意什么
在程序异常回滚后注意对锁的释放,以免死锁
Spring 是如何解决循环依赖?
三级缓存,简单来说,A创建过程中需要B,于是A将自己放到三级缓存里面,去实例化B,B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A,B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A放到一级缓存中。
并行和并发有什么区别?
并行:在同一时间段,多个请求访问不同资源,同时执行,互不影响,并行强调的是同一时间执行。
并发:在同一时间,多个请求同时访问同一个资源,并发强调是访问同一资源
Spring中 AOP 的实现原理是什么?
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
JAVA中级
Spring 静态代理的优缺点分别是什么?
优点是在不修改目标对象的前提下,可以通过代理对象对目标对象功能扩展缺点就是增加了代码维护的复杂度。
Spring中 AOP 的实现原理是什么?
Spring AOP中的动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类。
如果目标类没有实现接口,那么Spring AOP会选择使用CGLIB来动态代理目标类。CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那么它是无法使用CGLIB做动态代理的。
Spring 中 BeanFactory 和 ApplicationContext 有什么区别?
BeanFactory属于Spring容器相关体系的根结点接口。 ApplicationContext接口继承了BeanFactory接口。
BeanFactory只有两个功能 1创建实例 2 获取实例。 并且懒加载实例。
ApplicationContext则增加国际化,AOP拦截器,消息发送响应机制,访问资源(url及文件)等。
在Spring的特性,除利用AOP面向切面做日志编程,你还用过哪些特性
IOC、AOP一起做自定义注解,自定义注解实力化