Java工程师常见面试题集锦(二)

11.HashTable与HashMap的区别

1)同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的。

2)HashMap允许存在一个为null的key,多个为null的value 。

3)hashtable的key和value都不允许为null。

12.如何解决HashMap的线程不安全问题

1)替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率比较低

2)使用Collections类的synchronizedMap方法包装一下。方法如下:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 返回由指定映射支持的同步(线程安全的)映射

3)使用ConcurrentHashMap,它使用分段锁来保证线程安全

通过前两种方式获得的线程安全的HashMap在读写数据的时候会对整个容器上锁,而ConcurrentHashMap并不需要对整个容器上锁,它只需要锁住要修改的部分就行了

13.Collection 和 Collections 的区别

Collection 是 java.util 下的接口,它是各种集合的父接口,继承于它的 接口主要有 Set 和 List;Collections 是个 java.util 下的类,是针对集合的 帮助类,提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作 。

Java工程师常见面试题集锦(一)互联网人必看!

https://blog.csdn.net/CSDNedu/article/details/85602533

如果觉得文字学习较慢,也可以跟着老师一起视频学习:

Java面试题视频学习链接:https://edu.csdn.net/course/detail/10533

14. List、Map、Set 三个接口,存取元素时,各有什么特点

List 以特定次序来持有元素,可有重复元素。

Set 无法拥有重复元素,内部 排序。

Map 保存 key-value 值,value 可多值。

15.Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还 是 equals()? 它们有何区别?

Set 里的元素是不能重复的,用 equals ()方法来区分重复与否。

覆盖 equals()方法用来判断对象的内容是否相同,而”==”判断地址是否相等,用来 决定引用值是否指向同一对象。

16.TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素

TreeSet要求存放的对象所属的类必须实现Comparable接口,该接口提供了比较元素的compareTo()方法,当插入元素时会回调该方法比较元素的大小。 TreeMap要求存放的键值对映射的键必须实现Comparable接口从而根据键对元素进行排序。 Collections工具类的sort方法有两种重载的形式,第一种要求传入的待排序容器中存放的对象比较实现Comparable接口以实现元素的比较;第二种不强制性的要求容器中的元素必须可比较,但是要求传入第二个参数,参数是Comparator接口的子类型(需要重写compare方法实现元素的比较),相当于一个临时定义的排序规则,其实就是是通过接口注入比较元素大小的算法,也是对回调模式的应用。

17.Map集合

实现类:HashMap、Hashtable、LinkedHashMap和TreeMap

HashMap是最常用的Map,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,遍历时,取得数据的顺序是完全随机的。因为键对象不可以重复,所以HashMap最多只允许一条记录的键为Null,允许多条记录的值为Null,是非同步的。

Hashtable与HashMap类似,是HashMap的线程安全版,它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢,它继承自Dictionary类,不同的是它不允许记录的键或者值为null,同时效率较低。

ConcurrentHashMap,线程安全,并且锁分离。ConcurrentHashMap内部使用段(Segment)来表示这些不同的部分,每个段其实就是一个小的hash table,它们有自己的锁。只要多个修改操作发生在不同的段上,它们就可以并发进行。

LinkedHashMap保存了记录的插入顺序,在用Iteraor遍历LinkedHashMap时,先得到的记录肯定是先插入的,在遍历的时候会比HashMap慢,有HashMap的全部特性。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。不允许key值为空,非同步的。

18.ArrayList扩容机制【必考】

1)发生扩容的条件:

根据传入的最小需要容量minCapacity来和数组的容量长度对比,若minCapactity大于或等于数组容量,则需要进行扩容。(如果实际存储数组是空数组,则最小需要容量就是默认容量)

2)实现扩容:

jdk7中采用>>位运算,右移动一位。 容量相当于扩大了1.5倍;

3)举例说明:添加20个元素到ArrayList中

当第一次插入元素时才分配10(默认)个对象空间。之后扩容会按照1.5倍增长。

也就是当添加第11个数据的时候,Arraylist继续扩容变为10*1.5=15;

当添加第16个数据时,继续扩容变为15 * 1.5 =22个

19.Java 中的异常处理机制的简单原理和应用

当 JAVA 程序违反了 JAVA 的语义规则时,JAVA 虚拟机就会将发生的错误表 示为一个异常。违反语义规则包括 2 种情况。一种是 JAVA 类库内置的语义检查。 例如数组下标越界,会引发 IndexOutOfBoundsException;访问 null 的对象时会 引发 NullPointerException。另一种情况就是 JAVA 允许程序员扩展这种语义检 查,程序员可以创建自己的异常,并自由选择在何时用 throw 关键字引发异常。 所有的异常都是 java.lang.Thowable 的子类。

20.编程题:写一个Singleton示例

Singleton:在Java中即指单例设计模式,它是软件开发中最常用的设计模式之一。

单:唯一;例:实例,单例设计模式,即某个类在整个系统中只能有一个实例对象可被获取和使用的代码模式。

例如:代表JVM运行环境的Runtime类

要点:一是某个类只能有一个实例:u构造器私有化;

二是它必须自行创建这个实例:u含有一个该类的静态变量来保存这个唯一的实例;

三是它必须自行向整个系统提供这个实例:u对外提供获取该实例对象的方式:(1)直接暴露(2)用静态变量的get方法获取

几种常见形式:

1)饿汉式:直接创建对象,不存在线程安全问题

直接实例化饿汉式(简洁直观)

枚举式(最简洁)

静态代码块饿汉式(适合复杂实例化)

2)懒汉式:延迟创建对象

线程不安全(适用于单线程)

线程安全(适用于多线程)

静态内部类形式(适用于多线程)

相关推荐