亲历JAVA面试题备份

33.XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

32.简述一下面向对象的”六原则一法则“。

31.有什么方法可以提高系统的稳定性?如何应对高并发?

30.经常更新的数据树,如何使用缓存?使用缓存有什么副作用?

副作用:不断的序列化和反序列化时候会有很大的开销。

如何使用索引:如果数据库层面的更新速度是一天更新一次,那么,浏览器上的缓存可以设置为一个小时更新一次。因为如果不用缓存,多并发访问是无法支撑的。

29.mysql建了索引以后,什么时候走索引,什么时候不走索引?为什么性别字段 男和女不建索引呢?

他会算,如果节省70%左右的时候,才会走索引。像男和女一样多,不如全表扫描?

28.对transaction(事务)的理解?什么时候用。

27.两个事务,大事务里面嵌套一个小事务。如何实现当小事务回滚的时候,不让大事务回滚?

26.既然垃圾处理可以自动的进行,那么我们还去学习垃圾处理干什么呢?

之前的项目中,有垃圾过多导致内存不足。

25.你对面向对象编程有什么自己的经验和理解?

24.谈一下学习过的设计模式?可以结合spring。

23.是否用过magodb?之前的项目是如何实现缓存机制的?

22.mysql数据类型除了int,还有哪些?讲一下int(unsigned)。

21.如何带团队,心得体会。

20.敏捷开发的了解。

19.前端框架 AngularJS 了解多少?说几个比较熟悉的前端框架?有没有关注到前端框架发展的方向是什么?

  前端分层。业务层等,使得开发更简便。

18.你在写代码的时候,怎么选择设计模式?

17.http状态码有哪些?

16.hashmap是不是线程安全的?

线程安全的三个条件:
1 代码的顺序性
2 操作原子性
3 内存可见性

其中第二条,其中一个线程扩展map空间时,其他线程执行put操作,会出现并发问题。总之HashMap是非线程安全的,在高并发的场合使用的话,要用Collections.synchronizedMap进行包装一下。

15.数组和 ArrayList 的区别

  1. 数组可以包含基本类型和对象类型,ArrayList 只能包含对象类型
  2. 数组大小固定,ArrayList 大小可以动态变化
  3. ArrayList 提供了更多的特性(addAllremoveAll)。

14.MySQL中四种常用存储引擎的介绍

见单独日志。

13.说说Spring MVC的工作原理、流程 

( DispatcherServlet —— 串联起整个逻辑主线,是整个框架的心脏)在整个Spring MVC框架中,DispatcherServlet处于核心位置,它负责协调和组织不同组件完成请求处理并返回响应的工作。具体流程为:
1)客户端发送http请求,web应用服务器接收到这个请求,如果匹配DispatcherServlet的映射路径(在web.xml中配置),web容器将请求转交给DispatcherServlet处理;
2)DispatcherServlet根据请求的信息及HandlerMapping的配置找到处理该请求的Controller;
3)Controller完成业务逻辑处理后,返回一个ModelAndView给DispatcherServlet;
4)DispatcherServlet借由ViewResolver完成ModelAndView中逻辑视图名到真实视图对象View的解析工作;
5)DispatcherServlet根据ModelAndView中的数据模型对View对象进行视图渲染,最终客户端得到的响应消息可能是一个普通的html页面,也可能是一个xml或json串,甚至是一张图片或一个PDF文档等不同的媒体形式。

12.线程池的作用 

在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程。
  第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
  第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。
  第三:提高线程的可管理性。
   常用线程池:ExecutorService 是主要的实现类,其中常用的有 :Executors.newSingleThreadPool()、newFixedThreadPool()、newcachedTheadPool()、newScheduledThreadPool()。

11.多线程使用的目的

1)  吞吐量:做WEB,容器帮你做了多线程,但是它只能帮你做请求层面的,简单的说,就是一个请求一个线程(如struts2,是多线程的,每个客户端请求创建一个实例,保证线程安全),或多个请求一个线程,如果是单线程,那只能是处理一个用户的请求;

2)伸缩性:也就是说,你可以通过增加CPU核数来提升性能。如果是单线程,那程序执行到死也就利用了单核,肯定没办法通过增加CPU核数来提升性能。

10,线程安全和线程不安全理解

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。 线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的

9,什么是aop?

假如没有aop,在做日志处理的时候,我们会在每个方法中添加日志处理,但大多数的日志处理代码是相同的,为了实现代码复用,我们可能把日志处理抽离成一个新的方法。但是这样我们仍然必须手动插入这些方法。但这样两个方法就是强耦合的,假如此时我们不需要这个功能了,或者想换成其他功能,那么就必须一个个修改。通过动态代理,可以在指定位置执行对应流程。这样就可以将一些横向的功能抽离出来形成一个独立的模块,然后在指定位置插入这些功能。这样的思想,被称为面向切面编程,亦即AOP。

8,对list、set的理解

1 List接口  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。
2 Set接口  Set是一种不包含重复的元素的Collection,即任意的两个元素e1和e2都有e1.equals(e2)=false,Set最多有一个null元素。  很明显,Set的构造函数有一个约束条件,传入的Collection参数不能包含重复的元素
3 List和Set都是接口。他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。最大的不同就是List是可以重复的。而Set是不能重复的。List适合经常追加数据,插入,删除数据。但随即取数效率比较低。Set适合经常地随即储存,插入,删除。但是在遍历时效率比较低。
4 list,set都是可以使用collections.sort()排序的。

7,ArrayList 与Vector  HashMap 与HashTable

就ArrayList 与Vector 主要从二方面来说.一.同步性:Vector 是线程安全的,也就是说是同步的,而ArrayList 是线程序不安全的,不是同步的二.数据增长:当需要增长时,Vector 默认增长为原来一培,而ArrayList 却是原来的一半。
HashMap 与HashTable 主要从三方面来说。一.历史原因:Hashtable 是基于陈旧的Dictionary 类的,HashMap 是Java 1.2 引进的Map 接口的一个实现二.同步性:Hashtable 是线程安全的,也就是说是同步的,而HashMap 是线程序不安全的,不是同步的三.值:只有HashMap 可以让你将空值作为一个表的条目的key 或value。

6,什么是线程池?

 答:在面向对象编程中,创建和销毁对象是很费时间的,因为创建一个对象要获取内存资源或者其它更多资源。在Java中更是如此,虚拟机将试图跟踪每一个对象,以便能够在对象销毁后进行垃圾回收。所以提高服务程序效率的一个手段就是尽可能减少创建和销毁对象的次数,特别是一些很耗资源的对象创建和销毁,这就是”池化资源”技术产生的原因。线程池顾名思义就是事先创建若干个可执行的线程放入一个池(容器)中,需要的时候从池中获取线程不用自行创建,使用完毕不需要销毁线程而是放回池中,从而减少创建和销毁线程对象的开销。 Java 5+中的Executor接口定义一个执行线程的工具。它的子类型即线程池接口是ExecutorService。要配置一个线程池是比较复杂的,尤其是对于线程池的原理不是很清楚的情况下,因此在工具类Executors面提供了一些静态工厂方法,生成一些常用的线程池,如下所示: - newSingleThreadExecutor:创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。 - newFixedThreadPool:创建固定大小的线程池。每次提交一个任务就创建一个线程,直到线程达到线程池的最大大小。线程池的大小一旦达到最大值就会保持不变,如果某个线程因为执行异常而结束,那么线程池会补充一个新线程。 - newCachedThreadPool:创建一个可缓存的线程池。如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。此线程池不会对线程池大小做限制,线程池大小完全依赖于操作系统(或者说JVM)能够创建的最大线程大小。 - newScheduledThreadPool:创建一个大小无限的线程池。此线程池支持定时以及周期性执行任务的需求。 - newSingleThreadExecutor:创建一个单线程的线程池。此线程池支持定时以及周期性执行任务的需求。  第60题的例子中演示了通过Executors工具类创建线程池并使用线程池执行线程的代码。如果希望在服务器上使用线程池,强烈建议使用newFixedThreadPool方法来创建线程池,这样能获得更好的性能。

5,linux常用命令

见单独日志。

4,MQ消息队列的使用情景,举例说明。

见单独日志。

3,spring boot,spring cloud,dubbo的原理概述?

见单独日志。

2,mysql索引原理?

见单独日志。

1,公司有一万个用户在线,做一个秒杀功能,根据用户抢的速度判定是否中奖,如何解决卡顿?

队列,高并发。

你可能感兴趣的:(javaSE基础,JAVA必会知识点汇总)