常见Java笔面试题集(三)

常见Java笔面试题集(三)

1.Java集合类框架的基本接口有哪些?

答:Java集合类提供了一套设计良好的,支持对一组对象进行操作的接口和类。Java集合类里面最基本的接口有:

  1. Collection:代表一组对象,每一个对象都是它的子元素。
  2. Set:不包含重复元素,不记录元素添加顺序的Collection
  3. List:可以包含重复元素,且记录元素添加顺序的Colection
  4. 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到新的数组上面。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值