string中的常用方法:字符串转换为int(Integer.parseInt(a))
compareTo()比较两字符串的字典顺序(>为1,<为-1,等于为0)
concat()拼接两个字符串
contains()当包含指定的值时返回true
equalsIgnoreCase()判断两个字符串是否相等,不区分大小写
indexOf()返回字符在字符串中第一次出现的索引,以及从指定位置开始找,没有返回-1
lastIndexOf()返回最后一次出现的索引
length()返回字符串长度
replace()把字符串指定的字符替换成为某某
split()根据给定的正则表达式拆分字符串,返回一个字符数组
substring()从某个下标开始到某个下标结束,截取字符串,得到新字符串,或者从某个位置开始,到最后结束
trim()去左右空格
valueOf()将任意类型的值转换为字符串
string buffer 效率高安全性低和stringbuilder 安全性高 效率低 存值是存入堆中空间,一个是value(是数组)和count(数组中的个数)
instanceof 运算符只能用作对象,判断对象是否属于此类 接口是interface
iterator 迭代器
jre和jdk的区别
怎么上传文件
shiro 安全框架 AuthorizationInfo:授权信息 AuthenticationInfo:认证信息
session和cookie的区别
http和https的区别
vue中怎么实现跨组件传值使用vuex
vuex的核心概念:store、state、getters、mutations、actions
堆和栈 对象创建是放在推还是栈
算法的理解和使用场景
你碰到的异常 throws(声明) throw(抛出) try(捕获)
多态:多种形态,同一个引用,根据对象不同,展现的效果不同(里式替换原则)
stringbuffer 线程安全(当变量是一个共享变量的时候,而且是多线程的环境要保证数据的一致性)和stringbuilder线程不安全(优限考虑)
jsp <%=new Date() %> 表达式 <%! %>声明 <% %>小脚本
list(ArrayList+vector+LinkList) ArrayList+vector基于数组 LinkList基于链表 用equals去重
set (hashset (哈希表)+treeset(二叉树)) 去重是根据先比较hashcode值如果相等在用equals 如果都相等就是重复的
set无序是指跟存入的顺序不同,它会自己根据内部哈希码排序(HashSer+TreeSet)用 hashCode
map(hashMap 不安全,效率高 +hashtable 安全,效率低+treeMap 有序 每一个键值做为红黑树的节点,升序排序)
红黑树是一个更高效的检索二叉树 每个节点只能是红色或者黑色,根节点永远是黑色的
map遍历,forec 1.拿到所以的键set 2.拿到所有的值conllection,拿到键值Enry
(动态数组,双向链表,哈希表(数组加链表),二叉树(左是小于根的值,右边是大于根的值))
三个集合的参数
集合排序用到了什么样子的算法
jvm内存分配机制
jvm是怎么加载类的
new 的对象怎么开辟空间的怎么存的
git 的版本回退 git reset --hard id
nginx的策略模式
qps如何预估
支付接口幂等性解决方案
redis库存数量怎么保证原子性
反射
反射的概念
java的反射机制是指在程序的运行状态中,可以构造任意一个类的对象
可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法
可以调用任意一个对象的属性和方法。
获取对象
Class.forName(完整类名)
类名.class
对象.getClass()
线程池的工作原理
1.主线程通过线程池创建核心线程如果核心线程数满了,会放入任务队列中。
2.如果任务队列也满了的话,然后会去看最大的连接线程数满了没。
3.如果最大线程数也满了,然后就会进入饱和策略进行任务拒绝。
线程创建方式,线程池
通过继承Thread类创建线程类
劣势:因为线程类已经继承了Thread类,所以不能再继承其他父类。
通过实现Runnable接口创建线程类
通过实现Callable接口创建线程
优势:线程类只是实现了Runnable接口与Callable接口,还可以继承其他类。
劣势:编程稍稍复杂,如果需要访问当前线程,则必须使用Thread.currentThread()方法。
线程池参数有哪些
线程池的创建方式
newSingleThreadExecutor():它的特点在于工作线程数目被限制为 1,操作一个无界的工作队列,所以它保证了所有任务的都是被顺序执行,最多会有一个任务处于活动状态,并且不允许使用者改动线程池实例,因此可以避免其改变线程数目;
newCachedThreadPool():它是一种用来处理大量短时间工作任务的线程池,具有几个鲜明特点:它会试图缓存线程并重用,当无缓存线程可用时,就会创建新的工作线程;如果线程闲置的时间超过 60 秒,则被终止并移出缓存;长时间闲置时,这种线程池,不会消耗什么资源。其内部使用 SynchronousQueue 作为工作队列;
newFixedThreadPool(int nThreads):重用指定数目(nThreads)的线程,其背后使用的是无界的工作队列,任何时候最多有 nThreads 个工作线程是活动的。这意味着,如果任务数量超过了活动队列数目,将在工作队列中等待空闲线程出现;如果有工作线程退出,将会有新的工作线程被创建,以补足指定的数目 nThreads;
newSingleThreadScheduledExecutor():创建单线程池,返回 ScheduledExecutorService,可以进行定时或周期性的工作调度;
newScheduledThreadPool(int corePoolSize):和newSingleThreadScheduledExecutor()类似,创建的是个 ScheduledExecutorService,可以进行定时或周期性的工作调度,区别在于单一工作线程还是多个工作线程;
newWorkStealingPool(int parallelism):这是一个经常被人忽略的线程池,Java 8 才加入这个创建方法,其内部会构建ForkJoinPool,利用Work-Stealing算法,并行地处理任务,不保证处理顺序;
ThreadPoolExecutor():是最原始的线程池创建,上面1-3创建方式都是对ThreadPoolExecutor的封装。
2.thread的基本方法(了解一下,面试问的多)里面的方法
yield()方法是让当前抢到cpu的线程退出cup从新进行等待队列
join()方法超级VIP,直接抢占资源
interrupt()方法中断sleep线程
m.suspend()将线程挂起,不用了,因为容易造成死锁的状态
m.resume();将线程恢复执行
只能在方法同步中使用的方法
wait()等待
notify()唤醒,notifyAll()唤醒全部
redis中的持久化机制
redis中的缓存击穿穿透雪崩
redis 数据的类型以及使用场景
rpc的使用原理。
mysql的锁
行级锁
开销大,加锁慢,会出现死锁。发生锁冲突的概率最低,并发度也最高。
表级锁
开销小,加锁快,不会出现死锁。发生锁冲突的概率最高,并发度也最低。
页级锁
开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。
共享锁
排他锁
意向锁
mysql的持久化机制
redo log(差不多,但redo log会记录操作,当事务提交时会调用fsync接口对redo log 进行刷盘,可以在这个里面读取)
buffer Pool(读数据时去磁盘缓存会先到buffer pool读取,先写入到这里面)
sql的执行计划 explain
为了帮助开发人员根据数据表中现有索引情况,了解自己编写的SQL的执行过程、优化SQL结构,MySQL提供了一套分析功能叫做SQL执行计划(explain)。
mysql中where和having的区别 where 是条件 having 是分组后的筛选 只能放group by / where 后面
求姓氏 用 left(name,1) 函数 union 多行插入
mysql (limit 起始行, 取多少行 )和orcale 分页的方法
sql的优化
mysql索引的使用场景和注意事项
索引的设计原则
1.更新频繁的字段不适合建立索引
2.适合索引的列是出现在where子句中的列或者连接子句中指定的列
3.基数比较小的表索引效果较差。
4.使用短索引,如果对长字符串列进行索引,应该指定一个前缀的长度,减少索引空间(如果超过前缀长度,则使用索引排除不匹配的行)
5.不要过度使用索引,索引需要额外的空间,并降低写操作的性能。
6.对哪些查询中很少涉及的列,重复值比较多的列不要建立索引。
7.定义外键的数据列一定要建立索引。
mysql几种索引的建立场景
海量的数据,你会怎么建索引
mysql引擎
1.myisam
不支持事务,但是每次查询都是原子的
支持表级锁,即每次操作是对整个表加锁
有三个文件:索引文件,表结构文件,数据文件
2.innoDB
支持ACID的事务,支持事务的四种隔离级别
支持行级锁及外键约束:因此可以支持写并发
mysql存储过程 create procedure
mysql的正则表达式
三月份建了一张a表海量的数据,然后四月份增加了一个字段tet,查出五月份tet不为1或者2的
select * from a where tet!=1 or tet!=2 and data=5
mysql的日志有哪几种
utc时间 格林时间
谈谈你对mysql的优化
mysql常用的函数
now 获取当前日期和时间
length 获取字符串长度
round 四舍五入
substring 从具有特定长度的位置开始的最 一个子字符串
union
group by 分组查 男女各多少人
select sex,COUNT(*) from 表 group by sex;
hibernate 事务用session开启事务管理
hibernate /mybatis (加载策略 get -->持久状态 new --> 临时状态 -- save --> 持久状态 --close-->游离状态 --update--> 持久状态 --delete-->临时状态 )
springboot,springmvc在项目中常用的注解
有父类子类,静态变量,静态代码块,构造函数,成员变量,他们的一个执行顺序是什么样的
nacos怎么检测服务的
过滤器拦截器aop的使用场景
springboot 搭建项目的一个优势
spring boot启动的一个过程
spring boot 初始化环境变量,初始化容器的上下文,初始化配置属性 他们的一个顺序是什么样的
spring boot是如何读取配置文件的 如果在不同路径同一文件会以哪个为准
springmvc和MVC三层架构的区别
resultMap和resultType的区别 resultMap赋值实体类中必须有构造函数
autowired和resource注解的区别
@coertlloer和@restcoertller的区别
怎么接收前端传过来的参数
springcloud的五大组件
服务的熔断和降级。
mybatis的一二级缓存。
mybatis #{}和${}
mybatis常用的标签
if trim(prefix 拼接前缀 suffix 拼接后缀) foreach (open 什么开始 close 什么结束)
mpper中方法可以重载嘛
mpper的一个工作原理
docker的常用命令。
spring是什么
javabean生命周期
spring boot 注入的东西你怎么在普通的类调用他 (普通类调用自动注入的类)
spring事务处理机制
1.编程式事务管理 (private TransctionTemplate)
编程式事务使用TransctionTemplate
2.声明式事务管理(@Transction)
spring在aop基础的事务实现机制,最优点不需要在业务代码中添加事务管理的代码
只需要在配置文件做相关的事务规则声明就可以了,但是声明式事务只能针对方法级别,无法控制代码级别的事务管理。
spring 事务的传播级别 propagation
1.PROPAGAION_RFQUIRED:默认传播行为,如果当前没有事务就创建一个新事务,如果当前存在事务,就加入到事务中。
2.PROPAGAION_SUPPORTS:如果当前存在事务,就加入到该事务,如果当前不存在事务就以非事务方式运行。
3.PROPAGAION_MANDATORY:如果当前存在事务,就加入该事务,如果当前不存在事务就抛出异常。
4.PROPAGAION_REQUIRES_NEW:无论当前存不存在事务都创建新的事务进行执行。
5.PROPAGAION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,就讲当前事务挂起。
6.PROPAGAION_NEVER:以非事务方式运行,如果当前存在事务,就抛出异常。
7.PROPAGAION_NESTED:如果当前存在事务,则在嵌套事务内执行,如果当前没有事务则按REQUEIRED属性执行
spring中事务的隔离级别
1.ISOLATION_DEFAULT:使用数据库默认的事务隔离级别
2.ISOLATION_READ_UNCOMMTTED:读未提交,容许事务在执行过程中读取其他事务未提交的数据。
3.ISOLATION_READ_COMMITTED:读已提交,容许事务在执行过程中读取提前事务已提交的数据。
4.ISOLATION_REPEATABLE_READ:可重复读,在同一个事务内任意时间的查询结果是一致的.
5.ISOLATION_SERALIZABLE:所有事务依次执行。
spring boot事务
springMVC的工作流程
什么是微服务
单例模式怎么实现的
就我想实现对象创建是内存地址都是同一个
在那个内中先定义一个静态的本类的属性 static Pig p;
再定义一个私有化本类的构造函数 private Pig() {};
在提供一个公开的静态的方法来创建对象,并且把对象返回 p=new Pig()
就可以实现都是同一个
服务调用失败时得处理手段 熔断
eureka和zookper的区别
c 一致性 zk 他是一个主(写请求)从(读请求)节点,就是当你服务倒了,他会选举,的一个期间是没有反应的
a 高可用 eK 当他发现一个服务调用不了了,他会自动的切换其他服务,只要有一台服务,他都能保证注册服务的可用,但不一定查询到最新的信息
p 分区容错 有多个节点如果网络中断了,要保证这个服务还是可以用的 就是当p这个出现时 c 和 a 不能兼得
dubbon类似于sprngCloud
秒杀的一个流程
流程A:点击秒杀按钮后将订单消息直接推送到订单消息队列,然后通过订单队列的监听器进行业务处理,
将订单信息保存到数据库中生成订单记录
流程B:下单成功后,将订单信息发送到死信队列,死信队列中的消息会在十五分钟后进入到支付队列,
最后通过支付队列的监听器进行业务处理,根据订单ID判断是否支付成功:
1)若支付成功,则更新订单的状态为已支付(???);
2)若未支付成功,则更新订单状态为已取消,并回滚库存+1
@EnableDiscpveryClient (地利啵嘚spv快得) 容许别人发现他
@configuration (瑞省) 把这个类作为spring的配置类
@componentscan (康抛恋次堪) 组件扫描
@springBootAppliscation springboot的启动注解
@EnableFeignClients (地利啵飞看s) 微服务之间的调用
@Transactional (穿塞克醒搂) 放在service接口层 设置一个读的操作(就比如是修改前读还是后)修改之后读 声明事务
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") 前端到后端的时间转换
@Repository (瑞破z追) 放在mpper层
@EnableTransactionManagement (E能播 穿塞克醒 麦了机猛t) 开启事务
@component 注解的类变成了spring上下文的一个零件 spring启动他就启动
@Aspect (啊死摆可t) aop注解面向切面 只要aop起作用了 这个类就会起作用
@Pointcut (坡台特) 切入点
@RequestMapping标注的方法前执行,如果有返回值,则自动将该返回值加入到ModelMap中
@ModelAttribute 只要这个类运行了这个方法就会运行
@Around (袄润得) 什么时候触发 放正则
@restcontroller 返回值都为json对象 controller+responsebody
@NoArgsConstructor 提供无参构造函数
@AllArgsConstructor 提供有参构造函数
@Data 提供 get set方法
@ToString 提供tostring方法
@Controller 在展现层使用,控制器的声明
@Service 在业务逻辑层使用(service层)
@Repository(弱破瑞追)在数据访问层使用(dao层)
@RabbitListener(queues="deadQueue" ) (勒省蕾) //监听指定队列
@RabbitHandler //交给这个方法来操作
@Bean 把返回值放入spring上下文中
@requertMapping 设置访问这个方法的请求地址
@FeignClient (快得)声明你要调谁
@PathVariable (怕丝歪瑞博) 支持/传参
@RefreshScope (瑞f死扣得) //自动刷新 nacos的配置中心内容改变时 自动读取刷新
@MapperScan(value = "com.zking.proivder.mapper") (死盖) 扫描mapper
@RequestParam("name") (拍润) 一到n个参数
@RequestBody 传参时使用 对象
@ResponseBody 返回json对象
@NotBlank //非空
@Valid 当不符合要求时就会在方法中返回message 的错误提示信息。
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
@DateTimeFormat(pattern = "yyyy-MM dd HH:mm:ss")
自定义注解
@Retention:(瑞疼机)定义注解的保留策略
@Retention(RetentionPolicy.SOURCE) //注解仅存在于源码中,在class字节码文件中不包含
@Retention(RetentionPolicy.CLASS) //默认的保留策略,注解会在class字节码文件中存在,但运行时无法获得,
@Retention(RetentionPolicy.RUNTIME) //注解会在class字节码文件中存在,在运行时可以通过反射获取到
@Target:指定被修饰的Annotation可以放置的位置(被修饰的目标)
@Target(ElementType.TYPE) //接口、类
@Target(ElementType.FIELD) //属性
@Target(ElementType.METHOD) //方法
@Target(ElementType.PARAMETER) //方法参数
@Target(ElementType.CONSTRUCTOR) //构造函数
@Target(ElementType.LOCAL_VARIABLE) //局部变量
@Target(ElementType.ANNOTATION_TYPE) //注解
@Target(ElementType.PACKAGE) //包
@Inherited:(int太瑞铁得)指定被修饰的Annotation将具有继承性
@Before 类似于 @RequestMapping@RestControllerAdvice (袄得坏死) 全局异常
@Autowired @Resource:将自动在代码上下文找与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
@Autowired和@Resource两个注解的区别:
1)@Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
2)@Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。
@CrossOrigin (夸死喔g)容许跨域
先分流再限流 (用的是令牌桶算法)
熔断
nacos配置中心在需要使用配置中心才导入依赖
导入getway依赖,具有路由转发请求过滤(权限校验限流监控) 默认的不用写端口要写方法名
网关自定义路由,类似于对暗号秒杀
实现 InitializingBean 初始化bean 实现方法预加载swagger api接口文档的生成
@Api:用在类上,说明该类的作用。
@ApiOperation:注解来给API增加方法说明。
@ApiImplicitParams : 用在方法上包含一组参数说明。
@ApiImplicitParam:用来注解来给方法入参增加说明。
@ApiResponses:用于表示一组响应
@ApiResponse:用在@ApiResponses中,一般用于表达一个错误的响应信息
@ApiModel:描述一个Model的信息(一般用在请求参数无法使用@ApiImplicitParam注解进行描述的时候)
@ApiModelProperty:描述一个model的属性