面试题常见问题的区分!

1.HashMap和HashTable区别

1).HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。

2).HashTable不允许null值(key和value都不可以) ;HashMap允许null值(key和value都可以)。

3).HashTable有一个contains(Object

value)功能和containsValue(Object

value)功能一样。

4).HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。

5).HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。

6).哈希值的使用不同,HashTable直接使用对象的hashCode; HashMap重新计算hash值,而且用与代替求模。

2.ArrayList和vector区别

ArrayList和Vector都实现了List接口,都是通过数组实现的。

Vector是线程安全的,而ArrayList是非线程安全的。

List第一次创建的时候,会有一个初始大小,随着不断向List中增加元素,当List 认为容量不够的时候就会进行扩容。Vector缺省情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%。

3.ArrayList和LinkedList区别及使用场景

区别

ArrayList底层是用数组实现的,可以认为ArrayList是一个可改变大小的数组。随着越来越多的元素被添加到ArrayList中,其规模是动态增加的。

LinkedList底层是通过双向链表实现的, LinkedList和ArrayList相比,增删的速度较快。但是查询和修改值的速度较慢。同时,LinkedList还实现了Queue接口,所以他还提供了offer(),

peek(), poll()等方法。

使用场景

LinkedList更适合从中间插入或者删除(链表的特性)。

ArrayList更适合检索和在末尾插入或删除(数组的特性)。

4.Collection和Collections的区别

java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。

java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。

5.Concurrenthashmap实现原理

参见vip课程

6.Error、Exception区别

Error类和Exception类的父类都是throwable类,他们的区别是:

Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。

Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。

7.Unchecked

Exception和Checked Exception,各列举几个#

Unchecked Exception:

a. 指的是程序的瑕疵或逻辑错误,并且在运行时无法恢复。

b. 包括Error与RuntimeException及其子类,如:OutOfMemoryError,

UndeclaredThrowableException, IllegalArgumentException,

IllegalMonitorStateException, NullPointerException, IllegalStateException,

IndexOutOfBoundsException等。

c. 语法上不需要声明抛出异常。

Checked Exception:

a. 代表程序不能直接控制的无效外界情况(如用户输入,数据库问题,网络异常,文件丢失等)

b. 除了Error和RuntimeException及其子类之外,如:ClassNotFoundException,

NamingException, ServletException, SQLException, IOException等。

c. 需要try catch处理或throws声明抛出异常。

8.Java中如何实现代理机制(JDK、CGLIB)

JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口。

CGLIB动态代理:代理类是目标类的子类,用到MethodInterceptor接口。

9.多线程与死锁

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

产生死锁的原因:

一.因为系统资源不足。

二.进程运行推进的顺序不合适。

三.资源分配不当。

10.如何才能产生死锁

产生死锁的四个必要条件:

一.互斥条件:所谓互斥就是进程在某一时间内独占资源。

二.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。

三.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。

四.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

11.死锁的预防

打破产生死锁的四个必要条件中的一个或几个,保证系统不会进入死锁状态。

一.打破互斥条件。即允许进程同时访问某些资源。但是,有的资源是不允许被同时访问的,像打印机等等,这是由资源本身的属性所决定的。所以,这种办法并无实用价值。

二.打破不可抢占条件。即允许进程强行从占有者那里夺取某些资源。就是说,当一个进程已占有了某些资源,它又申请新的资源,但不能立即被满足时,它必须释放所占有的全部资源,以后再重新申请。它所释放的资源可以分配给其它进程。这就相当于该进程占有的资源被隐蔽地强占了。这种预防死锁的方法实现起来困难,会降低系统性能。

三.打破占有且申请条件。可以实行资源预先分配策略。即进程在运行前一次性地向系统申请它所需要的全部资源。如果某个进程所需的全部资源得不到满足,则不分配任何资源,此进程暂不运行。只有当系统能够满足当前进程的全部资源需求时,才一次性地将所申请的资源全部分配给该进程。由于运行的进程已占有了它所需的全部资源,所以不会发生占有资源又申请资源的现象,因此不会发生死锁。

四.打破循环等待条件,实行资源有序分配策略。采用这种策略,即把资源事先分类编号,按号分配,使进程在申请,占用资源时不会形成环路。所有进程对资源的请求必须严格按资源序号递增的顺序提出。进程占用了小号资源,才能申请大号资源,就不会产生环路,从而预防了死锁。

12.Java中的NIO,BIO,AIO分别是什么

BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中,JDK1.4以前的唯一选择,但程序直观简单易理解。

NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,JDK1.4开始支持。

AIO:异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理.AIO方式使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,JDK7开始支持。

IO和NIO区别

一.IO是面向流的,NIO是面向缓冲区的。

二.IO的各种流是阻塞的,NIO是非阻塞模式。

三.Java NIO的选择器允许一个单独的线程来监视多个输入通道,你可以注册多个通道使用一个选择器,然后使用一个单独的线程来“选择”通道:这些通道里已经有可以处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。

13.序列化与反序列化

把对象转换为字节序列的过程称为对象的序列化。

把字节序列恢复为对象的过程称为对象的反序列化。

对象的序列化主要有两种用途:

一.把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中;

二.在网络上传送对象的字节序列。

当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。

14.常见的序列化协议有哪些

Protobuf, Thrift, Hessian, Kryo

15.内存溢出和内存泄漏的区别

内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory。

内存泄漏是指分配出去的内存不再使用,但是无法回收。

16.Java内存模型及各个区域的OOM,如何重现OOM

这部分内容很重要,详细阅读《深入理解Java虚拟机》,也可以详细阅读这篇文章(博客园见)

17.出现OOM如何解决

一. 可通过命令定期抓取heap dump或者启动参数OOM时自动抓取heap dump文件。

二. 通过对比多个heap dump,以及heap dump的内容,分析代码找出内存占用最多的地方。

三. 分析占用的内存对象,是否是因为错误导致的内存未及时释放,或者数据过多导致的内存溢出。



作者:欧阳海阳
链接:https://www.jianshu.com/p/403f6898cea8
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

猜你喜欢

转载自www.cnblogs.com/DreamRecorder/p/9244100.html
今日推荐