Java常见笔试和面试题(二)

mac2022-06-30  26

Java常见笔试和面试题(二)

1.Collection和Collections的区别:

Collection是集合类的上级接口,是所有单值集合的父接口,继承它的有关接口主要有List和Set。Collections是针对集合类的一个帮助类,它提供一系列静态方法实现对各种集合的搜索、排序、线程安全等操作。

2.List和Set的区别

List接口是Collection的子接口,表示元素有序可重复的集合。Set接口是Collection的子接口,表示元素无序不可重复的集合。

3.ArrayList和LinkedList的区别?ArrayList和Vector的区别?

ArrayList和LinkedList都是List接口的实现类,表示元素有序可重复的单值集合。 ArrayLIst是基于数组的实现,元素的查询和修改的效率较高,但是元素的插入和删除的效率较低。 LinkedList是基于链表的实现,元素的插入和删除的效率较高,但是元素的查询和修改的效率较低。ArrayList和Vector都是List接口的实现类,表示元素有序可重复且基于数组实现的单值集合。 ArrayList没有实现线程同步,是线程非安全的, Vector实现了线程同步,是线程安全的。

4.HashMap的存储机制,ConcurrentHashMap的锁机制

HashMap的存储机制

创建一个HashMap集合时,默认创建一个初始长度为16的数组。(它的加载因子是0.75)当我们往HashMap集合中添加键值对的时候,首先根据键的Hash码除以数组的长度取余来确定键值对在HashMap中的位置。(hash码的算法见博主的另一篇博客默认的HashCode值的运算方式)当这个位置已经有值时,以链表的结构存储。在jdk1.8中,当链表的长度大于8时,将链表结构转换为红黑树进行存储。

ConcurrentHashMap的锁机制

在HashMap的基础上加入锁机制,即创建的map的初始数组中每个元素为一个区块,当线程A对当前键值对进行操作时,只会锁住当前区块,不会影响其他线程对其他区块的操作,提高了map在多线程并发操作时的效率。 在jdk1.8中ConcurrentHashMap与HashMap的数据结构基本一致,只是增加了同步的操作来控制并发。

5.集合元素排序(TreeSet)

有两种排序方式:1,自然排序 2,比较器排序 自然排序:在元素类中定义排序规则。 比较器排序:给TreeSet集合指定比较器,根据提供的比较器进行排序。

6.HashMap与Hashtable的区别

同步性:hashtable的方法是同步的,hashMap的方法不是同步的。继承的父类不同,HashMap是继承自Dictionary类,而Hashtable继承自AbstractMap类,但是他们都实现了map,Cloneable(可复制),Serializable(可序列化的)这三个接口。对null key和null value的支持不同,Hashtable不允许使用null key和null value,而HashMap允许使用null key和null value,当然这样的键只能有一个,可以有一个或多个键所对应的值为null。遍历方法不同,Hashtabble使用Enumeration进行遍历,HashMap使用Iterator进行遍历。初始化和扩容方式不同,Hashtable默认初始 大小为11,之后每次扩充容量变为原来的zn+1。HashMap默认初始大小为16,之后每次扩充,容量变为原来的两倍。计算Hash值的方法不同,Hashtable直接使用key的hashCode值,然后使用除留余数法来确定最终的位置。HashMap先是通过key计算得到hash值,再通过hash值算出最终的位置。

7.BIO和NIO的区别

BIO以字节为单位进行数据的读写,同一时刻只能处理一个字节,容易发生阻塞。NIO以块为单位进行数据的读写,同一时刻可以处理多个字节,速度比BIO快。NIO是非阻塞的IO。

8.线程类创建的两种方式

通过继承Thread类。通过实现Runnable接口。

9.线程的属性:优先级,守护线程

线程优先级

线程是具有优先级的,优先级高的线程比优先级低的线程具有更多的执行机会,而不是优先级高的先执行,优先级低的后执行。优先级一共有10级,最低1级,最高10级,默认5级。

守护线程 线程分为两类:用户线程和守护线程。用户线程是具有独立业务流的线程,守护线程为用户线程提供服务。 当所有用户线程都执行结束,即使守护线程线程体没有执行完也会停止。 如果有任何一个用户线程没有执行完,即使守护线程结束了也不会停止,进入等待状态,直到最后一个用户线程执行结束。

10.线程的状态及转换关系

11.线程的阻塞事件:sleep wait() join

sleep 让当前线程进入阻塞状态,休眠指定的时间后自动解除阻塞。wait() 让当前线程进入休眠状态,直到有其他线程调用notify进行唤醒,wait()方法必须在实现了同步的代码块中进行调用。join 在B线程中执行A.join(),指的是让B线程进入阻塞状态,直到A线程执行结束,B线程解除阻塞。

12.线程池

当线程的数量很多,并且每个线程执行结束就销毁,这样频繁创建和销毁线程会大大降低系统的效率。 线程池就是一个线程的容器,通过线程池对线程进行管理,当线程池收到任务时,首先会调用线程池中已经存在的线程处理任务,如果没有空闲线程会创建新的线程,当线程使用完成后也不会立即销毁,而是放入线程池中以备下次使用。

13.生产者和消费者

14.数据库连接池

数据库连接池是一个装有很多连接的一个容器,使用连接的时候可以直接从连接池中获取,使用完成后归还给连接池。

15.数据库事务四大特性,隔离级别,脏读/不可重复读/幻读

事务的特性 a)原子性,一个事务中的多个步骤要么全部完成,要么全部不做。 b)一致性,在事务开始之前和事务完成之后,数据库中的数据的完整性和一致性不能被破坏。 c)隔离性,数据库允许多个事务并发,但是多个事务之间不能相互交叉执行导致数据不一致,多个并行的事务之间不能互相影响。 d)持久性,事务完成后,对数据的操作是永久的。

隔离级别 读未提交,就是一个事务可以读取另一个事务未提交的数据。 读已提交,就是一个事务要等另一个事务提交后才可以读取数据。 重复读,就是在开始读取数据时,不再允许修改操作。 序列化,最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读,不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

不同的隔离级别的事务并发时可能出现的问题 脏读,T1事务读取了T2事务未提交的数据。 不可重复读,在一次事务中两次读取的数据不一致。 幻读,如第一个事务对表中的数据进行了修改,这种修改涉及到表中的全部的数据行,同时第二个事务向表中插入了一行新数据,那么第一个用户发现表中还有没有修改的数据行 ,就像发生了幻觉一样。

16.JSP九大内置对象

1.request 2.response 3.session 4.application 5.out 6.page 7.config 8.exception 9.pageContext

17.请求跳转和重定向跳转的区别

请求跳转特点:一次请求,浏览器地址不变,传输的数据不会丢失。 重定向跳转特点:二次请求,浏览器地址发生变化,传输的数据会丢失。

18.MVC思想

MVC就是把代码分成三块,第一块view表示视图,第二块model表示模型,第三块controller表示控制器。

view是程序中负责生成用户界面的部分,也是整个mvc架构中用户唯一可以看到的一层,接收用户的输入,显示处理结果。model是程序的主体部分,所有的业务逻辑都写在该层。controller是根据用户的输入,控制用户界面的数据显示,更新model对象状态的部分。

19.MyBatis缓存机制,延迟加载

缓存机制 MyBatis有一级缓存和二级缓存。 一级缓存是SqlSession级别的缓存,只要SqlSession没有刷新和关闭,它就存在。 二级缓存是mapper映射级别的缓存,多个SqlSession可以操作同一个mapper映射的sql语句,多个SqlSession可以共用一个二级缓存,二级缓存是跨SqlSession的。

延迟加载 就是在需要用到数据时才进行加载,不需要用到数据就不加载数据,延迟加载也称懒加载。

20.Spring,IoC和AOP

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架,用于解决企业应用开发的复杂性问题。 IoC:Spring通过一种称作控制反转(IoC)的技术促进了松耦合,当应用了IoC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或查找依赖对象。 AOP:Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。

21.SpringMVC的执行流程和原理

1.客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet 。 2. DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。 3-4. DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。 5、Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。 6、Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过ViewResolver将逻辑视图转化为真正的视图View。 7、Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。

最新回复(0)