关系

这张图简单揭示了Set、List与Map之间的相对关系。
需要说明下的是,图中的实现并不指这么简单的实现,这个稍后会说到。

Collection接口

Collection是Java中最基本的集合接口。它描述了一组有关集合操作的方法。

  1. int Size(); //集合大小
  2. boolean isEmpty(); //是否为空
  3. boolean contains(Object o); //是否包含某个对象
  4. Iterator<E> iterator(); //返回一个迭代对象,用来遍历集合中的元素
  5. Object[] toArray(); //将集合中的元素以数组形式然后返回
  6. <T> T[] toArray(T[] a); //上一个方法的泛型形式
  7. boolean add(E e); //将对象e添加进集合,添加成功则返回true
  8. boolean remove(Object o); //移除某个元素
  9. boolean containsAll(Collection<?> c); //传入一个集合c,如果c中的元素都存在,则返回true
  10. boolean addAll(Collection<? extends E> c); //将集合c中的元素全部添加进本集合
  11. boolean removeAll(Collection<?> c); //本集合减去c集合中的元素
  12. boolean retainAll(Collection<?> c); //取本集合和c集合的交集
  13. void clear(); //清空集合
  14. boolean equals(Object o); //判断相等
  15. int hashCode(); //获取集合当前的hash值

Set接口

Set接口直接继承自Collection接口,并且方法接口上也一模一样。Set对添加的元素有一些要求,其不允许出现重复的元素,并且元素之间没有次序。这相当于一个不允许重复的离散的集合。因此,添加进Set的元素类型需要定义equals方法。若是使用自定义的类,则应该重写equals方法来确保实现自己需要的功能。

Set接口主要实现了两个类:HashSet,TreeSet。

HashSet是按照哈希来存取元素的,因此速度较快。HashSet继承自抽象类AbstractSet,然后实现了Set、Cloneable、Serializable接口。
TreeSet也是继承自AbstractSet,不过不同的是其实现的是NavigableSet接口。而NavigableSet继承自SortedSet。SortedSet是一个有序的集合。其添加的元素必须实现了Comparable接口,因为其在添加一个元素的时候需要进行排序。NavigableSet则提供了更多的有关元素次序的方法,比如:

  1. E lower(E e); //找出小于e的元素
  2. E floor(E e); //找出小于等于e的元素
  3. E ceiling(E e); //找出大于等于e的元素
  4. E higher(E e); //找出大于e的元素
  5. E pollFirst(); //弹出第一个(最小)元素,如果集合为空则返回null
  6. E pollLast(); //弹出最后一个(最大)元素,如果集合为空则返回null

LinkedHashSet也是Set的一个实现。和HashSet类似,只不过内部用链表来维护,按照元素插入次序来保存。

List接口

List接口也是继承自Collection。与Set不同的是,List可以存储重复的元素。主要有两种实现:ArrayList和LinkedList。
ArrayList没有什么好说的,就像传统的数组一样,有着很快的随机存取速度,但是插入删除的速度就很慢。
LinkedList则与ArrayList恰恰相反,因为用链表来保存数据,所以插入删除元素的速度很快,但是访问数据的速度就不如ArrayList了。

Map接口

Map(映射)是一个存储键值对的容器接口。每一个元素包含一个key对象和value对象,且元素不允许重复。
Map接口的实现有以下几个:
HashMap是最常用的一个实现。HashMap使用hash映射来存取数据,这个速度是相当快,是O(1)的速度。其容量capacity,和负载因子load factor可以在一开始设定。当元素个数达到capacity*load factor的时候,就会进行扩容。
LinkedHashMap和HashMap类似,只不过内部用链表来维护次序。因此遍历时候的顺序是其插入顺序。
TreeMap是基于红黑树的Map,插入的数据被有次序保存,并且有很高的效率。因此在遍历输出的时候可以得到排序的数据。但是这要求插入的数据实现了comparable接口。

总结

  1. Collection、Set、List和Map都是接口,不能被实例化。
  2. Set和List都继承自Collection,而Map则和Collection没什么关系。
  3. Set和List的区别在于Set不能重复,而List可以重复。
  4. Map和Set与List的区别在于,Map是存取键值对,而另外两个则是保存一个元素。

文章最后喜欢的小伙伴可以关注下我的或者关注我的专栏,以后给大家带来更多精彩的技术和面试知识点分享

程序员学习之路​zhuanlan.zhihu.com

两个list取交集_Java基础面试题-说说你知道的几个Java集合类:list、set、queue、map...相关推荐

  1. Python-两个列表取交集、并集、差集(编写了一个两个文件取交集的小工具)

    最近突然有个需求(取两个文件数据的交集),数据量非常大(2000多万行的数据),最开始的思路是先取一个文件所有的数据,保存成一个列表,然后判断是否在另一个文件中,花了十几分钟写出来后,一运行,差点崩溃 ...

  2. jdk8两个List取交集、差集、并集(不去重)、并集(去重)

    jdk8两个List取交集.差集.并集(不去重).并集(去重) /*** 交集* @param list1* @param list2* @return*/private static List< ...

  3. Python中两个list取交集、并集、差集以及为字符串str添加、插入特定字符的操作总结

    Python中两个list取交集.并集.差集以及为字符串str添加.插入特定字符的操作总结 Python中两个list取交集.并集.差集 为字符串str添加.插入特定字符的操作总结 Python中两个 ...

  4. 【Java】对两个Set取交集,差集,并集

    1.取交集(取两个集合中都存在的元素) HashSet<String> setA = new HashSet<>(); HashSet<String> setB = ...

  5. linux两个文件取交集、并集、差集

    如何得到两个文件的交集.并集和差集? 交集:两个文件中都出现的行 并集:两个文件中的所有行加起来,去掉重复 差集:在一个文件中存在,而在另一个文件中不存在. 比如以下两个文件: a.txt aaa b ...

  6. js 两个列表取交集

    js没有直接的方式来获取两个列表的交集,需要自己写一个函数,如下: function jiaoji(arr_1,arr_2){//先对arr_1进行一次深拷贝,防止对原两个列表造成影响let temp ...

  7. python两个list取交集_使用 Python 获取两个列表的交集、并集、差集的常用方法 | Jin''''s Blog...

    在数据处理中经常需要使用 Python 来获取两个列表的交集,并集和差集.在 Python 中实现的方法有很多,我平时只使用一两种我所熟悉的,但效率不一定最高,也不一定最优美,所以这次想把常用的方法都 ...

  8. python对两个list取交集、并集、和异或

    第一种方法:使用python基本数据结构set集合. 优点:集合运算长度可以不一致,运算效率高 缺点:两个进行运算的集合中不能够含有重复的元素,如果含有的话,转成set集合后,会自动去掉重复元素 a= ...

  9. Linux中uniq去重以及对两个文件取交集,并集,差集

    uniq 前言 很多时候我们需要对数据去重,不管是少量数据还是大量数据,写代码进行去重终究没有使用系统功能直接操作文件方便,所以本文就介绍了一些关于uniq的使用方法 uniq单独使用 uniq配合s ...

最新文章

  1. 记录opencv编译过程
  2. Jenkins配置Java项目1(Java+Maven+Tomcat+SVN/Git)
  3. WPF - 资源收集
  4. 利用js刷新页面方法
  5. SAP Spartacus里,点击checkbox右边的span文本,不会触发checkbox勾选的原因
  6. $router和$route的区别
  7. Shared library can't open object
  8. 用python自制一个简单的答题程序
  9. 接口测试apipost
  10. cron表达式每隔1小时一次_cron 每隔1小时50分钟_cron每小时执行一次
  11. 手机浏览器 打开 APP,APP 嵌套在了浏览器里,网页跳转app问题
  12. DataGear 制作自适应任意屏幕尺寸的数据可视化看板
  13. 袋鼠云平台代码规范化编译部署的提效性改进实践
  14. 计算机的r进制,进制转换(十进制转R进制)
  15. NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized“
  16. springboot+jsp网上水果生鲜商城销售系统
  17. Ubuntu根目录结构说明
  18. android hid触摸屏,Android USB触摸屏HID描述符问题
  19. Python实现北邮人论坛模拟登录
  20. 步进电机调速,S曲线调速算法很香

热门文章

  1. usaco-2.1-frac1-pass
  2. 程序编译过程与软件启动过程
  3. Excel VBA入门的基础语句
  4. FFMPEG开源音视频项目学习汇总
  5. Python爬取网易云热歌榜所有音乐及其热评
  6. Ubuntu18.04报错:Aborted (core dumped) (classes.jar.toc.tmp ) ninja: build stopped: subcommand failed解决
  7. Ubuntu和Mac使用gdbserver远程调试android源码
  8. Android java获取行号和函数名
  9. 如何构建NTP时间服务器
  10. springboot项目打成可依赖jar包_用IDEA把SpringBoot项目打成jar发布项目