面试后对面试题整理(一)

1、线程之间的通讯
答:进程中的线程间内存共享,这是比较常用的通信方式和交互方式。
:定义全局变量时最好使用volatile来定义,以防编译器对此变量进行优化。
不要在servlet中设置全局变量,否则高访问量访问servlet时,会造成线程并发问题。
Wait和notify方法:Wait方法释放对象锁,当前线程必须要等待,等到另外一个线程调用notify或者notifyAll
方法,被唤醒的线程是不能被执行的,需要等到当前线程放弃这个对象的锁。
Sleep方法:可以导致线程暂停,但是在线程睡眠的期间不会释放对象锁
wait()和notify()方法要求在调用时线程已经获得了对象的锁,因此对这两个方法的调用需要放在synchronized方法或synchronized块中。

2、数据库有哪几种事务安全级别
答:数据库的隔离级别有4种,由低到高依次为Read uncommitted(未授权读取、读未提交)、Read committed(授权读取、读提交)、Repeatable read(可重复读取)、Serialiazble(序列化) Read uncommitted:
易出现脏读(事务a读取到了事务b未提交的数据),可以避免更新丢失
Read committed:
避免了脏读,但是会出现不可重复读(一个事务对数据读取了两次,却得到了不同的结果)
Repeatable read:
避免了不可重复读和脏读,但是会容易出现幻读(事务在操作过程中进行进行两次查询,第二次相对第一次查询缺少或者增多的数据,这是因为在两次查询过程中有一次事务 的插入数据所造成的)
Serializable:
序列化是最高的隔离级别,上述问题都可以解决,但是性能相对来讲是比较低的,因为此隔离级别是最高的,因此越能保证数据的完整性和一致性。
注:1、我们平时为了读取效率,一般可以把数据库的隔离级别设置为Read committed
,他可以避免脏读取,虽然会出现不可重复读、幻读,但是可以在应用程序中采用悲观锁或乐观锁去控制。
2、大多数数据库默认级别是Read committed,例如SQl server oracle
Mysql的默认级别是Repeatable read

3、shiro框架在项目中的作用
答:shiro是一个安全控制框架,能识别用户的身份和权限,就是一个比较方便快捷实现身份验证和权限控制的安全框架。

4、介绍一下MVC分层架构
答:model -view-controller,是一种分层设计软件架构,目的是将代码解耦,以便后期进行更好的代码复用以及维护与测试。
view层: 结合control层,显示前台页面。
control层:业务模块流程控制,调用service层接口。
service层:业务操作实现类,调用dao层接口。
dao层: 数据业务处理,持久化操作
model层: pojo,OR maping,持久层

5、在你的项目中哪些用到了spring-mvc
答:MVC是我们之前学过的一种Web项目的重要软件架构。是Web项目开发一个很重要的组成部分。在view层向controller层传值的时候可以直接用对象来接收。

6、springAOP,IOC
答:spring aop是面向切面编程,原理是动态代理
Spring ioc是控制反转,DI依赖注入,降低耦合度,提高代码的可维护性

7、SVN冲突怎么解决
答:svn的冲突主要是在提交代码的时候,都进行了修改,才会造成冲突,我们可以采取以下方式来进行避免:分配给项目组的成员不同的账号来进行区分具体的代码是谁写的。
具体解决如下:
A、放弃自己的更新,使用svn revert(回滚),然后提交。在这种方式下不需要使用svn resolved(解决)
B、放弃自己的更新,使用别人的更新。使用最新获取的版本覆盖目标文件,执行resolved filename并提交(选择文件—右键—解决)。
C、手动解决:冲突发生时,通过和其他用户沟通之后,手动更新目标文件。然后执行resolved filename来解除冲突,最后提交。

8、nginx负载均衡
答:nginx是一个反向代理服务器,他可以实现服务器的负载均衡,

9、jdbc连接池以及原理
答:因为数据库比较消耗内存资源,连接池用来分配和管理连接,不需要重复创建连接,节省重复创建的时间,从而提高数据库连接的性能。
原理:使用集合存储connection对象,需要的时候,从集合中获取connection对象,使用完毕之后,将connection放回到集合中

10、hibernate的一二级缓存的具体区别
答:hibernate的一级缓存是session缓存,二级缓存是sessionfactory缓存,
什么样的数据适合放到二级缓存中?
1、很少被修改的数据2、不是很重要的数据,允许出现偶尔并发的数据3、不会被并发访问的数据4、参考数据
不适合存放到第二级缓存的数据?
A、经常被修改的数据B、财务数据,绝对不允许出现并发C、与其他应用共享的数据。
一级缓存是session级别的,也可以理解为在一个事务中起作用,同一个事务对数据库操作两次时,是从缓存中取出的。
另外需要注意的一点是:对数据库进行增删改操作之后,对应的二级缓存就会更新,就意味着二级缓存要存储一些很少被修改的数据

12、线程池的详细信息如何创建
答:首先要创建线程池管理器,用来创建并管理线程;大致可以分为两种线程池:
A:LinkedBlockingQueue是一个无界限的队列,同时也是一个阻塞的队列;LinkedBlockingQueue:优先是线程池执行比较稳定,不会出现内存溢出,缺点是任务多线程少,执行比较慢。LinkedBlockingQueue:适用于100W任务,对于执行时间较长的任务使用此队列最合适。
B: SynchronousQueue:无缓冲区的队列,里面只能存放一个任务
优点:处理任务速度比LinkedBlockingQueue队列快
缺点:一旦线程数上万,主机崩盘,不稳定
New ThreadPoolExecutor(5个参数)
第一个参数:线程池的大小;第三个参数:闲置多长时间释放;
第四个参数:闲置时间的单位(毫秒)
第五个参数:当线程少任务多的时候将线程没有处理的任务放到队列中

13、list、set、map的 区别
答:List:元素是有顺序的,元素可以重复因为每个元素有自己的角标(索引)
|-- ArrayList:底层的数据结构是数组结构,特点是:查询很快,增 删 稍微慢点,线程不同步
|-- LinkedList:底层使用的是链表数据结构,特点是:增 删很快,查询慢。
|–Vector:底层是数组数据结构,线程同步,被ArrayList代替了,现在用的只有他的枚举
Set:元素是无序的,且不可以重复(存入和取出的顺序不一定一致),线程不同步。
|–HashSet:底层是哈希表数据结构。根据hashCode和equals方法来确定元素的唯一性
|–TreeSet:可以对Set集合中的元素进行排序(自然循序),底层的数据结构是二叉树,也可以自己写个类实现Comparable 或者 Comparator 接口,定义自己的比较器,将其作为参数传递给TreeSet的构造函数。
Map:这个集合是存储键值对的,一对一对往里存,而且要确保键的唯一性(01,张三)这样的形式打印出来就是 01=张三
|–HashTable:底层是哈希表数据结构,不可以存入null键和null值,该集合线程是同步的,效率比较低。出现于JDK1.0
|–HashMap:底层是哈希表数据结构,可以存入null键和null值,线程不同步,效率较高,代替了HashTable,出现于JDK 1.2
|–TreeMap:底层是二叉树数据结构,线程不同步,可以用于个map集合中的键进行排序

14、什么是单例模式、你在项目中还用到了那些模式写出3种
答:一个类只有一个对象实例。还用到:工厂模式、代理模式、观察者模式

15、cookie和session的区别
答:cookie存在于浏览器中,session存在于服务器中;关闭服务器是session会清空、关闭客户端cookie不会立即清空;cookie相对于session不是特别安全;当访问量过大时,可以考虑将信息放到cookie中。

16、spring boot 和spring有何不同,是基于那些机制实现的
答:Spring Boot框架的核心就是自动配置,只要存在相应的jar包,Spring就帮我们自动配置。如果默认配置不能满足需求,我们还可以替换掉自动配置类,使用我们自己的配置。他相比于spring,帮我们简化了很多配置;
基于注解实现的

17、treemap和hashmap区别
答:1、Hashmap适于在Map中插入删除定位元素;
2、Treemap适于按自然顺序或者自定义顺序遍历key;
3、hashmap比treemap要快一点,建议多使用Hashmap,在排序的时候使用treemap,
4、haspmap是非线程安全的,treemap是线程安全的
5、hashmap的结果是没有排序的,而treemap的输出结果是排好序的

18、list和set区别
答 1、list和set都是继承自collection接口;
2、list是有序的,可以存放重复的元素;set是无序的,不能放置重复的元素
3、Set迭代速度较快

19、linklist和arraylist的区别?arraylist扩容机制
答:arraylist是基于数组的数据结构,linkedlist是基于链表的数据结构;
对于查询数据,arraylist顺序要优于linkedlist;对于新增和删除数据,linkedlist的速度是要优于arraylist的;

20、事务特性
答:“一原十隔“:一致性、原子性、持久性、隔离性

21、怎么在hibernate和mybatis区别
答:hibernate和mybatis都是一种orm框架,其不同在于:hibernate更加面向对象,不需要写sql语句,都是直接对对象进行操作的hql语句,hibernate使用和配置也相对较为复杂;mybatis使用起来较为简单,不需要特别复杂的配置,但是对sql语句的要求较高;一般对于项目的抉择取决于项目本身,如果项目组的人都没用过hibernate和mybatis,我们选择mybatis,因为mybatis的学习成本较低,就现在市场形势看,越来越多的大公司都在渐渐偏向于使用mybatis

22、springMvc的注解有哪些
答:@controller、@requestmaping、@autowired、@component、@repository、@resource、@service

23、linux怎么读取文档
答:linux读取文档,使用vi命令进入文档,按i之后使得文档变为可编辑,修改完之后命令 ”:wq“进行保存更改之后的内容,”:q“强制退出

24、redis的使用场景
答:redis是一种常用的缓存,和mongodb不同,更偏向于是一种缓存,不是存储;
常用redis存放一些安全级别不是特别高的信息;
例如:会话缓存(商品的购物车信息)、全页缓存(存储一些页面信息)

25、简述下nginx怎么实现负载均衡
答:nginx是一个反向代理服务器,使用nginx实现服务器的负载均衡;使用redis实现服务器的session共享;反响代理服务器:是在服务器端,提供一个对外的统一代理服务器。配合多台tomcat服务器,即使一台服务器宕机了,也不会影响用户的正常使用

27、单实例多线程的问题,为什么多线程会引起安全问题
答:由于线程间是竞争关系,都去抢夺CPU资源,当多个线程同时访问一个数据时,有可能出现数据前后不一致的问题,就是线程同步问题

28、redis存储需要注意什么
答:数据不一致的问题,从数据库读取出来到存放到redis是存在一个时间差的,所以不要缓存那些对数据要求一致性很高的数据。

29、集群的原理
答:集群就是多个计算系统进行连接配置,高可用性(High Availability)集群,简称HA集群。其工作原理就是:多台主机一起工作,各自运行一台或几台服务,当一台服务器出现宕机时,会有其他主机接替服务器的任务

31、负载均衡中使用redis如何实现数据的共享
答:在配置中导入redis所需要的依赖并跟spring相结合,再对redis进行配置

32、在多线程中如何保证数据安全,如不使用同步如何实现
答:1、同步锁:Java提供了锁的进行来解决线程同步问题。
2、同步块:用法:synchronized(对象){
需要同步的代码
}
3、同步方法:
synchronized还可以修饰方法,整个方法都被上锁:

33、数据库sql性能测试(什么样的数据库查询语句效率高)
答:建立索引,使用索引查询效率高,但是使用索引需要注意的事项:在查询语句中不要使用!= ,要尽量的使用not null等设置;不要使用select * 等查询语句

34、数据库除去建立索引还能怎样优化
答:可以对数据库进行主从分区,设立主从分区会减轻数据库的压力,
避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。
使用连接(JOIN)来代替子查询
使用联合查询来代替手动创建的临时表
对sql语句进行优化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值