美文网首页程序员
Java中List、Set和Map的区别

Java中List、Set和Map的区别

作者: Funk_V | 来源:发表于2018-03-18 22:43 被阅读0次
    Collection
    ├ List
    │ ├ LinkedList(非线程安全)
    │ ├ ArrayList(非线程安全)
    │ └ Vector(线程安全)
    │   └ Stack
    └ Set(非线程安全)
    │ ├ HashSet
    │ └ TreeSet
    
    Map
    ├ Hashtable(线程安全)
    ├ HashMap(非线程安全)
    └ WeekHashMap
    

    list、Set与Map

    • List、Set都是继承Collection接口,而Map不是
    • List元素放入有序,可重复,而Set元素放入无序,且不重复。List支持for循环便利,但Set不能(元素在Set中的位置是由该元素的HashCode决定,位置是固定的)
    • Set检索元素效率低,但删除和插入效率高(因为插入和删除不会引起元素位置改变);List查找效率高,但插入删除效率低。
    • Map适合储存键值对的数据

    ArrayList与LinkedList

    ArrayList查询效率高,插入删除效率低
    LinkedList查询效率低,插入删除效率高
    原因:在于ArrayList是基于动态数组的数据结构,地址连续。而LinkedList是基于链表的数据结构,地址是任意的,在开辟内存空间的时候不需要等一个连续的地址。

    public ArrayList()//构造一个初始容量为10的空列表。
    

    HashSet与Treeset

    TreeSet是二叉树(红黑树的树据结构)实现的,Treeset中的数据是自动 排好序 的,不允许放入null值
    HashSet是哈希表实现的,HashSet中的数据是 无序 的,可以放入null,但只能放入一个null


    总结

    • 如果涉及到堆栈,队列等操作,应该考虑用List
      • 对于需要快速插入,删除元素,应该使用LinkedList
      • 如果需要快速随机访问元素,应该使用ArrayList
    • 如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类
    • 要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法
    • 尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。

    相关文章

      网友评论

        本文标题:Java中List、Set和Map的区别

        本文链接:https://www.haomeiwen.com/subject/iziyqftx.html