1.Java集合类框架的基本接口有哪些?
答:Java集合类提供了一套设计良好的,支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:
- Collection:代表一组对象,每一个对象都是它的子元素。
- Set:不包含重复元素,不记录元素添加顺序的Collection
- List:可以包含重复元素,且记录元素添加顺序的Colection
- Map:可以把键(Key)映射到值(Value)得对象,键不能重复
2.Serializable接口与Enternalizable 接口区别
答:Serializable接口是序列化Java类的接口,以便它们可以在网络上传输或者将它们保存在磁盘上,是JVM内嵌的默认序列化方式,成本高,不安全。Enternalizable 接口继承自Serializable,定义了两个方法,序列化时自动调用writeExternal,反序列化时自动调用readExternal,可以自定义需要序列化的属性,以及属性的初始化。对于Serializable对象是完全以它存储的二进制位为基础来构造,而不是通过构造器构造的,对于Enternalizable对象会通过默认无参构造函数初始化构造对象。
3.final,finally,finalize的区别
final用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,类不可继承。
finally是异常处理语句结构的一部分,无论是否异常该部分代码总是执行。
finalize是Object类的一个方法,在垃圾收集器执行的时候会调用被回收对象的此方法。
4.String 和StringBuffer,StringBuilder的区别
答:String属于不可变类,需重新创建字符串,String类的内容一旦申明就不可改变。而StringBuilder和StringBuffer是可变类,原字符串基础上生成字符串,内容可以修改。StringBuffer是从JDK1.0时提供的,因为方法上有synchronized关键字,属于线程安全的操作,是同步操作。StringBuilder是从JDK1.5出现的,线程不安全,是异步操作,但效率高。
5.HashMap和Hashtable的区别
答:它们都是通过key-value的方法来存储数据的,不同之处主要有以下三点:
1. HashMap是Java本身Map(java.util.Map)接口的一个实现,而Hashtable是基于旧的Dictionary类的;
2. HashMap是非线程安全的,更适用于单线程环境,而Hashtable线程安全,适用于多线程环境;
3. HashMap可以允许空值作为key或value,但是只允许一个空的key,value可以多个为空;Hashtable不允许空值作为键或值;
6. 简述HashMap的工作原理
答:HashMap是基于哈希表的Map接口的非同步实现,是一个“链表散列”的数据结构,即数组和链表的结合体。使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket(桶)位置来储存Entry对象。
简单说其实就是:当向集合中put元素时,会根据key的hashcode()计算出hash值,然后根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
7.hashcode()方法和equals()方法的重要性体现在哪里?
答:当程序试图将一个key-value对放入HashMap中时,程序首先根据该 key的 hashCode() 返回值决定该 Entry 的存储位置:如果两个 Entry 的 key 的 hashCode() 返回值不同,则将元素存入集合中,如果两个 Entry 的 key 的 hashCode() 返回值相同,那它们的存储位置相同,再去比较equals。如果这两个 Entry 的 key 通过 equals 比较返回 true,新添加 Entry 的 value 将覆盖集合中原有 Entry的 value,但key不会覆盖。如果这两个 Entry 的 key 通过 equals 比较返回 false,新添加的 Entry 将与集合中原有 Entry 形成 Entry 链,而且新添加的 Entry 位于 Entry 链的头部。通过这种方式就可以高效的解决HashMap的冲突问题。
8.Array和ArrayList的区别
答:Array可以包含基本数据类型和对象类型,而ArrayList只能包含对象类型;
Array大小是固定的,ArrayList的大小是动态固定的;ArrayList提供了更多的方法和特性,比如addAll(),removeAll(),iterator()等等。
9.ArrayList和LinkedList有什么区别?
答:ArrayList和LinkedList都实现了List接口。
ArrayList是基于索引的数据接口,它的底层是数组,可以以O(1)的时间复杂度对元素进行随机访问。LinkedList是以元素列表的形式存储数据,每一个元素都和它的前一个元素和后一个元素链接在一起,查找某个元素的时间复杂度为O(n);
相对于ArrayList,LinkedList的插入,添加,删除操作速度快,因为元素插入到集合任意位置时,不需要像数组那样重新计算大小或者更新索引位置。
LinkedList比ArrayList更占用内存,因为LinkenList为每一个节点存储了两个引用,一个指向前一个元素,一个指向后一个元素。
10.ArrayList和Vector有何异同点
答:相同点:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,,并且其中的数据是允许重复的。
不同点:1. Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程不安全的,它的方法之间是线程不同步的。2. Vector默认的正常一般数组的长度,而ArrayList默认是50%,ArraryList默认长度是10,当超出它的长度范围,会创建一个新的数组,同时将旧数组的全部内容copy到新的数组上面。