默认类型和包住类型的区别
包装类型默认null,基本类型不为null
包装类型可以作用于泛型,基本类型不行
基本类型在栈中可以直接存储具体数值,而包装类型则存储的是堆中的引用。
HashMap和hashTable的区别
HashMap线程非安全,HashTable线程安全
HashMap集成自AbstractMap,继承自Dictionary
HashMap:null可以作为键(放在hash桶的第0个位置)
HashTable:key和value都不允许出现null值,否则抛出NullPointerException异常
HashMap遍历使用Iterator,HashTable使用Enumeration(枚举遍历)
Spring的特点
开元的,轻量级,低入侵式,松耦合,企业级一站式开发应用框架
核心功能:IOC(控制反转)和AOP(面向切面)
Spring IOC
首先是IOC控制反转,简单来说就是将对象交给Spring IOC容器管理,并且通过DI依赖实现注入
三种注入方式:注解注入,构造方法,setter
死锁,如何避免
多线程需要获取多发占用的资源,彼此却又互不释放资源等待着,形成死循环死锁,若无外力干涉无法自行解开
四个必要条件:互斥,请求与保持,不可剥夺,循环等待
解决方法:破坏三个条件
linux基本操作指令
cd 读取文件
pwd展示路径
ls展示文件中的内容
ll详细展示文件中的内容
vim/vi,编辑文件/不存在创建
more,less,cat 查看文件
mkdir:创建文件夹
rm:删除文件
rmdir删除空目录
mv移动文件/改名
cp拷贝文件
find:查找文件
grep:查找文件中关键字
tail:查看日志
Shiro框架认证授权流程
package com.atguigu;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
public class shiroTest {
SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm();
@Before
public void addUser(){
simpleAccountRealm.addAccount("sayhi", "123456");
}
@Test
public void test01() {
//构建默认安全管理器
DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
//为管理器设置账户域
defaultSecurityManager.setRealm(simpleAccountRealm);
//设置安全管理器(安全管理器)
SecurityUtils.setSecurityManager(defaultSecurityManager);
Subject subject = SecurityUtils.getSubject();//获取主体
//登录
UsernamePasswordToken token = new UsernamePasswordToken("sayhi","123456");
subject.login(token);
//org.apache.shiro.authc.UsernamePasswordToken - sayhi, rememberMe=false
System.out.println(token);
//subject.isAuthenticated()查询是否登录成功 true
System.out.println("isAuthenticated"+subject.isAuthenticated());
//登出
subject.logout();
//false
System.out.println("isAuthenticated"+subject.isAuthenticated());
}
}
用户登录的数据会通过主体subject 来进行校验
主体subject来自于安全工具SecurityUtils
通过和安全工具中的默认安全管理器中的账户域中的数据进行对比登录
Shiro是一个强大且易用的安全框架,执行身份验证,授权,密码和会哈管理。使用方便。
三个核心组件:Subject,SecurityManager和Realms
Subject:即当前操作用户,但是Shiro中,Subject这一概念并不单指人,也可以是第三方进程,后台账户,或其他。它仅仅意味着“当前和软件交互的对象
SecurityManager:他是Shiro框架的核心,点下Facade模式,Shiro通过SecurityManager来管理内部组件实例,并通过它来提供安全管理的各种服务
Realm:Realm充当了Shiro与应用安全数据间的桥梁,或则是连接器。在用户执行认证的时候,你必须指定一个Realm,用于认证和授权,配置多个Realm
如何实现商品分页?
手写SQL语句查询:1.配置XML文件,2.使用@SELECT注解,编写SQL在对应的mapper层接口
使用Mybatis-plus:配置分页拦截器,分页
MySQL索引
组合索引,单利索引,主键索引,全文索引,普通索引,
Redis缓存淘汰,储存时间,如何防止雪崩,穿透,实现缓存数据的一致性?
缓存淘汰:
- 从已设置过期时间的数据集中选取即将过期的数据
- 从已设置过期时间的数据集中选取实用最少的数据
- 从已设置过期时间的数据集中任意的选取数据淘汰
储存时间:redis中的热点数据的有效时间
雪崩:限流,设置互斥锁错开访问,为热点数据的缓存时间为随机值
击穿:加互斥锁,设置热点数据永不过期(比如标签信息等固定信息,其他不推荐使用,占内存)
穿透:布隆过滤器(过滤掉非法请求)
单点登录流程
介绍Quart2定时监控器
在XML文件中配置定时触发器(Trigger)以及定时任务(job),使用调度器(Scheduler),进行定时任务启动
介绍项目哪里用到多线程?
前端:下载文件
后端:服务器之间的异步调用,定时任务需要创建线程池
Bean 的注入方式
注解注入,构造方法注入,setter注入
介绍用到的锁?
乐观锁、悲观锁
乐观锁:我们主要用到是版本号来控制,CAS算法机制来进行实现
悲观锁:主要是synchronized、Lock
synchronized是Java关键字
synchronized作用于static方法上表示锁的是当前类对象
synchronized作用于普通方法表示锁的是实例对象
synchronized作用于代码块表示锁的是括号里面的对象
Lock是接口,必须主动释放锁,否则会一直持有形成死锁,作用域在代码块。并且将释放锁的操作放在finally块中进行,以保证锁一定被被释放,防止死锁的发生。