2020-11-12面试问题总结

问题记录

1.http和https的区别:超文本传输协议

(1)http不安全,在传输过程中,是明文传输

(2)无法验证通信方的身份,没有用户验证

(3)在http传输过程中,接收方和发送方都 不会验证报文的完整性

2.java8--支持函数式编程、日期Api、StreamApi、新的javaScript引擎

(1)Lambda 表达式

3.TreeMap可以自动排序

4.SpringBoot:简化配置 数据库 注解 日志 tomcat等都是配置好的 可以直接使用

5.get/post:

1.get有长度限制,post无长度限制

2.都是http请求 都不是安全的 参数都存在于requestBody中 相对比来说 post比get安全(get参数直接在url后面)

6.面向对象特征:继承 封装 多态 抽象

7.Spring:

AOP:面向切面(把所有散落的事务集中到一个切面事务中)

IOC:依赖注入/控制反转

把需要的对象提前创建好,放到spring容器,还可以设置单例模式;

    注入方式最常见的:注解(@Controller @Service)

事务:可能会更新数据库数据项的一段程序

8.Spring SpringMVC SpringBoot MyBatis

注解:

Spring:@Controller @Service @Autowired @Configuration @Value

SpringMVC:@RequestMapping(访问url) @ResponseBody @RequestBody @RestController(@Controller和@ResponseBody)

SpringBoot:@SpringBootApplication @RestController @ResponseBody @RequestMapping @Configuration

9.MyBatis框架优点:减少JDBC大量冗余代码、很好的与各种数据库兼容、提供第三方插件分页插件、sql在xml里面 减少代码与sql耦合

10.设计模式:

Facade模式(外观模式):要求一个子系统的外部与内部访问时 必须通过Facade对象,Facade模式提供接口,方便其余子系统调用

工厂模式、模板模式,单例模式、观察者模式、

11.Redis(非关系型数据库,主要用于缓存),关系型数据库(数据存于硬盘中)

redis支持list hash set String等数据类型 所以redis可以用来作为注册中心、数据库、缓存、消息中间件

memcache 不支持数据持久化,重启之后,数据丢失。 且只支持String类型

redis安全机制:redis.conf 加密码验证    禁止外网访问redis:bind 127.0.0.1 使得redis服务只在当前服务器使用

    redis设置过期时间:jedisClient.set(key, value, "NX", "EX", expireSecond);

高性能(速度快) 高并发(用户访问数据访问一次  然后放入缓存)

redis为什么速度快 (1.数据存储在内存中 ,用户访问请求通过内存 2.数据简单 3.单线程,避免多线程出现阻塞而导致性能消耗)

redis读写性能很高 很适合读写操作多的

redis支持持久化 把内存中的数据写到硬盘 防止因为宕机数据丢失

redis读的速度110000/s 写速度80000/s

redis集群 哨兵模式 创建多个redis实例

主从复制 主只要用于写  分节点主要用于读(速度快)

秒杀系统业务层 集群  多台机器一起处理  提高并发

redis持久化:RDB和AOF(修改配置文件 appendonly改为yes,redis会记录每次操作)

12.进程 线程

继承Thread类、实现Runnable接口、实

现callAble(可以获得异步任务返回的值)

join方法:可以设置a线程在b线程执行完后再执行

13.JVM

java虚拟机是一个可以执行java字节码文件的虚拟机进程。java源文件被编译成能被java虚拟机执行的字节码文件

堆区:存放对象

栈区:存放引用,变量

方法区:类信息 常量变量

14.StringBuffer(线程安全) StringBuilder(线程不安全)

15.相对于HashMap来说 ConcurrentHashMap线程安全

16.多线程:单个程序创建多个并行执行的线程来完成各自的任务

劣势:线程也是程序,线程越多 占用内存也越大

一个进程可以有多个线程(比如window中的.exe执行文件)

创建线程:

继承Thread类  extends Thread类 重写run方法

实现Runnable接口 implement Runnable接口 重写run方法

实现Callable接口

使用Executors工具类创建线程

调用start方法是启动线程 使线程处于就绪状态 run方法只是Thread的一个普通执行方法  所以 线程启动 是用start

wait(线程等待) sleep(线程睡眠) notify(唤醒线程)

线程数过多 消耗过多cpu  占用过多内存

synchronized控制线程同步 控制同一段代码段不被多个线程同时使用  可以修饰 类方法变量

synchronized修饰实例方法(给对象实例加锁) 修饰代码块

ConcurrentHashMap-并发容器 使用分布锁来保证多线程的性能

线程池--事先创建若干个线程放入池中 需要的话从池中取 不需要放回池中  这样就大量减少创建和销毁对象的开销

线程池优点:降低资源消耗 提高响应速度 提高线程管理 提供定时执行 定期执行 单线程 并发数控制等功能

利用Executors 框架可以非常方便的创建一个线程池

Future表示异步计算的结果 可以提供get方法获取结果

线程池中 executor和submit(可以返回future对象)

ThreadPoolExecutor 创建线程池 三个重要参数:corePoolSize(核心线程数)maximumPoolSize (允许存在的工作中的线程数) workQueue(新任务达到核心线程数 要放入队列)

一个简单的线程池Demo

FutureTask详解

17.SpringMvc Post乱码--在web.xml配置characterEncodingFilter过滤器

get乱码---修改tomcat配置文件 new String(str.getBytes('ISO-8859-1'),'utf-8')

18.swagger  可以直接生成一个接口文档网站  方便调试  可视化api

19.删除百万数据的时候  先删除索引 再删除无用数据  再加上索引

20.集群:是指在多态服务器上部署同样的业务代码,构建一个集群,提高负载均衡设备对外提高服务

21.dubbo: 提供方 消费方

22.zookeeper部署方式:单机部署  集群部署

23.MQ 主要用于服务间异步通信

优点:支持高并发 高吞吐 性能高 异步处理消息(系统数据修改不需要直接同步调用接口的  就可以发消息异步处理),解耦,削峰(减少高峰时期服务器压力)

缺点:系统可用性变低(消息队列挂了,系统就挂了),系统复杂度变高(无法判断 消息处理一致性问题、消息是否重复消费 )

kafka 转为超高吞吐量的实时日志采集 实时数据同步

kafka 吞吐量17万 支持顺序模式 稳定性差

rabbitMq 吞吐量3万 不支持顺序模式 稳定性好

MQ保证顺序执行的方法:1.生产方-MQServer-消费方  一对一对一    缺点:并行度就会成为消息系统的瓶颈(吞吐量不够)

关键字 交换机(Exchange) 队列(queue) 绑定(binding) 路由关键字(Routing Key) 消息通道(Channel) consumer producer

24.接口和抽象类的区别:

            接口          抽象

可以实现多接口      只能单继承

没有构造函数        可以有构造函数(用于实现初始化)

只能做方法声明      可以做方法声明 也可以做方法实现

        都不能被实例化

25.String:trim() equal() split() substring() length indexOf

26.常用的集合类  list(add get remove ) Map(put clear get) HashMap ArrayList TreeMap

ConcurrentHashMap websocket  nginx

# cd /d

# tar zxvf  解压文件

# vi profile  编辑文件  esc退出编辑模式 shift+: wq保存并退出

# tomcat 启动服务

# cd bin

# ./startup.sh

# cd logs 进入到tomcat服务下的log日志目录

# cat catalina.out  显示tomcat服务该文件的内容

# lsof -i:端口号  查看当前是哪个进程占用了该端口号

进入tomcatbin目录 # ./shutdown.sh 关闭tomcat服务

安装rz-使用rz上传文件到虚拟机  yum install -y lrzsz

# unzip dist.rar  解压缩

# zip -r

# rm -f dir  删除dir目录并且删除该目录下的文件

yum install  下载部分命令

1.dobbo能不能用socket实现;

由于Dubbo底层采用Socket进行通信


tomcat的线程池


redis分布式锁原理


jvm线程是虚拟还是真实的


hashmap的put方法原理。


rabbitMq工作模式。


内存溢出,内存泄漏。


继承和聚合的区别。


自定义注解。


mysql,优化。


反射原理


1112

Java对象序列化和反序列化


Mybatis,where,trim标签

where 元素只会在至少有一个子元素的条件返回 SQL 子句的情况下才去插入“WHERE”子句。而且,若语句的开头为“AND”或“OR”,where 元素也会将它们去除

去除if条件的第一个and或者or

格式化

trim标记是一个格式化的标记,可以完成set或者是where标记的功能


常用的io流


线程的创建,状态。线程池属性。

实现Runnable接口和继承Thread可以得到一个线程类,new一个实例出来,线程就进入了初始状态

线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态


Mysql默认的事务隔离级别

mysql数据库事务的隔离级别有4个,而默认的事务处理级别就是【REPEATABLE-READ】,也就是可重复读。

低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

mysql的4种事务隔离级别,如下所示:

1、未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据

2、提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)

3、可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读,但是innoDB解决了幻读

4、串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。


Maven packet install区别

package是把jar打到本项目的target下,而install时把target下的jar安装到本地仓库,供其他项目使用.


Mq重发机制


Spring事务

主要还是依靠数据库的实务,底层是aop实现。具体是在业务层添加@Transational注解,这样spring容器启动时会去找具体的配置,datasource,然后开启实务,提交回滚等。spring事务有6种传播机制,默认是required,没有事务开启一个,有就进入当前事务。


设计模式

Facade模式(外观模式):要求一个子系统的外部与内部访问时 必须通过Facade对象,Facade模式提供接口,方便其余子系统调用

工厂模式、模板模式,单例模式、观察者模式、代理模式


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主要控件开销在于需要存储结点信息以及结点指针信息。


过滤器和拦截器区别===================过滤器是取你所想,拦截器是拒你所不想

拦截器是AOP( Aspect-Oriented Programming)的一种实现,底层通过动态代理模式完成。

区别:

(1)拦截器是基于java的反射机制的,而过滤器是基于函数回调。

(2)拦截器不依赖于servlet容器,而过滤器依赖于servlet容器。

(3)拦截器只能对action请求起作用,而过滤器则可以对几乎所有的请求起作用。

(4)拦截器可以访问action上下文、值栈里的对象,而过滤器不能。

(5)在action的生命周期中,拦截器可以多次被调用,而过滤器只能在容器初始化时被调用一次。

执行顺序

过滤器 -> 拦截器 -> aop -> 业务逻辑 -> 拦截器的post方法 -> filter的destroy


拦截器与过滤器使用场景:

springWeb MVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理。


1、日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算PV(Page View)等。

2、权限检查:如登录检测,进入处理器检测检测是否登录,如果没有直接返回到登录页面;

3、性能监控:有时候系统在某段时间莫名其妙的慢,可以通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间(如果有反向代理,如apache可以自动记录);

4、通用行为:读取cookie得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取Locale、Theme信息等,只要是多个处理器都需要的即可使用拦截器实现。

5、OpenSessionInView:如hibernate,在进入处理器打开Session,在完成后关闭Session。



非关系型数据和关系型数据库区别

Redis(非关系型数据库,主要用于缓存),关系型数据库(数据存于硬盘中)

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织

优点:

1、易于维护:都是使用表结构,格式一致;

2、使用方便:SQL语言通用,可用于复杂查询;

3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点:

1、读写性能比较差,尤其是海量数据的高效率读写;

2、固定的表结构,灵活度稍欠;

3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。

优点:

1、格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。

2、速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;

3、高扩展性;

4、成本低:nosql数据库部署简单,基本都是开源软件。

缺点:

1、不提供sql支持,学习和使用成本较高;

2、无事务处理;

3、数据结构相对复杂,复杂查询方面稍欠。


Java stream.map 和 stream.forEach 区别

map 方法接收一个功能型接口,功能型接口接收一个参数,返回一个值。map 方法的用途是将旧数据转换后变为新数据,是一种 1:1 的映射,每个输入元素按照规则转换成另一个元素。该方法是 Intermediate 操作。

forEach 接收一个 Consumer 接口,该接口我们之前讲 Function 包时已经提过了。它只接收不参数,没有返回值。然后在 Stream 的每一个元素上执行该表达式

区别-----------------

生成一个新的对象的时候,使用 map 会更好;只是操作 list 内部的对象时,用 forEach


Maven 中 dependencies 与 dependencyManagement 的区别               

dependencies 即使在子项目中不写该依赖项,那么子项目仍然会从父项目中继承该依赖项(全部继承)

dependencyManagement

里只是声明依赖,并不实现引入,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且

version 和 scope 都读取自父 pom; 另外如果子项目中指定了版本号,那么会使用子项目中指定的jar版本。



SQL查询语句中select from where group by having order by的执行顺序

1.查询中用到的关键词主要包含六个,并且他们的顺序依次为:

select>from>where>group by>having>order by

其中select和from是必须的,其他关键词是可选的,这六个关键词的执行顺序与sql语句的书写顺序并不是一样的,而是按照下面的顺序来执行:

from>where>group by>having>select>order by

from:需要从哪个数据表检索数据

where:过滤表中数据的条件

group by:如何将上面过滤出的数据分组

having:对上面已经分组的数据进行过滤的条件

select:查看结果集中的哪个列,或列的计算结果

order by:按照什么样的顺序来查看返回的数据



final和finally的区别

final修饰的类不能被继承;final修饰的变量,可以保证在使用中不被改变;final修饰的变量必须赋初始值,且只能赋值一次,不可修改;final修饰的方法也不能被重写。

finally主要是用来关闭资源(数据库连接,网络连接,磁盘文件等),不管是否发生异常,资源都必须进行关闭。通常写在try…catch…后面,无论try…catch…块中出现什么异常,finally的语句块都将会执行,除非关闭JVM,它才不会执行。


Hashmap和Hashtable的区别?
底层都是数组+链表实现

Hashmap:

1.可以存储null键和null值,线程不安全

2.初始size为16,扩容:newsize =oldsize*2,size一定为2的n次幂

Hashtable:

1.无论是key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个Hashtable,效率低

2.初始size为11,扩容:newsize=oldsize*2+1


java异常中throw和throws的区别

throws:用来声明一个方法可能产生的所有异常,不做任何处理而是将异常往上传,谁调用我我就抛给谁。

  用在方法声明后面,跟的是异常类名

  可以跟多个异常类名,用逗号隔开

  表示抛出异常,由该方法的调用者来处理

  throws表示出现异常的一种可能性,并不一定会发生这些异常

throw:则是用来抛出一个具体的异常类型。

  用在方法体内,跟的是异常对象名

  只能抛出一个异常对象名

  表示抛出异常,由方法体内的语句处理

  throw则是抛出了异常,执行throw则一定抛出了某种异常


多线程sleep()和wait()的区别

sleep()

  1、属于Thread类,表示让一个线程进入睡眠状态,等待一定的时间之后,自动醒来进入到可运行状态,不会马上进入运行状态

2、sleep方法没有释放锁

  3、sleep必须捕获异常

  4、sleep可以在 任何地方使用

wait()

  1、属于Object,一旦一个对象调用了wait方法,必须要采用notify()和notifyAll()方法唤醒该进程

2、wait方法释放了锁

  3、wait不需要捕获异常

  4、wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用

sleep(1000)和wait(1000)的区别:

Thread.Sleep(1000)

意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。

wait(1000)

表示将锁释放1000毫秒,到时间后如果锁没有被其他线程占用,则再次得到锁,然后wait方法结束,执行后面的代码,如果锁被其他线程占用,则等待其他线程释放锁。注意,设置了超时时间的wait方法一旦过了超时时间,并不需要其他线程执行notify也能自动解除阻塞,但是如果没设置超时时间的wait方法必须等待其他线程执行notify。


Spring|@Autowired与new的区别

@Autowired相当于setter,在注入之前,对象已经实例化,是在这个接口注解的时候实例化的;

而new只是实例化一个对象,而且new的对象不能调用注入的其他类

@Autowired是从IOC容器中获取已经初始化的对象,此对象中@Autowired的属性也已经通过容器完成了注入,整个生命周期都交由容器管控。然而通过new出来的对象,生命周期不受容器管控,自然也无法完成属性的自动注入。


IOC:依赖注入或者叫做控制反转。

正常情况下我们使用一个对象时都是需要new Object()的。而ioc是把需要使用的对象提前创建好,放到spring的容器里面。

所有需要使用的类都会在spring容器中登记,告诉spring你是个什么东西,你需要什么东西,然后spring会在系统运行到适当的时候,把你要的东西主动给你,同时也把你交给其他需要你的东西。所有的类的创建、销毁都由

spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。DI(依赖注入)其实就是IOC的另外一种说法,其实它们是同一个概念的不同角度描述。

场景:

正常情况下我们使用一个对象时都是需要new Object() 的。而ioc是把需要使用的对象提前创建好,放到spring的容器里面。需要使用的时候直接使用就行,而且可以设置单例或多例,非常灵活。

我们在service层想调用另外一个service的方法,不需要去new了,直接把它交给spring管理,然后用注解的方式引入就能使用。

IOC三种注入方式

(1)XML:Bean实现类来自第三方类库,例如DataSource等。需要命名空间等配置,例如:context,aop,mvc。

(2)注解:在开发的类使用@Controller,@Service等注解

(3)Java配置类:通过代码控制对象创建逻辑的场景。例如:自定义修改依赖类库。


UNION与UNION ALL的区别?

如果使用UNION ALL,不会合并重复的记录行

效率 UNION 高于 UNION ALL


你可能感兴趣的:(2020-11-12面试问题总结)