signed

QiShunwang

“诚信为本、客户至上”

总结的一些面试题

2020/8/19 21:57:29   来源:

1.ArrayList和LinkedList,讲一下各自的优势和用法?

ArrayList底层是数组实现,数据依次存储在一段连续的内存空间;只要知道初始的内存地址就能计算出相应下标的内存地址,因此查询快,但是增删元素需要复制移动数据到一个新的数组所以增删慢;

LinkedList底层是节点实现,数据存储在不连续的内存空间,节点的Next/pre存储的是下一个或上一个元素的内存地址,查找元素要从头或尾节点依次遍历,因此查找慢;但增删元素只需要改变相应元素的next/pre的之乡,因此增删快;

2.hashmap怎么存储数据的,讲一下hash冲突

Hashmap基于数组节点实现,通过hashCode()%size()之类的哈希算法得到下标值,然后数据节点放在相应的下标处,如果该下标已有数据,则比较相应的key值是否相同。如果相同值则覆盖,如果不相同则以链表形式存储;链表长度过长影响查找性能,则转化为红黑树形式;链表长度超过8则转化为红黑树,小于6则从红黑树转化为链表

Hash冲突是两个或多个节点通过哈希计算得到相同的下标,hash扩容即当size()元素数/桶的数量(即数组长度)超过设定值,大幅度影响HashMap的性能时,进行桶数量(数组长度)的扩容

3项目中用到哪些集合?怎么用的?

1)list和map;

2)list封装pojo属性,封装参数,封装数据库查询结果,

3)map封装数据库查询结果

4)map封装springIOC中bean定义信息,bean实例对象信息

4.讲一下项目中线程的使用

项目中有些业务要运行在异步线程上,比如日志生成;Springboot对线程池做了一些简化,首先在启动类上添加注解@EnableAsync,启动异步配置,这时底层会初始化一个线程池;然后yml配置文件中设置线程池的相关参数如:容量,核心线程数,超时回收等;之后只需要在相关业务方法上添加@async注解即可表示告诉Spring框架这个方法运行在一个异步线程上

5.讲一下项目中敏感信息如密码一类的怎么保证安全的?

密码一类的敏感信息,页面提交参数的时候,可以采用post提交或在提交数据后面使用UUID生成一段随机字符串作为保护,对于提交的密码信息,使用MD5算法设置加密次数,并通过UUID获取随机盐值生成Simplehash值作为存储在数据库中的密码,同时数据库中要存储盐值,或将SimpleHash值转化为16进制字符串存储;登录时使用shiro认证授权框架,将用户提交的登录信息使用token进行封装然后交给securityManager进行认证对比;

6.讲一下项目优化

1)JVM参数的优化,tomcat参数的优化:一般指的是内存的调节

2)使用nginx反向代理服务器并开启负载均衡策略

3)使用redis缓存数据库配置集群高可用

4)配置主从数据库,使用中间件mycat设置读写分离负载均衡,实现高可用

//如果项目是微服务架构

5)将一体化架构改造为微服务架构,

6)使用注册中心eureka管理服务,(服务发现注册和高可用)

7)使用ribbon实现消费服务的负载均衡(负载均衡和重试)

8)使用Hystrix熔断器实现服务降级和服务熔断

9)使用feign来对rest的请求进行隐藏

10)使用gateway网关来实现安全/监控/埋点/限流

11)使用config配置中心来管理分散的配置文件

12)使用BUS来广播配置文件的更改或服务的监控管理

13)使用消息中间件RabbitMQ处理来自客户端的异步消息实现服务解耦/异步调用/流量削峰

7.讲一下数据库事务

事务四大特性:原子性,隔离性,持久性

事务隔离级别:read-uncommitted读未提交,read-commited读提交不可重复读,repeatable-read可重复读,serializable串行化

8.讲一下#{},${}占位符

#{}对参数值进行占位,通用情况用在条件表达式中获取参数的值

${}为sql片段进行占位,通常用在from/order by等这些字句的后面用来替换具体的表名列名,不能用在条件表达式中,否则容易被改变语义,引起sql注入攻击

9.讲一下mabatis如何封装jdbc的,优化了什么?

是一个优秀的持久层框架,对jdbc的操作数据库的过程进行封装,简单灵活高效;其架构是:

1)XMLConfigBuilder读取配置文件生成SqlSessionFactoryBean对象

2)SqlSessionFactoryBean创建sqlSessionFactory抽象工厂

3)SqlSessionFactory调用具体工厂DefaultSqlSessionFactory创建SqlSession接口类型的会话对象;

4)会话对象调用Executor执行器执行mappedStatement访问数据库并输出相应的结果

5)而MappedStatement对象由XmlStatementBuilder接收sql参数生成,用来封装SQL语句和输出结果映射

mybats优化了jdbc的什么?

1)mybatis简化了jdbc中诸如注册驱动/获取连接/获取传输器/释放资源等大量的重复代码

2)mybatis自身支持连接池,不需要像jdbc那样频繁创建连接和关闭连接,效率高

3)Mybatis将sql配置在mapper文件中,修改sql只是修改配置文件,类不需要重新编译;而jdbc中sql是写死在程序中的,一旦修改sql,需要对类重新编译

4)对查询sql执行后返回的resultSet对象,Mybatis会帮我们处理,转换为java对象;;而jdbc需要手动处理,有时会特别麻烦;

10.讲一下Springboot是如何简化配置的?简化了什么?

Springboot是一个脚手架,构建于Spring框架基础之上,基于快速构建的理念,提供了自动配置功能,实现开箱即用的特性;

其对SpringMVC的简化,比如:

1)SpringMVC需要在web.xml中配置前端控制器,而在springboot中只需要引入web依赖即会自动读取注册前端控制器

2)SpringMVC中需要先在web.xml中配置资源拦截,然后在核心配置文件中设置静态资源放行,而Springboot对静态资源的处理往往默认即可

3)springMVC需要在web.xml中指定核心配置文件,而在Springboot中不需要显式声明指定配置文件

4)springMVC的核心配置文件需要配置注解驱动和指定扫描的package包,而在springboot中不需要这些操作

其对springIOC的简化:1)比如对单例对象的创建,在SpringIOC中需要指定id,class,而在springboot中只需要添加@Controller@service@Bean等注解即可,其对多例对象的处理也只需要添加注解@scope指定prototype即可

2)再比如DI属性注入,SpringIOC需要在配置文件中通过 <bean>注入字段属性,而Springboot中只需要使用@Value注解即可;通过属性注入依赖配合@configurationProperties(prefix=“#”)注解可以实现批量的属性注入;

其对mybatis的简化:比如

mybatis接口开发中需要读取核心配置文件生成sqlSessionFactory再生成sqlSession接口对象,然后通过session.getMapper获取mapper对象执行相关方法;而springboot大大简化了这些操作,只需要在yml配置文件中指定mapper.xml文件位置,在mapper接口上添加@mapper注解即可;

11.讲一下http和https的区别?

HTTP协议是一种使用明文数据传输的网络协议,而HTTPS协议是HTTP协议的升级,是在HTTP的基础上增加了数据加密;HTTPs协议在数据进行传输之前,对数据进行加密,然后再发送到服务器,这样,就算数据被第三者截获,但由于数据是加密的,所以你的个人信息仍然是安全的;这就是HTTP和HTTPS的最大区别;

补充:set为什么无序?如何去重?

1)set是数组实现key值的存储

2)通过hash计算hashCode()%()得到下标值

3)通过初始化内存地址+4*下标值 定位内存地址

4)如果该地址已经有元素则比较是否相同

5)比较是否相同:首先比较hashcode()值是否相同,不一致则返回false;其次比较是否==,==返回true;再次比较已有值是否为空,为空返回false,最后equals()比较是否相同,相同返回true,

6)其中equals()比较首先比较是否==,==返回true;再次比较目标是否为空,为空返回false;

然后比较是否是同一个类,不是返回false,最后比较每个字段值是否==,==返回true;

7)如果比较结果相同则覆盖;

8)如果不相同则下标向后移动一位,再次判断比较,直到存放该数据;

9)如果找到最后的下标位置还是存放不下,则下标从0开始再次寻找位置