java面试题总结

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协议的请求方式

序号方法描述
1GET

发送请求来获得服务器上的资源,请求体中不会包含请求数据,请求数据放在协议头中。另外get支持快取、缓存

、可保留书签等。幂等

2POST

和get一样很常见,向服务器提交资源让服务器处理,比如提交表单、上传文件等,可能导致建立新的资源或者对

原有资源的修改。提交的资源放在请求体中。不支持快取。非幂等

3HEAD

本质和get一样,但是响应中没有呈现数据,而是http的头信息,主要用来检查资源或超链接的有效性或是否可以可达、检

查网页是否被串改或更新,获取头信息等,特别适用在有限的速度和带宽下。

4PUT

和post类似,html表单不支持,发送资源与服务器,并存储在服务器指定位置,要求客户端事先知

道该位置;比如post是在一个集合上(/province),而put是具体某一个资源上(/province/123)。所以put是安全的,

无论请求多少次,都是在123上更改,而post可能请求几次创建了几次资源。幂等

5DELETE请求服务器删除某资源。和put都具有破坏性,可能被防火墙拦截。如果是https协议,则无需担心。幂等
6CONNECT

HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。就是把服务器作为跳板,去访问其他网页

然后把数据返回回来,连接成功后,就可以正常的get、post了。

7OPTIONS获取http服务器支持的http请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。
8TRACE

回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息。

 30.get和Post方式的区别

GetPOST
点击返回/刷新按钮没有影响数据会重新提交
缓存/添加书签可以不可以
历史记录没有
编码类型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.数据库的隔离级别

读已提交,读未提交,可重复读,可串行化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值