• 菜鸟刷面试题(五、Java容器篇)


    目录:

    • java 容器都有哪些?
    • Collection 和 Collections 有什么区别?
    • List、Set、Map 之间的区别是什么?
    • HashMap 和 Hashtable 有什么区别?
    • 如何决定使用 HashMap 还是 TreeMap?
    • 说一下 HashMap 的实现原理?
    • 说一下 HashSet 的实现原理?
    • ArrayList 和 LinkedList 的区别是什么?
    • 如何实现数组和 List 之间的转换?
    • ArrayList 和 Vector 的区别是什么?
    • Array 和 ArrayList 有何区别?
    • 在 Queue 中 poll()和 remove()有什么区别?
    • 哪些集合类是线程安全的?
    • 迭代器 Iterator 是什么?
    • 怎么确保一个集合不能被修改?

    java 容器都有哪些?

    Collection、Map:

    Collection:

    • List:有序集合。
      • ArrayList:基于数组实现的有序集合。
      • LinkedList:基于链表实现的有序集合。
      • Vector:矢量队列
    • Set:不重复集合。
      • HashSet:基于hash实现的不重复集合,无序。
        • LinkedHashSet:基于hash实现的不重复集合,有序。
      • SortedSet:可排序不重复集合。
        • NavigableSet:可导航搜索的不重复集合。
        • TreeSet:基于红黑树实现的可排序不重复集合。
    • Queue:队列。
      • BlokingQueue:阻塞队列。
      • Deque:可两端操作线性集合。

    Map:键值映射集合。

    • HashMap:类似Hashtable,但方法不同步key、value可为null
      • LinkedHashMap:根据插入顺序实现的键值映射集合。
    • Hashtable:基于哈希表实现的键值映射集合,key、value均不可为null
    • IdentityHashMap:基于哈希表实现的键值映射集合,两个key引用相等==,认为是同一个key
    • SortedMap:可排序键值映射集合。
      • NavigableMap:可导航搜索的键值映射集合。
    • WeakHashMap:弱引用建,不阻塞被垃圾回收器回收,key回收后自动移除键值对。

    Collection 和 Collections 有什么区别?

    Collection是java有序集合中最根本的接口定义,Collections是java有序集合的工具类

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

    List:有序集合,元素可重复。

    Set:元素不能重复,LinkedList按照元素插入数据排序,SortedSet可排序,HashSet无序。

    Map:键值对集合,key无序且唯一,value不要求有序且允许重复。

    HashMap 和 Hashtable 有什么区别?

    • 线程安全:HashMap线程不安全;Hashtable线程安全。
    • 允许有null值:HashMap允许key、value为null;Hashtable不允许key、value为null。
    • 迭代器:HashMap的Iterator是fail-fast迭代器;Hashtable还使用了enumerator迭代器。
    • hash的计算方式:HashMap计算了hash值;Hashtable使用了key的hashCode方法。
    • 默认容器大小和扩容方式:HashMap默认初始大小16,容量必须是2的整数次幂,扩容时将容量变为原来的2倍;Hashtable默认初始大小11,扩容时将容量变为原来的2倍加1。
    • contains方法:HashMap没有contains方法;Hashtable包含contains方法,类似于containsValue。
    • 父类:HashMap继承自AbstractMap;Hashtable继承自Dictionary。

    如何决定使用 HashMap 还是 TreeMap?

    HashMap基于数组和链表,TreeMap基于红黑树。

    因HashMap不支持排序,而TreeMap默认按照key升序排序的,所以在没有排序要求的情况下使用HashMap会有更好的性能。

    说一下 HashMap 的实现原理?

    1.8以前HashMap使用的是数组+链表的方式实现,首先它会拿到key值计算hash值,确认hash值后再将数据放到对应的槽中。

    既然是计算hash值来找槽的话,那必然就会有hash冲突,java中解决hash冲突是采用链表的方式,也就是说具有向hash值key会放到同一个链表中。

    而当HashMap数据过大的话势必会产生链表长度多大,导致访问数据过慢。

    所以在1.8+的HashMap会在链表长度超过8的时候,将链表转为红黑树

    说一下 HashSet 的实现原理?

    HashSet 是基于 HashMap 实现的,查询速度特别快。

    ArrayList 和 LinkedList 的区别是什么?

    实现:ArrayList基于动态数组;LinkedList基于链表。

    随机访问:ArrayList随机访问速度快(下标访问);LinkedList随机访问速度慢(链表需要遍历全表)。

    插入、删除数据:ArrayList插入删除会移动数组速度慢;LinkedList只需改变前后链表的引用速度快。

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

    array to list:Arrays.asList();

    list to array:List.toArray();

    ArrayList 和 Vector 的区别是什么?

    相同点:

    • 都基于数组实现,动态扩容。
    • 功能相同,操作方法类似。

    区别:

    • ArrayList是线程不安全的,Vector是线程安全的;ArrayList性能优于Vector。
    • 默认容器大小都是10,ArrayList扩容50%,Vector扩容一倍且可指定扩容大小。

    Array 和 ArrayList 有何区别?

    Array是数组,ArrayList是Array的扩展,实现了动态扩容。

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

    remote未找到元素会抛出异常,poll未找到只会返回null。

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

    • Vector
    • Stack
    • Hashtable
    • java.util.concurrent 包下所有的集合类 ArrayBlockingQueue、ConcurrentHashMap、ConcurrentLinkedQueue、ConcurrentLinkedDeque...

    迭代器 Iterator 是什么?

    用于顺序访问集合对象的元素,无需知道集合对象的底层实现。

    优点:Iterator 是可以遍历集合的对象,为各种容器提供了公共的操作接口,隔离对容器的遍历操作和底层实现,从而解耦。

    缺点:缺点是增加新的集合类需要对应增加新的迭代器类,迭代器类与集合类成对增加。

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

    使用Collections.unmodifiableList()方法。

    public class TestCollectionUnmodify {
     
        static List<String> list = new ArrayList<String>();
        static Set<String> set = new HashSet<String>();
        static Map<String, String> map = new HashMap<String, String>();
        
        static {
            list.add("1");
            list.add("2");
            list.add("3");
            
            set.add("1");
            set.add("2");
            set.add("3");
            
            map.put("1", "1");
            map.put("2", "2");
            map.put("3", "3");
        }
        
        public static void main(String[] args) {
            list = Collections.unmodifiableList(list);
            set = Collections.unmodifiableSet(set);
            map = Collections.unmodifiableMap(map);
            listModify();
            setModify();
            mapModify();
        }
        
        public static void listModify() {
            list.add("4");
        }
        
        public static void setModify() {
            set.add("4");
        }
        
        public static void mapModify() {
            map.put("3", "4");
        }
    }
  • 相关阅读:
    很多网络库介绍
    CFileFind
    C#编写COM组件
    使用javascript调用com组件
    C++ 解析Json——jsoncpp
    休眠与开机自动运行等VC代码
    win7 vs2012/2013 编译boost 1.55
    VC中的字符串转换宏
    InstallShield 静默安装
    CAD版本 注册表信息
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12082148.html
Copyright © 2020-2023  润新知