Java中List、Set和Map的区别

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时,客户端代码不用改变。这就是针对抽象编程。
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容