狂刷面试题吖

集合

hashmap底层
1,结构区别
jdk7中的数据结构主要是:数组+链表,数组和链表的结点的实现类是Entry类
jdk8中能够的数据结构是:数组+链表/红黑数,当链表中的元素个数大于等于8的时候转为红黑树,元素个数小于等于6时,红黑树结构还原成链表,数组和链表的结点的实现类是Node类
2,shash值的区别
jdk7中因为要保持hash函数的散列性,所以进行了多次的异或和位运算
jdk8中因为链表长度超过了8会转为红黑树,所以我们可以稍微减少元素的散列性,从而避免很多异或和位运算操作
3,链表数据插入的区别
jdk7:使用的是头插入法,扩容后与原来的位置相反
jdk8:使用的尾插入法,扩容后位置与原链表相同
4,扩容机制不同
1,jdk7扩容条件:元素个数大于容量(16)*加载因子(0.75)&& 插入的数组位置有元素存在
2,jdk8扩容条件:元素个数大于容量(16)*加载因子(0.75)
linklist和arraylist的区别
1、ArrayList 是通过将底层 Object 数组复制的方式(System.arraycopy方法)来处理数组的增长;
2、当ArrayList 的容量不足时,其扩充容量的方式:先将容量扩充至当前容量的1.5倍,若还不够,则将容量扩充至当前需要的数量。
3、ArrayList 的特点:增加、删除和移动元素的效率低(数组复制过程消耗资源较多),而查找元素和更新元素的效率高。
4、 LinkedList?是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

  • LinkedList?实现?List?接口,能对它进行队列操作。
  • LinkedList?实现?Deque?接口,即能将LinkedList当作双端队列使用。
  • LinkedList?实现了Cloneable接口,即覆盖了函数clone(),能克隆。
  • LinkedList?实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。
  • LinkedList?是非同步的。

线程

创建线程有四种方式
继承 Thread 类;
实现 Runnable 接口;
实现 Callable 接口;
使用 Executors 工具类创建线程池

什么是 Callable 和 runnable的区别?

  • Runnable 接口 run 方法无返回值;Callable 接口 call 方法有返回值,是个泛型,和Future、FutureTask配合可以用来获取异步执行的结果
  • Runnable 接口 run 方法只能抛出运行时异常,且无法捕获处理;Callable 接口 call 方法允许抛出异常,可以获取异常信息

请说出与线程同步以及线程调度相关的方法。
(1) wait():使一个线程处于等待(阻塞)状态,并且释放所持有的对象的锁;

(2)sleep():使一个正在运行的线程处于睡眠状态,是一个静态方法,调用此方法要处理 InterruptedException 异常;

(3)notify():唤醒一个处于等待状态的线程,当然在调用此方法的时候,并不能确切的唤醒某一个等待状态的线程,而是由 JVM 确定唤醒哪个线程,而且与优先级无关;

(4)notityAll():唤醒所有处于等待状态的线程,该方法并不是将对象的锁给所有线程,而是让它们竞争,只有获得锁的线程才能进入就绪状态;

sleep() 和 wait() 有什么区别?
两者都可以暂停线程的执行
类的不同:sleep() 是 Thread线程类的静态方法,wait() 是 Object类的方法。
是否释放锁:sleep() 不释放锁;wait() 释放锁。
用途不同:Wait 通常被用于线程间交互/通信,sleep 通常被用于暂停执行。
用法不同:wait() 方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的 notify() 或者 notifyAll() 方法。
sleep() 方法执行完成后,线程会自动苏醒。或者可以使用wait(long timeout)超时后线程会自动苏醒。

Executors类创建四种常见线程池
(1)newSingleThreadExecutor:创建一个单线程的线程池。
(2)newFixedThreadPool:创建固定大小的线程池。
(3)newCachedThreadPool:创建一个可缓存的线程池
(4)newScheduledThreadPool:创建一个大小无限的线程池。

mybatis

mybatis和mybatis-plus的区别
mybatis的优点:
1,简单易学,没有任何第三方依赖
1,sql语句与代码分离,存放于xml配置文件中
2,用xml标签控制动态sql的拼接
3,查询的结果集与java对象自动映射
4,封装了jdbc
mybatis-plus:
为简化开发、提高效率而生
实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA
MyBatis-Plus的存在解决了我们使用Mybatis时,每当要写一个业务逻辑的时候都要在dao层写一个方法,再对应一个SQL
额外功能:
xml中sql热加载,不用重启tomcat
代码自动生成,包结构自动生成
内置插件,全局方式delete全表
性能分析插件,检测sql执行效率

mybatis的缓存

1)一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该 Session 中的所有 Cache 就将清空,默认打开一级缓存。
2)二级缓存与一级缓存其机制相同,默认也是采用 PerpetualCache,HashMap 存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。默认不打开二级缓存,要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置 ;
3)对于缓存数据更新机制,当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了C/U/D 操作后,默认该作用域下所有 select 中的缓存将被 clear。

动态SQL

Mybatis动态sql是做什么的?都有哪些动态sql?能简述一下动态sql的执行原理不?
Mybatis动态sql可以让我们在Xml映射文件内,以标签的形式编写动态sql,完成逻辑判断和动态拼接sql的功能,Mybatis提供了9种动态sql标签trim|where|set|foreach|if|choose|when|otherwise|bind。

其执行原理为,使用OGNL从sql参数对象中计算表达式的值,根据表达式的值动态拼接sql,以此来完成动态sql的功能。

高级查询

MyBatis实现一对一,一对多有几种方式,怎么操作的?
有联合查询和嵌套查询。联合查询是几个表联合查询,只查询一次,通过在resultMap里面的association,collection节点配置一对一,一对多的类就可以完成

嵌套查询是先查一个表,根据这个表里面的结果的外键id,去再另外一个表里面查询数据,也是通过配置association,collection,但另外一个表的查询通过select节点配置。

Xml映射文件中,除了常见的select|insert|updae|delete标签之外,还有哪些标签?

还有很多其他的标签,、、、、,加上动态sql的9个标签,trim|where|set|foreach|if|choose|when|otherwise|bind等,其中为sql片段标签,通过标签引入sql片段,为不支持自增的主键生成策略标签。

当实体类中的属性名和表中的字段名不一样 ,怎么办

第1种: 通过在查询的SQL语句中定义字段名的别名,让字段名的别名和实体类的属性名一致。
第2种: 通过来映射字段名和实体类属性名的一一对应的关系。

mysql

数据库三大范式是什么

第一范式:每个列都不可以再拆分。
第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。
引擎

MySQL存储引擎MyISAM与InnoDB区别

存储引擎Storage engine:MySQL中的数据、索引以及其他对象是如何存储的,是一套文件系统的实现。

常用的存储引擎有以下:
Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。
MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。
MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。
在这里插入图片描述
InnoDB引擎的4大特性
插入缓冲(insert buffer)
二次写(double write)
自适应哈希索引(ahi)
预读(read ahead)
存储引擎选择
如果没有特别的需求,使用默认的Innodb即可
MyISAM:以读写插入为主的应用程序,比如博客系统、新闻门户网站。
Innodb:更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如OA自动化办公系统。

索引有哪些优缺点?

索引的优点
可以大大加快数据的检索速度,这也是创建索引的最主要的原因。
通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点
时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;
空间方面:索引需要占物理空间。

索引有哪几种类型?

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
全文索引: 是目前搜索引擎使用的一种关键技术。

1、日志aop:

自定义注解:@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
切面类
1、aspect注解+order(1)
2、切入点 @pointcut("@annotation(自定义注解名)")
切入点表达式:bean、within、excution、annotation(细粒度)
3、切入方法 @around
目标方法
自定义注解----自定义注解名

2、spring框架:

两大核心:AOP、IOC
轻量框架
IOC,方便解耦,简化开发
DI,依赖注入
支持声明式事务
方便测试,降低测试成本

3、spring中的设计模式:

代理模式
单例模式:饿汉模式、懒汉模式
工厂模式:亨元模式

4、aop的原理:

静态代理:手动调用目标方法
动态代理:通过反射调用目标方法,cglib:继承目标类 jdk::和目标对象实现共同的接口

5、utf-8和gbk解决乱码:ISO-8859-1(gbk占两个字节)

6、springMvc

在这里插入图片描述

7、Jdbc:

Class.forName("com.mysql.jdbc.Driver");
Connection connection = DriverManager.getConnection("111","2","3");
String sql = "select * from emp";
//获取传输器
PreparedStatement ps = connection.prepareStatement(sql);
ps.setString(1,"lwl");
ps.setString(2,"ll");
ResultSet rs = ps.executeQuery();
if (rs.next()){
    String name = rs.getString("name");
}
rs.close();
ps.close();
connection.close();

8、Aop

AOP是spring框架的核心之一。

在不影响原来功能的情况下,横向扩展程序的功能。

1、自定义注解

//aop
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Cache{
    String key();
}

2、创建切面类

  //切入点
    @Pointcut("@annotation(com.lwl.lwtest.collection.Cache)")
    public void pointCut(){

    }
 
    @Around("pointCut()")
    public void wlAop(ProceedingJoinPoint joinPoint){
    }

3、·在目标方法上加自定义注解

  @Cache(key="lwlaop")

9、通知方法

@around
@before
@after
@afterReturning
@afterThrowing

10、Redis持久化方式

RDB:快照模式:方式、安全、效率

AOF:日志追加模式

11、redis内存优化策略:

LRU最近最少、
LFU最不经常算法、
random算法

11、Shiro框架

它将软件系统的安全认证相关的功能抽取出来,
实现用户身份认证,权限授权、加密、会话管理等功能。组成了一个通用的安全认证框架。
1、subject:应用代码直接交互的对象
2、secrutyManager: Shiro 的核心,它负责与其他组件进行交互,
3、realm: 获取安全数据(如用户、角色、权限),类似MVC的前端控制器

12、Mybatis和mybatis-plus的区别

Mybatis:所有SQL语句全部自己写吗,mybatis-plus:通用的CRUD操作
MP是一个Mybatis的增强工具,它在Mybatis的基础上做了增强,
既可以特有功能,又能够正常使用Mybatis的原生功能
MP的代码生成器,避免许多重复性的工作

13、Tomcat 8.5

14、数据库冷备份、热备份

冷备份:数据库关闭状态
快速的备份方法(只需拷文件)
恢复到某个时间点
热备份:数据库开启状态
不能出错,否则后果严重

15、二分算法、冒泡排序、选择排序

1、冒泡排序:每轮遍历选一个最大的放到后面。
2、选择排序:与冒泡排序相比,遍历次数少一些。
3、 二分查找:优点:比较次数少,占用系统内存少。
缺点:要求有序表,插入删除困难。不经常变动,不频繁查找的有序数列。

16、内存泄露

17、Jvm调优
18、New在堆里,从栈里调
19、Dubbo底层
20、设计模式
21、数据库优化
22、中软、软通
23、GC调优
24、jvm调优
25、Hashmap的数据结构
26、Sso
27、Jquery
28、Mybztis
29、线程

30、关联查询

1、内连接
2、外连接(左外连接、右外连接)
3、自连接
4、union连接(两个结果放在一起)

静态变量 实例变量

1、语法定义:静态变量由static修饰
2、运行、实例区别:静态变量属于类,类加载就会分配空间。
实例变量是某个对象的属性,只有实例化对象后,才会被分配空间
3、修改改变:静态变量是所有对象共有,被其中一个对象修改,其他对象得到的就是修改后的值
实例变量属于对象私有,被一个改,其他的不会改。

Stringbuild Stringbuffer
wait sleep
mybatts
mvc springboot
cookie session
集合

redis
mysql
SSM
springboot
oop
aop
http tcp-ip
socket
rpc

设计模式

单例模式
懒汉模式:实例的延迟加载方案
饿汉模式:实例的创建随类加载
工厂模式
亨元模式:将共享对象存入容器内,实现数据的共享,通过底层逻辑判断实现了单例模式的创建

数据库、ngnix优化

数据库优化:
	sql语句+索引
	
	主从搭建:数据库的高可用

jvm调优

事务底层
事务是数据库操作的最小工作单元。
原子性(Atomicity):原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性(Consistency):事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性(Isolation):一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务 是隔离的,并发执行的各个事务之间不能互相干扰。
持久性(Durability):指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

联表查询

dubbo怎么使用的

如何前台和后台交互的,dubbo
开发的项目:

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值