结合那些大佬写的,本人只是记录一下面试用

2、说一下IOC 和 Aop
ioc:控制反转 控制反转是有两层意思,控制了什么?反转了什么?既然有反转那么就会有正转,那正转是什么?
控制:控制了外部资源的获取
正转:正转是我们在对象中主动去获取依赖对象
反转:反转是由容器控制对象的主动权,让对象由主动变为被动。比如你去找房子,在没有中介之前,你要去小区一个一个去找,然后跟房东进行商量,这样的话,两者之间的耦合度就非常高,你不找,房东就不会主动的去联系你,现在有了中介之后,你只需要将你的需求告诉中介,中介会根据你的需求去找房子,找到之后会通知,这样以来,你就跟房东的耦合度就会变低,在你们之间有一个中介,这个中介就相当于一个容器。

aop:面向切面 在程序中主要用来解决一些系统层面上的问题,比如日志、权限、事物。它利用一种横切的技术,剖解开封装的对象内部,将那些影响了多个类的公共行为封装到一个可重用的模块,命名为aspect,就是切面,所谓切面,简单的来说,就是将那些与业务逻辑无关,但又被业务模块所共同调用的逻辑或责任封装起来,减少系统中代码的重复两,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

3、静态代理与动态代理的区别?
静态代理通常只代理一个类,动态代理是代理一个接口下的多个实现类
静态代理事先知道自己要代理什么,动态代理事先不知道要代理什么,只有在运行的时候才知道
动态代理是实现jdk的invocationHandler里的invoke方法,代理的是接口,就是业务类所要实现的接口,通过
proxy的newPeoxyInstance来得到代理对象
还有一种动态代理CGLIB,他代理的是类,不需要业务类继承接口,通过派生的子类实现代理,通过运行时,动态的修改字节码达到修改类的目的


4、BeanFactory 与ApplicationContext的区别?
BeanFactory 和 ApplicationContext 是Spring的两大核心接口,都可以当作spring的容器,ApplicationContext是BeanFactory的子接口
1)、BeanFactory是Spring最底层的接口,包含了各种bean的定义,读取bean的配置文档,管理bean的加载实例化,控制bean的生命周期,维护bean之间的依赖关系。
ApplicationContext是beanfactory的子接口,除了继承beanfactory的所有功能外,还提供了更完整的框架功能
继承messageSource,因此支持国际化
统一的资源文件访问方式
提供在监听器中注册bean的事件
同时加载多个配置文件
载入有多个继承关系的上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层

2)、beanfactory采用的是延迟加载形式来注入bean的,只有在使用到某个bean的时候调用getbean(),才对该 bean进行加载实例化,如果bean的某一个
属性没有注入,beanfactory加载后,第一次调用getbean()才会抛出异常。
applicationcontext是在容器启动时,一次性创建所有的bean。相对于beanfactory,applicationcontext更占用内存,如果应用程序bean比较多,启动
就比较慢

3)、beanfactory通常以编程的方式被创建,applicationcontext还可以以声明的方式创建,如使用contestLoader

4)、beanfactory 是手动注册,applicationcontext是自动注册

5、运行 Spring Boot 有哪几种方式
1、直接执行main方法
2、使用maven /gradle 插件运行
3、打包用命令或者放到容器中运行    java -jar xxxx.jar

6、Springboot的核心注解是什么?由什么组成?
核心注解是:@SpringbootApplication
@SpringbootApplication 是由
@SpringbootConfiguration  配置@Configuration,实现配置文件的功能
@EnableAutoConfiguration  打开自动装配功能
@ComponentScan             组件扫描
组成

7、缓存雪崩 缓存穿透 缓存击穿 是什么以及他们的解决方案
缓存雪崩:在某一段时间,缓存中的key集体过期,这一时间段的所有请求直接绕过redis,全部打到数据库上,数据库压力倍增,严重可导致宏机。
解决缓存雪崩方案:在给key设置过期时间的同时加上一个随机数,避免key集体失效。

缓存穿透:在缓存和数据库中一定不存在的数据,如果该请求过大,同样会绕过redis,打到数据库上。
解决缓存穿透方案:1、第一次请求过来,到数据库查询没有这条数据,设置一个null值到缓存中,同时给这条null值的数据设置一个较短的一个过期时间。
2、使用布隆过滤器进行拦截

缓存击穿:是指一个key非常抢手,大批的请求指向key,但是key过期了,所有请求直接打到数据库,数据库扛不住压力,就有可能宏机。
(比如双11活动1点抢购nike鞋子,但是该产品的key在0点59分过期,到1点了,缓存中没有这个产品了,所有请求就直接去访问数据库了。)
缓存击穿解决方案:设置key 的时间永不过期或者加互斥锁。

8、谈谈sql优化
1、在表中建立索引,优先考虑 where group by 使用到的字段
2、尽量避免使用select * 无用的字段会降低查询效率
3、尽量避免使用in 和 not in  会导致数据库引擎放弃索引进行全表扫描 ,如果是连续数值可以用between and 代替 如果是子表的话用exists代替
4、尽量避免使用or 会导致数据库引擎放弃索引进行全表扫描 可以使用union代替
5、尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描 优化方案:尽量在字段后面使用模糊查询
6、尽量避免进行 null值判断, 可以给字段添加默认是为0
7、尽量避免在where条件中等号左边进行表达式,函数操作,优化方案:在表达式 函数操作移动到等号右边
8、数据量大时,避免使用where 1=1 优化方案: 用代码拼装sql 进行判断 没有where 加 where 有where 加 and
9、优化表结构,数字类型就不要用字符串类型去代替

ArrayList 与 LikendList 的区别?
1、ArrayList是基于动态数组实现的非线程安全的集合,LikendList是基于双向循环链表实现的非线程安全的集合
2、ArrayList使用数组实现,无参构造函数默认长度是10,扩容后是扩容前的1.5倍,LikendList不存在扩容问题,
只需要将新增的元素放到集合尾部,修改相对应的指针即可
3、LikendList比ArrayList更占用内存,因为LikendList为每一个节点储存了两个引用节点,一个指向前一个元素,
一个指向后一个元素
4、LikendList不支持高效的随机访问
5、在查询方面,ArrayList相对于LikendList是比较快的,因为ArrayList可以通过下标直接找到元素,LikendList要
移动指针遍历每个元素直到找到位置
6、在新增元素和删除元素的时候,LikendList相对于ArrayList较快,因为ArrayList在新增元素和删除元素的时候可能
会涉及到扩容和复制数组,而LikendList只需要修改指针节点就行。
7、ArrayList的空间浪费主要体现在list列表的结尾预留一定的容量空间,LikendList的空间浪费主要体现在他的每一个
元素都需要消耗存储指针节点对象的空间

HashMap 与 Hashtable 的区别?
在Jdk1.8, HashMap 与 Hashtable 的区别主要如下:
线程安全不同 HashMap 是线程不安全的, Hashtable是线程安全的,因为Hashtable中的方法是synchronize
key和value是否可以为null HashMap的key 和 value都可以为null,key只能一次为null,Hashtable的key和value都不能为null
迭代器不同 HashMap的iterator是fail-fast迭代器,Hashtable还使用了enumerator迭代器
hash的计算方式不同 HashMap计算了hash值, Hashtable使用key的hashCode方法
默认初始大小和扩容方式不同 HashMap的默认初始值大小是16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍,
Hashtable默认初始值是11,扩容后是扩容前的2倍加1
是否有contains方法,HashMap没有contains方法,Hashtable包含contains方法,类似于containsValue
父类不同 HashMap继承自AbstractMap,Hashtable继承自Dictionary。 [ˈdɪkʃənri]

hashmap的默认扩容阈值是大于12还是大于等于12?
hashmap初始容量是16,在第一次put的时候进行的扩容初始化,链表长度大于8时会转换为红黑树,红黑树长度小于6时会退化为
链表,hashmap的扩容因子是0.75,初始化扩容阈值大于12


ArrayList 与 Vector [ˈvektə(r)]的区别?
相同点:
底层都是用数组实现 长度可变的数组结构 功能相同
不同点:
Vector是早期的jdk提供的,ArrayList是新版本代替Vector的
Vector的方法是同步的,是线程安全的,ArrayList是线程非安全的
默认初始化容量都是10,Vector扩容默认会翻倍,ArrayList只增加50%

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值