javase基础知识
什么是面向对象,面向对象和面向过程的区别
面向对象包括 继承,封装 多态。 面向对象是一种思维,省去了面向过程的造轮子的环节,就像人去理解事情一样,让复杂的问题简单化,面向对象更符合人的思考逻辑,面向对象符合机器的思想。
面向过程:是具体化的,流程化的,是把问题一步一步的进行拆解,分析,一步一步解决。
面向对象:是抽象的,只要抽象出这个类,里面会有很多功能,我们只需要负责调用就行。
构造方法,成员变量初始化以及静态成员变量三者的初始化顺序
执行的先后顺序 静态成员变量->成员变量->成员方法
详细的先后顺序:父类静态变量,父类静态代码块,子类静态变量,子类静态代码,父类非静态变量,父类非静态代码块,父类构造函数,子类非静态变量,子类非静态代码块,子类构造函数。
简述 Java 的多态
Java 多态可以分为编译时多态和运行时多态。
编译时多态主要指方法的重载,即通过参数列表的不同来区分不同的方法。
运行时多态主要指继承父类和实现接口时,可使用父类引用指向子类对象。
static 的主要作用有两个:
为某种特定数据类型或对象分配与创建对象个数无关的单一的存储空间。
使得某个方法或属性与类而不是对象关联在一起,即在不创建对象的情况下可通过类直接调用方法或使用类的属性。
JDK JRE JVM三者的区别和联系
jdk是Java的编译环境,里面包括了jre,jvm,核心类库,编译工具
jre是java的运行环境,里面包括了jvm,jre,运行所需要的环境
jvm是java的虚拟机,他可以帮助java进行跨平台的特性。
hashCode()与equals()之间的关系
比较两个对象,首先要比较hashCode()所生成的hash值。两个对象相等的话,那么哈希值是一定一样的,如果两个对象hashCode()相等,它们并不一定相等。如果哈希值一样的话那么还需要equals(),如果相等,才会判断两个对象的equals()是否相等,如果不相等,就认为这两个对象不相等,如果相等,那就认为这两个对象相等。
String,StringBuffer,StringBuilder的区别
String:线程安全 处理少量的字符串是不可变的字符串,运行速度最慢,创建之后会保存到常量池中。
StringBuffer:线程安全 在多线程中处理大量的字符串可以改变字符串,并且线程安全
StringBuilder:线程不安全 在单线程中处理大量的字符串,运行速度最快
简述final作用
final修饰变量会变成常量 不可更改
final修饰的引用型变量地址不可被改变 但是内容可以更改
final修饰的类不能被继承
final修饰的方法不能被重写,但是可以重载
为什么局部内部类和匿名内部类只能访问局部final变量
泛型中extends和super的区
extend是继承,是表示它所有的子类
super是表示他所有的父类
==和equals方法的区别
==:表示的是,比较基本类型的值,引用类型比较的是地址
equals:表示的是,比较两个对象的内容,返回类型都一致的情况下编写,方法的方法体,并且子类的访问权限不能小于父类
重载和重写的区别
重载方法,参数类型,数量,顺序可以改变,返回类型可以相同,也可以不通,不能作为判断条件
重写方法,是在方法名,参数列表
List和Set的区别
List:集合可以重复,有下表,有顺序
set:集合不能重复, 没有下标,无序
ArrayList和LinkedList区别(前者适合随机查找,共同实现了List接口,但是LinkedList还实现了Deque)
ArrayList:底层是数组,方便精确查询,增删改效率较低
LinkedList: 底层是链表,方便增删改,查询效率低
谈谈ConcurrentHashMap的扩容机制(不会,暂时搁置)
jdk1.7到jdk1.8 HashMap 发展了什么变化(底层)?(加入红黑树的目的是提高HashMap插入和查询整体效率)
HashMap的Put方法
HashMap的扩容机制,在jdk1.7之前采用的是数组加链表 把key和values封装为entry对象。 jdk1.8之后加入了红黑树,把对象封装为 node对象。
初始默认的初始容量是16
1.7 的时候不需要扩容的话就进行头插法,需要扩容的话 ,扩容后进行头插法
1.8 使用尾插法 首先判断,插入的是 链表node 还是 红黑树node
如果是链表node 进行插入 如果 链表长度大于8那么就转化为红黑树进行插入
key和value封装为Node插⼊到链表或红⿊树中后,再判断是否需要进⾏扩容,如果需要
就扩容,如果不需要就结束PUT⽅法
深拷贝和浅拷贝之间的区别
浅拷贝:是指会把基本类型的数值拷贝下来,还把对象的地址值拷贝下来
也就是浅拷⻉出来的对象,内部的类属性指向的是同⼀个对象
深拷贝:是指不仅会把基本类型的数值拷贝下来,还会地址指向的对象进行拷贝
也就是浅拷⻉出来的对象,内部的类属性指向的不是同⼀个对象
HashMap的扩容机制原理
什么事字节码?采用字节码的好处是什么?
字节码就是java编译后所产生的的二进制文件,可以让移植性更加优秀,虚拟机可以更好的去阅读。
java中的异常体系是怎样的
![](https://img-blog.csdnimg.cn/img_convert/84f571e1010bdec2561df1ef66683ee5.png)
在Java的异常处理机制中,什么时候应该抛出异常,是么时候捕获异常
Java的异常处理机制中,可以分为throw和throws
throw 是在方法中抛出异常,谁调用方法谁去解决异常
throws是在类上抛出异常,异常向上抛出 表示出现异常的一种可能性,但并不一定会发生这些异常
说说对线程安全的理解
ThreadLocal底层原理
并发,并行,串行之间的关系
Java死锁如何避免
造成死锁的几个原因:
一个资源每次只能被一个线程使用
一个线程在阻塞等待某个资源时,不释放已占有资源
一个线程已经获得的资源,在未使用之前,不能被强行剥夺
若干线程形成头尾相接的循环等待资源关系
在开发过程中:
要注意加锁顺序,保证每个线程按同样的顺序进行加锁
要注意加锁时限,可以针对锁设置一个超时时间
要注意死锁检查,这是一种预防机制,确保在第一时间发现死锁并进行解决
sping框架全家桶部分
Spring面试问题
谈谈你对IOC的理解
什么是控制?控制了什么?
控制对象的创建
控制对象内属性的赋值
反转是什么?
反转就是表示一种对象控制权的转移
反转有什么用?为什么要反转?
将对象交给Spring来控制,减轻了程序员的负担
总结:IoC表示控制反转,那么Spring会负责来创建对象,以及给对象内的属性赋值
也就是如果用Spring,那么对象的控制权会转交给Spring
单例Bean和单例模式
单例模式表示JVM中某个类的对象只会存在唯一一个
单例Bean并不表示JVM中只能存在唯一的某个类的Bean对象
Spring事务传播机制
Spring事务什么时候会失败
Spring事务的原理是AOP,进行了切面增强,那么失败的根本原因就是这个AOP不起作用
发生自调用,类里面使用this调用本类的方法
方法不是public的
数据库不支持事务
没有被Spring管理
异常被吃掉,事务不会回
Spring中的Bean创建的生命周期有哪些步骤
Spring中的Bean是线程安全的吗
Spring本身并没有针对Bean做线程安全的处理,所以:
如果Bean是无状态的,那么Bean则是线程安全的
如果Bean是有状态的,那么Bean则不是线程安全的
Bean是不是线程安全,跟Bean的作用域没有关系,Bean的作用域只表示Bean的生命周期
ApplicationContext和BeanFactory有什么区别
BeanFactory是Spring中非常核心的组件,表示Bean工厂,可以生成Bean,维护Bean,而ApplicationContext继承了BeanFactory,所以ApplicationContext拥有BeanFactory所有的特点,
也是一个Bean工厂,但是ApplicationContext除了继承BeanFactory之外,还继承了诸如MessageSource等接口,从而ApplicationContext还有获取系统环境变量,国际化,事务发布功等功能,这是BeanFactory所不具备的。
Spring中的事务是如何实现的
Spring事务底层基于数据库事务和AOP机制的
首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象为Bean
Spring中什么时候@Transactional会失效
因为Spring事务是基于代理来实现的,所以某个加了@Transactional的方法只有是被代理对象调用时,那么这个注解才会生效,所以如果是被代理来调用这个方法,那么@Transaction是不会生效的。
如果这个方法是private的,那么@Transactional也会失效的,因为底层cglib是基于父子类来实现的,子类是不能重载父类的private()方法的,所以无法很好的利用代理,也会导致@Transactional是失效。
Spring容器启动是怎样的流程
Spring用到了哪些设计模式
SpringBoot面试题
SpringBoot中常用注解及其底层原理
@SpringBootApplication注解:这个注解标识了SpringBoot工程,它实际上是另外三个注解的组合,这三个注解的组合:
@SpringBootConfiguration: 这个注解实际上就是一个@Configuration,表示启动类也是一个配置类
@EnableAutoConfiguration: 向Spring容器中导入了一个Selector,用来加载ClassPath下Spring下SpringFactories中所定义的自动配置类,将这些自动加载为配置Bean
@ComponentScan: 标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫描的路径是启动类所在的当前目录。
@Bean注解:用来定义Bean, 类似于XML中的<bean>标签,Spring在启动时,会对加了@Bean注解的方法进行解析,将方法的名字为beanName,并通过执行方法得到bean对象。
@Controller,@Service,@ResponseBody, @Autowired 等都可以说
Mybatis
Mybatis的优缺点
优点
缺点:sql编写工作量较大,要求开发人员sql语句的功底有一些要
sql语句依赖数据库,导致数据库移植性很差
#{}和${}的区别是什么?
#{}是预编译处理、是占位符,${}是字符串替换、是拼接符。
Mybatis在处理#{}时,会将sql中的替换为?号。调用 PreparedStatement来赋值;
Mybatis在处理${}时,会将sql中的${}替换成变量的值,调用Statement 来赋值;
使用#{}可以有效的防止 SQL注入,提高系统安全性。