Java 最常见的 208 道面试题(18-34) -- 容器部分

18.java 容器都有哪些?

     数组,String, java.util下的集合容器
        数组长度限制为integer.integer.MAX_VALUE;
        String的长度限制:底层是char数组,长度Integer.MAX_VALUE
        java.util下的集合容器
                  Collection
                          - set
                                   - HashSet
                                           - LinkedHashSet
                                   - TreeSet
                          - list
                                   - ArrayList
                                   - LinkedList
                                   - Vector
                 Map
                                - HashMap
                                        - LinkedHashMap
                                - HashTable
                                - TreeMap

19.Collection 和 Collections 有什么区别?

    Collection是集合的接口
    Collections是集合的工具类

20.List、Set、Map 之间的区别是什么?

    List的元素以线性方式存储,可以存放重复对象
    Set中的对象不按照特定的方式排序,没有重复的对象
    Map存放的是键值对,每个元素都有一个键对象和值对象

21.HashMap 和 Hashtable 有什么区别?

    HashMap       HashTable
    非线程安全       线程安全
    允许空键值对
    继承自Dictionary类   Map interface的实现

22.如何决定使用 HashMap 还是 TreeMap?

     TreeMap的Key值是要求实现java.lang.Comparable,默认按照key值升序排列的,TreeMap的实现基于红黑树结构
     HashMap的Key值实现散列hashCode(),分布是散列的均匀分布,不支持排序,数据结构主要使数组,链表或者红黑树
     查询的时候用HashMap,增加,快速创建的时候用TreeMap
     需要排序就是用TreeMap,不需要就使用HashMap

23.说一下 HashMap 的实现原理?

     HashMap基于hashing原理,通过put()和get()存储和获取对象,当我们把键值传递给put方法时,调用键对象的
     hashCode()方法计算hashcode,然后找到位置存贮值对象,获取对象时,同通过键对象的equal()方法找到正确的键值,
     返回值对象,hashcode采用链表来解决碰撞问题,如果发生碰撞,对象会储存在链表的下一个节点中,HashMap在每个链表  节点中存储键值对象

24.说一下 HashSet 的实现原理?

     HashSet底层由HashMap实现
     HashSet的值存放于HashMap的key上
     HashMap的value统一为PRESENT

25.ArrayList 和 LinkedList 的区别是什么?

     ArrayList是实现了基于动态数组的数据结构,LinkedList是基于链表的数据结构
     对于随机访问get和set,ArrayList优于LinkedList
     对于新增或删除操作,LinkedList比较占优势

26.如何实现数组和 List 之间的转换?

     List转为数组 : toArray(arraylist.size())
     数组转换为List : asList(a)

27.ArrayList 和 Vector 的区别是什么?

     ArrayList是非线程同步的,Vector是线程同步的,如果不考虑线程安全的情况下ArrayList效率较高
     ArrayList存储的元素超过他的初始化大小的时候增长量是50%,Vector是100%,大批量数据存储Vector效率高一些

28.Array 和 ArrayList 有何区别?

     Array效率高,但是容量固定且无法动态改变
     ArrayList容量可动态增长,但是牺牲效率
     ArrayList相当于一个可以增长的Array

29.在 Queue 中 poll()和 remove()有什么区别?

     相同点:都是返回一个元素,并在队列中删除返回的对象
     不同点:如果没有元素pool()会返回一个null,而remove()会抛出一个NoSuchElementException异常

30.哪些集合类是线程安全的?

     Vector, HashTable, stack

31.迭代器 Iterator 是什么?

为了方便处理集合中的元素,java中设置了一个对象,提供了一些方法专门处理集合中的元素。对Collection进行迭代的类,称为迭代器

32.Iterator 怎么使用?有什么特点?

.hasNext()判断是否有下一个元素
     next() 下一个元素
     remove()  删除迭代器返回的最后一个元素
     forEachRemaining() 遍历所有元素

     特点: **Iterator遍历集合元素过程中不允许线程对集合元素进行修改,否则会抛出ConcurrentModificationException异常
               遍历过程中可以通过remove移除集合中的元素
               Iterator必须依附在某个Collection对象而存在,本身无装载数据对象的功能
               remove方法移除的是上一次next方法返回的对象
               next()通过游标指向的形式返回Iterator下一个元素

33.Iterator 和 ListIterator 有什么区别?

     ListIterator 继承 Iterator
     ListIterator 比Iterator方法多
         add() 将指定元素插入列表
         set() 迭代器返回的最后一个元素替换参数e
         hasPrevious() 迭代器当前的位置,反向遍历集合是否含有元素
         previous() 迭代器当前位置,反向遍历集合,下一个元素
         previousIndex() 迭代器当前位置,反向遍历集合, 返回下一个元素的坐标
         nextIndex() 迭代器当前的位置,返回下一个元素的下标
     Iterator适用所有集合,ListIterator只能用于List及其子类
     ListIterator可以add对象
     ListIterator可以反向遍历
     ListIterator可以定位当前索引位置
     ListIterator可以实现对list的修改,Iterator只能遍历,无法修改

34.怎么确保一个集合不能被修改?

    java.util.Collection类中的 unmodifiable**方法赋值原集合
        例如:
          static List<String> list = new ArrayList<String>();
          list = Collection.unmodifiableList(list);

发布了13 篇原创文章 · 获赞 1 · 访问量 1520

猜你喜欢

转载自blog.csdn.net/qq_42029989/article/details/104857139