1.arrayList 和 LinkList有什么区别?
arrayList底层是基于数组结构的,因为数组有下标,所以查询块,但是数组涉及到扩容以及缩容所以增删比较慢。
LinkList底层是基于链表的,增删数据只需要断两个数据之间的节点就可以了所以增删比较快
2.hashSet可以重复吗?为什么?hashMap可以重复吗?
hashset不可以重复 因为底层数据结构是哈希表 是无序并且是唯一的(由链表保证元素有序,由哈希表保证数据唯一)
hashMap中的key 不可以重复,但是value可以重复
3.jdk1.8有什么特性?
3.1 Lambda表达式
3.2 函数式接口
3.3 default关键字
3.4 方法与构造函数引用
3.5 map实现 加入红黑树
4.springboot 和spring区别
首先spring 是一个一IOC 和 AOP 为核心的第三方开源框架 所有的配置都需要自己手动配置到XML文件中。开发过程相对繁琐、而springboot 基于spring 框架 ,以快速开发为理念开发的一种脚手架,spring boot 简化了spring 的配置,无序手动配置。
5.什么是Spring框架?
spring是一款轻量级开源框架,以 IoC(Inverse Of Control:反转控制)和 AOP(Aspect Oriented Programming:面向切面编程)为内核。还能整合开源世界众多著名的第三方框架和类库。
6.spring 的bean 是单例还是多例?
单例的 ,多例存在线程安全问题
7.spring 的两大核心是什么?
IOC (控制反转) 和 AOP (面向切面编程)
8.项目中什么场景下使用AOP?
需要增加额外功能时使用AOP 。或者日志记录,性能统计,安全控制,事务处理,异常处理
9.springboot常用注解
@Controller @Component @RequestBody @Pathvariable
@RequestMapping @RequestController @configuration @Controlleradvice
@exceptionHandler
10.简单介绍一下springboot
Spring boot是一个脚手架(而非框架),构建于Spring框架(Framework)基础之上,基于快速构建理念,提供了自动配置功能,可实现其开箱即用特性
11.springboot项目启动原理
SpringBoot 项目在启动时,首先基于启动入口类上的注解描述,进行自动配置并扫描启动类所在包以及子包中的类进行加载,然后检测类上是否有Spring框架中指定的注解描述(例如@Component,@Controller,@Service等)。假如有,则将类交给Spring框架中的BeanFactory工厂接口的实现类对象,此工厂对象会基于反射创建Bean的实例。
12.springboot核心配置文件有哪些,以及编码格式?
properties 文件 -ISO8859-1 , yml 文件 -UTF-8, xml 文件
13.springbootApplication注解的作用
@SpringBootApplication来标注这是一个springboot的应用,被标注的类是一个主程序, SpringApplication.run(App.class, args);传入的类App.class必须是被@SpringBootApplication标注的类。
14.简述springMVC框架
Spring Web MVC 是一种基于 Java 的实现了 Web MVC 设计模式的请求驱动类型的轻量级 Web 框架,即使用了 MVC 架构模式的思想,将 web 层进行职责解耦,基于请求驱动指的就是使用请求-响应模型,框架的目的就是帮助我们简化开发,Spring Web MVC 也是要简化我们日常 Web 开发的。
15.简述SpringIoc
SpringIoc容器是Spring框架的一大核心,容器将创建对象,把他们链接到一起,配置,并一起管理他们的整个生命周期(从创建到销毁)。
Spring提供了两种不同类型的容器
1.SpringBeanFactory容器,这是为Di提供基本支持的最简单的容器(懒汉式)
2.SpringApplicationContext 容器,这个容器包含李BeanFactoryContontainer的所有功能,因此推荐使用BeanFactoryFactory(饿汉式)
16.简述Spring Bean的生命周期
创建前准备->创建实例化->依赖注入->容器缓存->销毁实例
17.AutoWired注解的作用
Autowired可以更加准确的空手指应该在何处以及如何进行自动装配,以及进行实例化创建
18.Spring的事务
首先Spring本身是没有事务的,但是数据库支持事务,所以Spring框架使用的数据库的事务,因此Spring事务的特性以及隔离级别和数据库一致.
特性:
原子性,持久性,隔离性,一致性
隔离级别:
读已提交,读未提交,可重复读,串行化
19.AOP有哪几种实现方式
1.代理模式静态的实现AOP
2.aspect静态代理实现AOP
3、jdk动态代理实现AOP
4、cglib动态代理实现AOP
常用的就是后两种方式实现AOP
20.依赖注入有哪几种方式
1.构造方法注入
2.接口注入
3.Setter方法注入
21.Spring Bean的几种作用域
singleton,pritotype,request,session,application
22.读取XML文件的几种方式
DOM,DOM4J,JDOM,SAX
23.Mybatis和MybatisPlus的区别
MybatisPlus是Mybatis的升级版,两者一起使用并不会相互影响.
Mybatis遇到一些复杂的Sql需要自己手动在XML文件中写Sql语句
MybatisPlus 只能进行单表查询,不需要写Sql语句,只需要在Mapper层继承BaseMapper<?>就可以实现。但是MybatisPlus不能控制Sql语句的优化。
24.Redis常用的数据类型
String
List集合
Set集合
Hash散列表
sort Set集合
25.常用的IO类
字符流有两个基类: Reader 和 Writer
字节流有两个基类: InputStream 和 OutputStream
26.Mysql优化
看帖子<关于Sql优化>
27.怎么创建索引
直接创建索引
CREATE INDEX index_name ON table(column(length))
修改表结构时添加索引
ALTER TABLE table_name ADD INDEX index_name ON (column(length))
创建表时添加索引
CREATE TABLE `table` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL ,
`content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL ,
`time` int(10) NULL DEFAULT NULL ,
PRIMARY KEY (`id`),
INDEX index_name (title(length))
)
28.重写和重载的区别
重写:
重写发生在父子类的继承基础上,子类继承了父类原有的方法,但有时子类并不想原封不动的继承父类中的某个方法,所以在方法名,参数列表,返回类型(除过子类中方法的返回值是父类中方法返回值的子类时)都相同的情况下, 对方法体进行修改或重写,这就是重写。但要注意子类函数的访问修饰权限不能少于父类的。
重载:
在一个类中,同名的方法如果有不同的参数列表(参数类型不同、参数个数不同甚至是参数顺序不同)则视为重载。同时,重载对返回类型没有要求,可以相同也可以不同,但不能通过返回类型是否相同来判断重载。
29.http协议的请求方式
序号 | 方法 | 描述 |
1 | GET | 发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存 、可保留书签等。幂等 |
2 | POST | 和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对 原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等 |
3 | HEAD | 本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检 查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。 |
4 | PUT | 和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知 道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的, 无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等 |
5 | DELETE | 请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等 |
6 | CONNECT | HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页 然后把数据返回回来,连接成功后,就可以正常的get、post了。 |
7 | OPTIONS | 获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。 |
30.get和Post方式的区别
Get | POST | |
点击返回/刷新按钮 | 没有影响 | 数据会重新提交 |
缓存/添加书签 | 可以 | 不可以 |
历史记录 | 有 | 没有 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用 多重编码 |
是否幂等 | 幂等 | 非幂等 |
长度限制 | http协议没有限制,但是实际浏览器或服务 器有(最大2048) | 理论上没有,可能会收到服务器配置或内存限制 |
数据类型限制 | 只能ASCII,非ascii都要编码传输 | 没有限制,允许二进制数据 |
安全性 | 数据全部展示在url中,不安全 | 相比get,通过request body传递数据,比较安全 |
可见效 | 可见 | 不可见 |
31.http常用的返回状态码
200 -- 正常 201 -- created 已创建 400 -- 错误请求 401 -- 未授权
402 -- 需要付款 403 -- 禁止访问 404 -- 找不到网页 405 -- 方法不允许
32.异常处理
java异常处理本质上是 抛出异常 (要理解抛出异常,首先要明白什么是异常情形(exception condition),它是指阻止当前方法或作用域继续执行的问题。) 和 捕获异常(在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。)
33.$和#的区别
$是字符串拼接,会将传进来的数据直接拼接到sql语句上,会出现sql注入的问题
#是占位符,会预编译,不会出现sql注入的问题
34.Mybatis的缺点
对SQL语句依赖程度很高;并且属于半自动,数据库移植比较麻烦,比如mysql数据库编程Oracle数据库,部分的sql语句需要调整
35.Redis存储了什么什么数据
Redis当分布式缓存时主要是将一些用户经常访问的数据,或者不经常变的一些数据存放进去,肩上数据库访问压力
36.第二范式和第三范式的区别
第二范式与第三范式的本质区别:在于有没有分出两张表。
第二范式是说一张表中包含了多种不同实体的属性,那么必须要分成多张表,第三范式是要求已经分好了多张表的话,一张表中只能有另一张标的ID,而不能有其他任何信息,(其他任何信息,一律用主键在另一张表中查询)
37.线程死锁
线程死锁是指两个或两个以上的线程互相持有对方所需要的资源,由于synchronized的特性,一个线程持有一个资源,或者说获得一个锁,在该线程释放这个锁之前,其它线程是获取不到这个锁的,而且会一直死等下去,因此这便造成了死锁。
线程死锁产生的条件
1.互斥条件:一个资源,或者说一个锁只能被一个线程所占用,当一个线程首先获取到这个锁之后,在该线程释放这个锁之前,其它线程均是无法获取到这个锁的。
2.占有且等待:一个线程已经获取到一个锁,再获取另一个锁的过程中,即使获取不到也不会释放已经获得的锁。
3.不可剥夺条件:任何一个线程都无法强制获取别的线程已经占有的锁
循环等待条件:线程A拿着线程B的锁,线程B拿着线程A的锁。
怎样避免死锁
加锁顺序:线程按照相同的顺序加锁。
加锁时限,线程获取锁的过程中限制一定的时间,如果给定时间内获取不到,就算了,别勉强自己。这需要用到Lock的一些API。
38.谈谈你对Redis的理解
Redis是一种基于键值对存储的NoSql数据库(非关系型数据库) 是一个key - value存储系统
Redis有两大特点: 高能性,可靠性
高能性 : Redis将所有的数据存储到内存中.所有读写性都特别高
可靠性 : Redis将内存中的数据利用RDB和AOF的方式持久化到硬盘当中.这样可以避免发生断电或者机器故障是内存中的数据丢失的问题
Redis的功能应用
1.数据缓存的功能,减少对数据的访问压力
2.消息队列功能(轻量级) Redis提供了发布订阅功能和阻塞队列功能
缓存 : 优化网站性能 首页(不可变得数据)
存储 : 单点登录 . 购物车
Redis的应用场景
1.缓存数据库服务器:
SSO单点登录
2.应对高速读写的场景
秒杀高应用
3.分布式锁
秒杀数据一致性
4.数据共享
库存数据
40.Springcloud组件
服务的注册与发现(Eureka ,zookeeper)
负载均衡器 (Ribbon.Feign)
服务的熔断降级(Hystrix,sentinel)
微服务网关(zuul / getway)
41.sentinel的熔断降级机制
服务限流:目的为了保护咱们的服务,在高并发的状况下,若是客户端请求服务器端到必定的极限(设置阈值),请求的数量超出设置的阈值,开启自我保护机制,直接执行咱们的服务降级方法,不会执行咱们的业务逻辑,走本地falback方法
服务降级:在高并发的状况下,为了防止用户一直等待,采用限流或者熔断机制,保护咱们服务,不会执行业务逻辑,走本地falback方法服务器
http://www.javashuo.com/article/p-vvihppmf-ka.html
42.怎么解决跨域问题
单体项目的话只需要在Controller层添加@CrossOrigin注解就可以了
微服务架构的项目可以在网关配置进行访问限制
43.简单的介绍对负载均衡的理解
负载均衡就是通过某种负载分担方式.讲外部发送来的请求均匀的分配到对称结构中的某一台服务器,而收到服务器请求的服务器能够独立的回应客户端的请求.负载均衡解决了大量并发访问服务问题.这种集群技术可以用最少的投资获得接近于大型主机的性能
常见的负载均衡策略:
轮训策略
权重策略
IP哈希策略
44.简单描述反向代理的流程
1.用户向web服务器发送请求.并被DNS服务器解析为反向代理服务器的IP地址
2.反向代理服务器接受用户的请求
3.反向代理服务器代理到对应的服务器进行业务处理.并将处理的结果返回
45.map自定义一个实例作为map的key,需要满足什么条件,自定义类作为key满足什么要求。
1,重写 hashcode 和 equals 方法
2,不能使用单例对象
.......
46.list集合用什么方式遍历
1.普通for循环遍历
2.高效for循环遍历
3.迭代器Iterator遍历
47.进程和线程分别是什么?
进程是资源分配的最小单位,线程是CPU资源调度的最小单位.
48.mq的用途
MQ 是message queue ,消息队列.也叫消息中间件.,是类似于数据库一样需要独立部署到服务器上的一种应用.提供接口给其他系统使用.
使用消息队列可以用6个字简单概括:解耦,一步,削峰
解耦:将消息写入消息队列.需要消息的时候自己从消息队列中订阅.从而源系统不需要做任何修改。
异步:将消息写入消息队列,非必要的业务逻辑一异步的方式运行,加快响应速度
削峰:源系统慢慢的按照数据库能处理的并发量.从消息队列慢慢拉去消息,从生产中,这个短暂的高峰积压是允许的
49.线程的几种状态,状态转换的关系,主动阻塞与被动阻塞
创建 -> 就绪 -> 执行 -> 阻塞 -> 死亡
创建 : 新建一个线程对象.
就绪 : 线程对象创建之后.其他线程调用了该对象的start()方法.该状态的线程位于“可运行线程池”中.变得可运行.只等待获取cpu的使用权.就是在运行状态的进程除cpu之外.其他的运行所需要资源都已经去全部获得。
执行 :就绪状态的线程获得了CPU使用权.执行程序代码
阻塞:
(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
死亡:线程执行玩或者应为异常退出了run()方法之后.该线程结束生命周期
阻塞(被动):进/线程 被暂停执行.阻塞的进程仍处于内存中.os 把处理器分配到另一个线程中.而让被暂停的进程处于暂停的状态,需要等到获得到锁之后才会进入就绪状态.等待调度执行
挂起(主动):用户主动暂停执行进/线程.挂起的进程被换出到磁盘中. 需要用户主动控制.挂起线程不会释放对象锁
睡眠(主动):用户主动暂停执行的进/线程. 睡眠/线程任存与内存中. 睡眠恢复是自动完成的.睡眠的时间到了则自动恢复到就绪状态.睡眠线程不会自释放对象锁
50.NIO/BIO的区别.
BIO是阻塞式IO.服务器接收到请求之后.要接受传来的数据.都会开启一个socket开启一个线程来读取数据.执行业务逻辑.执行完操作之后.返回结果.在没有执行完业务逻辑时线程不会释放锁.此时服务器无法完成大量的请求.应为有大量的线程处于阻塞状态.需要等待业务逻辑执行完成之后释放锁.
NIO是非阻塞式IO,当服务器接收到请求之后.就会创建一个通道(一个selector) 可以注册很多的channel 通过,一个selector监听多通道的方式,当某一个通道的任何一个状态.准备就绪就会额外的开启一个线程.执行执行多路复用模型
51.为什么实现多路复用?
采用一个线程维护多个TCP连接的IO操作.线程安全.支持高并发. 提高缓冲区的高读写效率
52. 数据库索引的原理
数据库的索引的实现主要有两种实现方式:MyISAM和InnoDB
MyISAM索引实现方式:
MyISAM引擎使用的是B+tree作为索引结构,叶子节点上存放的是数据记录 的地址值.
MyISAM中的索引检索的算法为首先按照B+tree搜索算法搜索索引.如果指定的可以存在.则取出其data域的值.然后一data域的值作为地址.读取相对应的数据.
MyISAM的索引方式也叫做“非聚集索引”.
InnoDB索引实现:
虽然InnoDB也是使用B+tree作为索引结构.但是具体的实现方式也MyISAM截然不同
第一个区就是InnoDB的数据文件本身就是索引文件,在InnoDB中,表数据文件本身就是B+tree组织的一个索引结构.在B+tree上叶子节点是的data域保存了完整的数据记录.这个索引的key及时数据表的主键.因此InnoDB表数据文件本身就是主索引.
53.为什么建立索引数据库就会加快?
数据库在进行查询的时候默认是进行全表扫描.遇到匹配的结果就会加入搜索的结果集中.当添加索引之后.就会先去索引列表中一次定位到特定值得行数.大大减少遍历匹配的行数.
54.B+Tree怎么存储数据的?
叶子节点上存储的是主键key或者是具体的数据.非子页节点存储的是主键和指向下一页的指针.叶子节点之间又通过指针相连.形成双向链表结构.
55.数据库的隔离级别
读已提交,读未提交,可重复读,可串行化