Java知识点

Java常用知识点

Java知识点
@controller和@restcontroller有什么区别

@RestController注解相当于 @ResponseBody + @Controller合在一起的作用

1) 如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

2) 如果需要返回到指定页面,则需要用 @Controller配合视图解析器InternalResourceViewResolver才行。    如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

hashmap和hashtable的区别

1.HashMap 的实例有两个参数影响其性能:初始容量 和加载因子。容量是哈希表中桶的数量,初始容量只是哈希表在创建时的容量。加载因子 是哈希表在其容量自动增加之前可以达到多满的一种尺度。

2.hashtable,类实现一个哈希表,该哈希表将键映射到相应的值。任何非 null 对象都可以用作键或值。为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

对外提供的接口不同

Hashtable比HashMap多提供了elments() 和contains() 两个方法。

arraylist和linkedlist的区别

1、数据结构不同

ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。

2、效率不同

当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。

当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。

3、自由性不同

ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。

4、主要控件开销不同

ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储节点信息以及节点指针。

autowired注解是干啥的

让spring完成bean自动装配的工作,Autowired默认是按照类去匹配,配合@Qualifier指定按照名称去装配bean,成员属性字段使用@Autowired无需字段的set方法。

@Autowired不是用于类的注解,而是用在:构造函数 setter方法 任意方法 字段。。总之各个地方都可以。

bean是否是线程安全的
union和union all的区别

union会删除重复记录,所有返回的行都是唯一的,并且采用默认排序;union all 不会删除重复记录,并且不重新排序

where和having的区别

where是一个约束声明,having是一个过滤声明

having 先分组后计算,where反之

having后面可以跟聚合函数

where不能使用聚合函数,having中可以使用聚合函数。where子句在聚合前先筛选记录,也就是说作用在group by子句和having子句前,而having子句在聚合后对组记录进行筛选。

左右链接的区别

建议使用左连接

left join (左连接):返回包括左表中的所有记录和右表中连接字段相等的记录,右表不足的地方显示NULL。

right join (右连接):返回包括右表中的所有记录和左表中连接字段相等的记录,左表不足的地方显示NULL。

inner join (等值连接或者叫内连接):只返回两个表中连接字段相等的行。

项目部署的流程
linux的常用命令 五个左右

linux常用命令

cd:切换目录
df:查看磁盘空间使用情况、剩余空间
rm:删除文件或目录
vim: 文本编辑
cat: 查看文件、合并文件
mv:移动文件、重命名
cp: 复制文件、目录
top:查看系统正在运行进程的相关信息
free: 查看系统内存使用情况

ioc是什么

ioc含义

IOC就是控制反转,是指程序将创建对象的控制权转交给Spring框架进行管理,由Spring通过java的反射机制根据配置文件在运行时动态的创建实例,并管理各个实例之间的依赖关系。

对象与对象之间松散耦合,有利于功能的扩展和复用。

DI就是依赖注入,和控制反转是同一个概念的不同角度的描述,它是指程序在运行时由IoC容器来动态注入对象需要的外部依赖。

Spring的IOC有两种注入方式 :xml注入、注解注入。

xml注入bean的几种方式:

  • set()方法注入;
  • 构造器注入:①通过index设置参数的位置;②通过type设置参数类型;
  • 静态工厂注入;
  • 实例工厂;
aop的应用场景有哪些

aop应用场景

场景一: 记录日志
场景二: 监控方法运行时间 (监控性能)
场景三: 权限控制
场景四: 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 )
场景五: 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )

说明:

jdk动态代理是接口的重写(适用于实现接口的类,spring aop的默认实现)

cglib动态代理是类的继承

提示:aop本质是动态对方法增强,避免代码入侵,优雅的实现横向扩展,是对oop的补充

索引用多了有啥坏处
#和$的区别

#是一个占位符,$是拼接符。

#的方式引用参数,mybatis会先对sql语句进行预编译,然后再引用值,能够有效防止sql注入,提高安全性。$的方式引用参数,sql语句不进行预编译。

什么是GC
说一下java基本数据类型

Java的基本数据类型有8种,分别是:byte(位)、short(短整数)、int(整数)、long(长整数)、float(单精度)、double(双精度)、char(字符)和boolean(布尔值)。

rabbitmq的特点?
消息队列的优缺点

消息队列优缺点

优点:解耦,异步,削峰

缺点:

分析:一个使用了MQ的项目,如果连这个问题都没有考虑过,就把MQ引进去了,那就给自己的项目带来了风险。我们引入一个技术,要对这个技术的弊端有充分的认识,才能做好预防。要记住,不要给公司挖坑!

回答:回答也很容易,从以下两个个角度来答

  • 系统可用性降低:你想啊,本来其他系统只要运行好好的,那你的系统就是正常的。现在你非要加个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性降低
  • 系统复杂性增加:要多考虑很多方面的问题,比如一致性问题、如何保证消息不被重复消费,如何保证保证消息可靠传输。因此,需要考虑的东西更多,系统复杂性增大。
springMVC的执行过程能说下吗?

参考:https://blog.csdn.net/faramita_of_mine/article/details/123909578

执行过程

面试:
1、用户向服务器发送请求,请求被Spring 前端控制Servelt DispatcherServlet捕获(捕获);
2、DispatcherServlet对请求URL进行解析,得到请求资源标识符(URI)。然后根据该URI,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain对象的形式返回;(查找handler);
3、 DispatcherServlet 根据获得的Handler,选择一个合适的HandlerAdapter。 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller), Handler执行完成后,向DispatcherServlet 返回一个ModelAndView对象(执行handler);
4、DispatcherServlet 根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver) (选择ViewResolver);
5、通过ViewResolver 结合Model和View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回);

快速记忆技巧:
核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回;

dubbo和cloud有什么区别
对于有八百万的数据的表,怎么写sql执行更快

参考:https://blog.csdn.net/yi_zongjishi/article/details/124648857

如何解决POST请求中文乱码问题,GET的又如何处理呢
怎么样把ModelMap里面的数据放入Session里面

参考:springMVC面试题

可以在类上面加上@SessionAttributes注解,里面包含的字符串就是要放入session里面的key

SpingMvc中的控制器的注解一般用哪个?有没有别的注解可以替代

一般用@Controller注解,也可以使用@RestController,@RestController注解相当于@ResponseBody + @Controller,表示是表现层,除此之外,一般不用别的注解代替。

mybatis-plus有了解过吗,在什么场景下使用它

mp阐释

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

threadlocal的使用原理(简单说明即可)
创建线程的几种方式
concurrenthashmap和hashmap有什么区别

(1)HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。
(2)ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。
(3)ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。

堆 栈 池的区别
堆和栈的区别有哪些-常见问题-PHP中文网
堆和栈的区别有:1、空间分配区别;2、缓存方式区别;3、数据结构区别。堆空间一般由程序员分配释放,栈空间由操作系统(编译器)自动分配释放。栈使用一级缓存,堆使用二级缓存。
为什么使用异常
InnoDB与MyISAM的区别

1、innodb支持事务,而myisam不支持事务。
2、innodb支持外键,而myisam不支持外键。
3、innodb是行锁,而myisam是表锁(每次更新增加删除都会锁住表)。
4、innodb和myisam的索引都是基于b+树,但他们具体实现不一样,innodb的b+树的叶子节点是存放数据的,myisam的b+树的叶子节点是存放指针的。
5、innodb是聚簇索引,必须要有主键,一定会基于主键查询,但是辅助索引就会查询两次,myisam是非聚簇索引,索引和数据是分离的,索引里保存的是数据地址的指针,主键索引和辅助索引是分开的。
6、innodb不存储表的行数,所以select count( * )的时候会全表查询,而myisam会存放表的行数,select count(*)的时候会查的很快。

总结:mysql默认使用innodb,如果要用事务和外键就使用innodb,如果这张表只用来查询,可以用myisam。如果更新删除增加频繁就使用innodb。

jvm 调优, 常用gc 收集器,常用gc算法(这三种常问)
强弱引用什么的

https://baijiahao.baidu.com/s?id=1670639651930088224&wfr=spider&for=pc

spring的AOP
Spring AOP的三种实现方式_清风何渡的博客-CSDN博客_springaop的实现方式
目录一、什么是AOP二、Spring AOP的三种实现方式1.通过Spring API实现AOP(1)编写业务接口和实现类(2)编写增强类,并实现Spring API相关接口的方法(3)在resource目录下新建applicationContext文件,实现java类的创建和aop的织入(4)编写测试类2.通过自定义类来实现(推荐)(1)自定义切入类(2)去spring中配置(3)编写测试类3.使用注解实现(1)自定义增强类(注解实现)(2)..
spring的生命周期
Spring生命周期
1. @Bean初始化和销毁 1.1 bean的生命周期: bean创建-----初始化-----销毁的过程 1.2 容器管理bean的生命周期: 我们可以自定义初...
spring的事物实现原理
mysql的优化
mysql为什么使用b+树
mysql为什么要使用B+树作为索引_IT盛夏的果实的博客-CSDN博客_mysql为什么使用b+树
1 概述大家可能在面试的时候都会被问到这样一个问题:mysql的索引结构是什么?这个时候了解的都知道是B+树,那么为什么会采用B+树作为它的索引结构呢?由图可以知道:索引的存在时为了加快数据访问提高查询效率的,而数据存储在磁盘中,但从磁盘读取数据会产生大量的IO操作,读取效率是非常低的。所以在读取的时候要减少io量和减少io次数来提高读取效率。...
Mysql中Innodb的索引结构采取B+树?_抹香鲸之海的博客-CSDN博客_innodb索引结构使用b+树
通常我们采用Innodb做Mysql的存储引擎.B树和B+树是MySQL索引使用的数据结构,对于索引优化和原理理解都非常重要。先回忆一下一个经典面试题,B树和B+树的区别:B树:B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树(B树是一颗多路平衡查找树)它类似普通的平衡二叉树。B树的两个特点树内的每个节点都存储数据叶子节点之间无指针相邻B+树注意一下B+树的两个明显特点数据只出现在叶子节点所有叶子节点增加了一个链指针针对上面的B+树和B树的特点,我们做一
为什么 MySQL 默认的存储引擎 InnoDB 会使用 B+ 树来存储数据?_LuiBu的博客-CSDN博客
关于这个问题很多人都有自己的理解,但都回答得不够完整,也有人只是讲了B+树和B树的区别,并没有真正回答MySQL为什么选择B+树这个问题。想要知道答案,我们接下来会深入分析各种场景下不同数据结构的优缺点。
redis的一些使用场景
Redis 16 个常见使用场景_Young丶的博客-CSDN博客_redis使用场景举例
1. 缓存作为Key-Value形态的内存数据库,Redis 最先会被想到的应用场景便是作为数据缓存。而使用 Redis 缓存数据非常简单,只需要通过string类型将序列化后的对象存起来即可,不过也有一些需要注意的地方:必须保证不同对象的 key 不会重复,并且使 key 尽量短,一般使用类名(表名)加主键拼接而成。选择一个优秀的序列化方式也很重要,目的是提高序列化的效率和减少内存占用。缓存内容与数据库的一致性,这里一般有两种做法:只在数据库查询后将对象放入缓存,如果对象发生了修改
常用的设计模式

额外

robbin负债均衡算法有哪些 原理是啥

zk和redis区别 zk里面的节点

还有一个线程池延时队列原理

【敖丙】今天帮公司面试了个要25K的Java程序员,看看我都问他些什么问题_哔哩哔哩_bilibili
别问,问就是胖了,没刮胡子,长痘痘了哈哈,播放能上5000就录制下一个。
spring Bean的注入过程

set注入、构造器注入、实例工厂注入

java8的新特性
stream流操作对比foreach和基本的for循环
Synchronized和Lock锁底层实现原理

sync是JVM层面,Lock是jdk层面

CAS简单介绍下

比较并交换  compare and set

线程池说一下

三大方法 七大参数 四种拒绝策略 线程数设置 工作原理

拒绝策略jdk

  • 直接丢弃
  • 抛异常
  • 由调用者在调用者线程执行
  • 丢弃阻塞队列里面等待时间最长的线程
JVM调优步骤
线上cpu100%,应该怎么排查
mysql怎么优化查询

explain执行计划,查看各方面数据,是否用索引

mysql 索引有几种类型

索引类型

hash和b+树

1.普通索引
最基本的索引,它没有任何限制,用于加速查询。

2.唯一索引
索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。

3.主键索引
一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。一般是在建表的时候同时创建主键索引。

4.组合索引
指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀集合。

5.全文索引
主要用来查找文本中的关键字,而不是直接与索引中的值相比较。

myisam和innodb区别

my是非聚簇索引,索引直接指向数据项。innodb是追溯索引,索引指向主键索引

innodb支持redo log日志,支持事务,支持行锁。myisam只支持表锁

(最多可以建16个索引)

redis和memcache选型对比

redis支持的数据类型丰富,5种类型3中特殊类型。memcache只有一种string

redis为什么这么快

执行单线程、非阻塞IO(NIO)多路复用,严格意义不算单线程

处理网络请求过程是单线程,其他模块是多线程

redis集群

三种架构:主从、哨兵、集群

主备同步,启动数据初始化,rewrite等等
redis持久化

rdb快照,每隔一段时间把内存快照写入硬盘

aof,每行命令写入文件

应急情况先用rdb恢复

缓存穿透和缓存击穿有没有了解

穿透:查询时缓存没有命中缓存层,直接打到数据库

击穿:一直访问热点key,突然失效,瞬间的压力击垮数据库

spring优点是什么

ioc,aop,控制反转,依赖注入,

了解哪些设计模式,除了单例和工厂
如何保证幂等
分布式锁怎么实现

主要是控制平时线程的一个共享资源的修改,使用redis setnx或者redission