面试未答上的题21/1/7

类和接口 的不同

区别:接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用

接口(interface)是抽象方法和常量值定义的集合。

接口的特点:

用interface来定义。

接口中的所有成员变量都默认是由public static final修饰的。

接口中的所有抽象方法都默认是由public abstract修饰的。

接口中没有构造器。

接口采用多继承机制。

  1. JDK7及以前:只能定义全局常量和抽象方法
    全局常量:public static final的.但是书写时,可以省略不写
    抽象方法:public abstract的

  2. JDK8:除了定义全局常量和抽象方法之外,还可以定义静态方法、默认方法静态方法 通过接口直接调用。默认方法,通过实现类对象来调用

  3. 接口的具体使用,体现多态性 (声明为一个接口,用的是他实现类的对象)

Mysql innodb搜索引擎的优势

InnoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。

MyISAM它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。

LInux操作 cp mkdir cat touch vim

锁之 ThreadLocal 应用场景

概念:
ThreadLocal其实是与线程绑定的一个变量。ThreadLocal和Synchonized都用于解决多线程并发访问。
但是ThreadLocal与synchronized有本质的区别。

  1. Synchronized用于线程间的数据共享,

  2. 而ThreadLocal则用于线程间的数据隔离。

  3. Synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。

  4. 一句话理解ThreadLocal,向ThreadLocal里面存东西就是向它里面的Map存东西的,然后ThreadLocal把这个Map挂到当前的线程底下,这样Map就只属于这个线程了。

场景
6. 场景一:ThreadLocal 用作保存每个线程独享的对象,为每个线程都创建一个副本,这样每个线程都可以修改自己所拥有的副本, 而不会影响其他线程的副本,确保了线程安全。
7. ThreadLocal 用作每个线程内需要独立保存信息,以便供其他方法更方便地获取该信息的场景。每个线程获取到的信息可能都是不一样的,前面执行的方法保存了信息后,后续方法可以通过ThreadLocal 直接获取到,避免了传参,类似于全局变量的概念。
8. 典型场景一
这种场景通常用于保存线程不安全的工具类,典型的需要使用的类就是 SimpleDateFormat。

在这种情况下,每个Thread内都有自己的实例副本,且该副本只能由当前Thread访问到并使用,相当于每个线程内部的本地变量,这也是ThreadLocal命名的含义。因为每个线程独享副本,而不是公用的,所以不存在多线程间共享的问题。

线程池的参数 线程池的启动流程

  1. 核心线程数
  2. 任务队列容量 (阻塞队列)
  3. 最大线程数
  4. 线程空闲时间
  5. keepAliveTime 线程空闲时间
  6. 允许核心线程超时
  7. 任务拒绝处理器

线程池面试题

G1的优势

java判断对象是否垃圾的两个算法:
引用计数算法
可达性分析法
两个算法的文章地址
新生代 : 复制算法 (标记复制算法)
老年代:标记整理算法
标记清除算法
jvm清除算法
垃圾收集器面试题

索引的类型

普通索引
唯一索引
主键索引
组合索引
全文索引
索引面试题

设计模式 适配器模式和装饰着模式,工厂和抽象工厂的区别

工厂模式和抽象工厂模式区别:
  1. 提供一个用于创建对象的接口(工厂接口),让其实现类(工厂实现类)决定实例化哪一个类(产品类),并且由该实现类创建对应类的实例
  2. 为创建一组相关或相互依赖的对象提供一个接口,而且无需指定他们的具体类
  3. 抽象工厂模式是工厂方法模式的升级版本,他用来创建一组相关或者相互依赖的对象。
    它与工厂方法模式的区别就在于,工厂方法模式针对的是一个产品等级结构;而抽象工厂模式则是针对的多个产品等级结构。

    装饰者模式和适配器模式区别:

    装饰者模式:
    装饰者模式(Decorator Pattern)是指在不改变原有对象的基础之上,将功能附加到对象上,提供了比继承更有弹性的替代方案(扩展原有对象的功能),属于结构型模式。
    1、用于扩展一个类的功能或给一个类添加附加职责。
    2、动态的给一个对象添加功能,这些功能可以再动态的撤销。
    3、别人还不知道底层实现原理
    适配器模式:
    适配器模式:
    适配器模式(Adapter Pattern)是指将一个类的接口转换成客户期望的另一个接口,使原本的接口不兼容的类可以一起工作,属于结构型设计模式。
    1、已经存在的类,它的方法和需求不匹配(方法结果相同或相似)的情况。
    2、适配器模式不是软件设计阶段考虑的设计模式,是随着软件维护,由于不同产品、不同厂家造成功能类似而接口不相同情况下的解决方案。

红黑树转成数组+链表 当链表数为6时

List set Map的区别

  1. List是一个继承于Collection的接口,即List是集合中的一种。List是有序的队列,List中的每一个元素都有一个索引;
  2. Set是一个继承于Collection的接口,Set是一种不包括重复元素的Collection。它维持它自己的内部排序,所以随机访问没有任何意义
  3. Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。

1、List、Set都是继承自Collection接口,Map则不是

2、List特点:元素有放入顺序,元素可重复 ,Set特点:元素无放入顺序,元素不可重复,重复元素会覆盖掉,(注意:元素虽然无放入顺序,但是元素在set中的位置是有该元素的HashCode决定的,其位置其实是固定的,加入Set 的Object必须定义equals()方法 ,另外list支持for循环,也就是通过下标来遍历,也可以用迭代器,但是set只能用迭代,因为他无序,无法用下标来取得想要的值。)

3、Set和List对比:

Set:检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变。

List:和数组类似,List可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变。

4、Map适合储存键值对的数据

Springboot文件的加载顺序

加载顺序地址

Mybatis 动态sql的标签

  1. Where 标签
  2. IF标签
  3. trim标签
  4. choose标签
  5. set标签
  6. foreach标签
  7. bind标签
  8. sql标签

动态sql标签

Springboot使用标签

@Value
@Controller
@Service
@Componet
@RequestMapping
@RequestBody
@ResponseBody
@Autowire
@Scope(“prototype”) 多例

并发的三大特性 : 原子性, 可见性,有序性‘’

栈帧

线程的底层

简易版运行原理
难度版

B+树和B树区别

(它一个节点有一堆索引)
B+树是B树的一种变体,查询性能更好。m阶的b+树的特征

B+树相比于B树的查询优势

  1. b+树的中间节点不保存数据,所以磁盘页能容纳更多的节点元素。更“矮胖”
  2. b+树查询必须查找到叶子节点,b树只要匹配到即可不用管元素位置。因此
    b+树查找更稳定
  3. 对于范围查找来说,b+树只需要遍历叶子节点链表即可,b树却需要重复地中序遍历
    B+树和B树区别

Spring IOC 和AOP

spring 的优点
1.降低了组件之间的耦合性 ,实现了软件各层之间的解耦
2.可以使用容易提供的众多服务,如事务管理,消息服务等
3.容器提供单例模式支持
4.容器提供了AOP技术,利用它很容易实现如权限拦截,运行期监控等功能
5.容器提供了众多的辅助类,能加快应用的开发
6.spring对于主流的应用框架提供了集成支持,如hibernate,JPA,Struts等
7.spring属于低侵入式设计,代码的污染极低
8.独立于各种应用服务器
9.spring的DI机制降低了业务对象替换的复杂性
10.Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可以自由选择spring的部分或全部

什么是DI机制?
依赖注入(Dependecy Injection)和控制反转(Inversion of Control)是同一个概念,具体的讲:当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者
因此也称为依赖注入。
spring以动态灵活的方式来管理对象 , 注入的两种方式,
设置注入和构造注入。
设置注入的优点:直观,自然
构造注入的优点:可以在构造器中决定依赖关系的顺序。

什么是AOP?
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面

面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。

另一种解释文章

Spring IOC的好处

作者:Mingqi
链接:https://www.zhihu.com/question/23277575/answer/169698662
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

要了解控制反转( Inversion of Control ), 我觉得有必要先了解软件设计的一个重要思想:依赖倒置原则(Dependency Inversion Principle )。什么是依赖倒置原则?假设我们设计一辆汽车:先设计轮子,然后根据轮子大小设计底盘,接着根据底盘设计车身,最后根据车身设计好整个汽车。这里就出现了一个“依赖”关系:汽车依赖车身,车身依赖底盘,底盘依赖轮子。这样的设计看起来没问题,但是可维护性却很低。假设设计完工之后,上司却突然说根据市场需求的变动,要我们把车子的轮子设计都改大一码。这下我们就蛋疼了:因为我们是根据轮子的尺寸设计的底盘,轮子的尺寸一改,底盘的设计就得修改;同样因为我们是根据底盘设计的车身,那么车身也得改,同理汽车设计也得改——整个设计几乎都得改!我们现在换一种思路。我们先设计汽车的大概样子,然后根据汽车的样子来设计车身,根据车身来设计底盘,最后根据底盘来设计轮子。这时候,依赖关系就倒置过来了:轮子依赖底盘, 底盘依赖车身, 车身依赖汽车。这时候,上司再说要改动轮子的设计,我们就只需要改动轮子的设计,而不需要动底盘,车身,汽车的设计了。这就是依赖倒置原则——把原本的高层建筑依赖底层建筑“倒置”过来,变成底层建筑依赖高层建筑。高层建筑决定需要什么,底层去实现这样的需求,但是高层并不用管底层是怎么实现的。这样就不会出现前面的“牵一发动全身”的情况。

文章地址

解决spring循环依赖

文章地址

mybatis 一二级缓存

文章地址

使用Mybatis二级缓存的注意事项

在一个命名空间下使用二级缓存
二级缓存对于不同的命名空间namespace的数据是互不干扰的,倘若多个namespace中对一个表进行操作的话,就会导致这不同的namespace中的数据不一致的情况。

在单表上使用二级缓存
在做关联关系查询时,就会发生多表的操作,此时有可能这些表存在于多个namespace中,这就会出现上一条内容出现的问题了。

查询多于修改时使用二级缓存
在查询操作远远多于增删改操作的情况下可以使用二级缓存。因为任何增删改操作都将刷新二级缓存,对二级缓存的频繁刷新将降低系统性能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值