接口和抽象类的区别
相同点
1.不能实例化
2.可以将抽象类和接口作为引用类型
3.一个类如果继承某个抽象方法或实现某个接口都需要对其中的抽象方法全部实现,否则仍然要被声明为抽象类
不同点
区别 | 抽象类 | 接口 |
---|---|---|
构造器 | 抽象类中可以有构造器 | 接口中不能有构造器 |
具体方法 | 可以有抽象方法和具体方法 | 方法全部都是抽象方法 |
访问控制权限 | 抽象类可以有所有访问控制权限 | 接口成员全是public的 |
成员变量 | 抽象类可以定义成员变量 | 接口的成员变量都是常量 |
静态方法 | 抽象类可以包含静态方法 | 接口中不能有静态方法 |
继承实现 | 一个类只能继承一个抽象类 | 一个类可以实现多个接口 |
概念
抽象类一般描述抽象出来的概念
接口一般描述某些共同事物的共同特征
Java面向对象的三大特性
封装、继承、多态
封装: 把让用户知道的暴露出来,不让用户知道的全部隐藏
继承: 父子对象关系
多态: 同一个方法的调用,由于对象不同行为也可能不同
要点:
1.多态是方法的多态
2.多态存在的三个条件:封装、继承、父类引用指向子类对象
final关键字的作用
1.修饰变量=> 常量
2.修饰方法=> 不可被子类重写但是可以重载
3.修饰类 => 修饰的类不能被继承
ArrayList和LinkList的区别
相同点:
都实现了List数据结构
不同点:
ArrayList是基于索引的数据接口,底层是数组,时间复杂度是O(1)随机访问
LinkList是以元素列表的形式存储,查找时间复杂度是O(n)
LinkList操作更快,因为不要像数组那样重新计算大小更新索引
LinkList比ArrayList更占内存
事务四特性
1.原子性:记录需要回滚的日志信息,事务回滚时撤销已执行成功的SQL
2.一致性:由原子性、持久性、隔离性保证,保证代码业务的一致性
3.隔离性:由MVCC保证(多版本的并发控制)
4.持久性:修改数据时会在日志中保存,数据没改成功,日志保存成功就不会丢失
BeanFactory和ApplicationContext的区别
相同点:
1) Spring提供了两种不同的IOC容器,一个是BeanFactory,一个是ApplicationContext,都是Java接口,ApplicationContext继承于BeanFactory
2)都可以用XML配置属性,也支持属性的自动注入
3) BeanFactory和ApplicationContext都提供一种getBean的方法
不同点:
1)调用getBean方法时,BeanFactory会实例化Bean,ApplicationContext只在容器启动时实例化Bean
2)BeanFactory不支持国际化,ApplicationContxt支持国际化
3)BeanFactory核心实现是XMLBeanFactory,ApplicationContext核心实现是ClassPathXmlAplicationContext
4)使用BeanFactory自动注入,需要使用API注册AutowiredBeanPostProcesser,ApplicationContext使用XML配置
5)BeanFactory提供基本IOC和DI功能,ApplicationContext提供更高级的功能
6)测试和非生产环境用BeanFactory,生产用ApplicationContext
HashMap的理解
(1)HashMap非线程同步,是线程不安全的
(2)HashMap的<key,value>允许空值
(3)HashMap使用Iterator
(4)HashMap中的hash数组默认大小是16,增长方式是2的指数倍
(5)HashMap继承AbstractMap类
(6)保证HashMap线程安全:使用Collections.synchronizedMap()代理一个新类 或者 改写HashMap分成多个独立块,减少锁冲突
MySQL隔离级别
读取未提交
读取提交
可重复读
可串行化
Spring、SpringMVC和SpringBoot的区别
Spring的核心是IOC(控制反转)和AOP(面向切面)
SpringMVC是前端视图开发,文件配置、后台接口逻辑
SpringBoot简化配置,只专注于开发为服务后台接口
理解Spring
Spring是一个框架、一个容器,同时是一个生态
Spring的核心
- IOC(控制反转)
- DI(依赖注入)
- AOP(面向切面)
- 容器(包含并管理应用对象的生命周期,Spring是桶,对象是水)
Spring的事务原理
声明式事务,通过**@Transactional**注解实现
事务的操作是AOP的核心体现,当一个方法加@Transactional注解后,Spring就会基于这个类生成代理对象,把这个代理对象作为Bean,当使用这个代理对象方法的时候,如果有事务处理,就会把事务自动提交给关系,然后执行具体业务逻辑,如果逻辑没异常就直接提交;如果有异常,事务就回滚。
AOP
为解耦而生
一个系统由不同组件组成,每个组件负责特定功能,有很多组件与业务无关,如日志、事务、权限等核心组件,经常融入一些业务逻辑,代码冗余,所以将公共的代码逻辑抽离出一个切面,注入到具体业务中。
AOP通过动态代理的方式,将需要注入切面的对象进行代理,在调用时加入公共逻辑,不需要修改原有的业务代码,却可以增强逻辑。
AOP是IOC的扩展功能,是BeanPostProcesser的扩展点。
Redis为什么单线程还这么快
纯内存操作
单线程,避免切换消耗CPU,不考虑锁,没有性能消耗
采用非阻塞I/O多路复用机制