面试题整理(2)

1.什么是迭代器?

Iterator接口提供了很多对集合进行迭代的方法。每一个集合类都包含了可以返回迭代器实例的迭代方法。

迭代器可以在迭代过程中删除底层集合的元素,但是不可以直接调用集合的remove(Object obj)删除,可以通过迭代器的remove()方法删除。

2.ArrayList和LinkedList有什么区别?

ArrayList是基于索引的数据接口,它的底层是数组。它可以以O(1)时间复杂度对元素进行随机访问。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况下,查找某个元素的时间复杂度是O(n)。

相对于ArrayList,LinkedList的插入,添加,删除操作速度更快,因为当元素被添加到集合任意位置的时候,不需要像数组那样重新计算大小或者是更新索引。

LinkedList比ArrayList更占内存,因为LinkedList为每一个节点存储了两个引用,一个指向前一个元素,一个指向下一个元素。

3.HashSet和TreeSet有什么区别?

HashSet是由一个hash表来实现的,因此,它的元素的无序的。add(),remove(),contain()方法的时间复杂度是O(1)。

TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。add(),remove(),contains()方法的时间复杂度是O(logn)。

4.数组(Array)和列表(ArrayList)有什么区别?什么时候应该使用Array而不是ArrayList?

Array可以包含基本类型和对象类型,ArrayList只能包含对象类型;

Array的大小是固定的,ArrayList的大小是动态变化的;

ArrayList提供了更多的方法和特性,如:addAll(),removeAll(),iterator()等;

对于基本数据类型,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

5.Java中的两种异常类型是什么?他们有什么区别?

Java中有两种异常:受检查的(checked)异常和不受检查的(unchecked)异常。不受检查的异常不需要在方法或者是构造函数上声明,就算方法或者是构造函数的执行可能会抛出这样的异常,并且不受检查的异常可以传播到方法或者是构造函数的外面。相反,受检查的异常必须要用throws语句在方法或者是构造函数上声明。

6.Java中Exception和Error有什么区别?

Exception和Error都是Throwable的子类。Exception用于用户程序可以捕获的异常情况。Error定义了不期望被用户程序捕获的异常。

7.throw和throws有什么区别?

throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理。而throw则是指抛出的一个具体的异常类型。

throw:就是自己进行异常处理,处理的时候有两种方式,要么自己捕获异常(也就是try catch进行捕捉),要么声明抛出一个异常。throw一旦进入被执行,程序立即会转入异常处理阶段,后面的语句就不再执行,而且所在的方法不再返回有意义的值.

8.请说出ArrayList,Vector, LinkedList的存储性能和特性

ArrayList 和 Vector 都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector 由于使用了 synchronized 方法(线程安全),通常性能上较 ArrayList 差,而LinkedList 使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

9.Set和List的区别

List:列表。
          特点:

     1,有序(存储元素的顺序和取出元素的顺序一致)

     2,该集合中的元素都有索引,所以可以通过索引(角标)来访问元素。 
     3,它可以存储重复元素。 

 常见子类对象:记住:具体的子类对象,我们要学习应该是该对象的特有的数据结构,以及相关的特点。
        |--Vector:jdk1.0就存在了。底层是数组结构的。可变长度数组,
              原理:一旦原数组长度不够,会创建新数组,将原数组的元素复制到新数组中,并将新元素添加到新数组中。
             Vector是同步的。
        |--ArrayList:底层是数组结构,也是支持长度可变数组的。是不同步的。替代了Vector.因为效率高。 查询效率很高。 但是增删的效率很低。
        |--LinkedList:底层是链接列表结构,简称链表结构。是不同步的。这个中结构的好处:对元素的增删非常效率很高。 查询的效率很低。
      Set:集:中的方法和Collection一致,只要重点注意它的子类对象即可。取出元素只能使用迭代器。
       特点:
       1,不包含重复元素。(最大的特点)
       2,这个集合存入元素的顺序和取出元素的顺序不一定一致。(具体的容器对象数据结构不同,顺序也有不同)
       |--HashSet:底层数据结构是哈希表,不保证顺序,是不同步的。
           哈希表:提供数组的查询效率而出现的。
          将要存储的元素先通过哈希算法算出一个哈希值来标识存储的位置,代表着元素。要找元素时,先将该元素通过哈希算法算出哈希值,在通过哈希值到哈希表中去查找。
           特点:
            1,不关系元素的顺序。
            2,提高了查询效率。
             3,不可能出现重复元素,因为哈希值都不同。即使相同,会再次判断两个元素的equals,内容是否相同。
            如果内容也相同,不存,如果内容不同,存储。所以哈希表要保证元素的唯一性,必须要依赖于两个方法。
            1,hashCode 2,equals                
       |--TreeSet:可以给Set集合中的元素进行指定顺序的排序。非同步的。 
            默认情况下,是通过元素的自然顺序排的序。
           它保证元素唯一性的依据是看比较方法的返回结果是否是0.是0.就视为元素相同。不存。
         TreeSet排序的方式一:让元素自身具备比较性,需要实现Comparable接口,覆盖compareTo方法。这种比较方式成为自然顺序排序。如果元素自身不具备比较性或者具备的比较性(自然顺序)不是所需要的。
            这时只能用第二种方式 。
            TreeSet排序的方式二:让容器自身具备比较性。容器一初始化就具备了比较功能。因为容器时在对象构造时完成的。通过查阅,有一个构造方法TreeSet(Comparator).在容器初始化时可以指定一个比较器。 需要实现Comparator接口,覆盖compare方法即可。所以这种方式成为比较器排序。 当存入的的对象有重复时,用List,没有重复元素时,用Set

猜你喜欢

转载自www.cnblogs.com/sueyyyy/p/9260992.html
今日推荐