Java集合类知识整理
来源:互联网 发布:学霸 知乎 编辑:程序博客网 时间:2024/05/01 01:18
一、元素是否有序?
- 有序:List、TreeSet、TreeMap
- 无序:Set(AbstractSet、HashSet)、Map(AbstractMap、HashMap)
- 原因:List最常用的实现类是ArrayList和LinkedList,前者以一种类似数组的形式进行存储,后者是以链表的形式进行存储,都是有序的。对于TreeSet和TreeMap,顾名思义是采用树的形式进行存储的,所以也是有序的。而Set的其它实现类则是无序的,就像一个口袋一样,它无法记住我们放入元素的顺序,所以是无序的。Map也是一样,除了使用树形存储的实现类外,其它实现类中放入的数据也是无序。
二、是否可以重复?
- 能:List、Map(这里的重复指的是value而不是key,key必须唯一)
- 否:Set
- 原因:前面提到因为List常用的两个类是采用链表或者数组的形式进行存储的,是有序的,可以区分相同元素,所以能加入相同的元素。而Map可重复指的是value可重复,但是必须保证key是唯一的,才能保证正确的取出数据。对于Set,如果放入重复元素,怎么知道取出的是哪一个?所以不运行放入重复的元素。
二、是否可以加入null?
对各个集合能否放入null,并不能统一的用能和否进行解释。
对于Map集合而言:
(1)TreeMap:允许加入的value为null但是key一定不可以是null,否则会引发NullPointerException
Map set = new TreeMap() ;set.put(null, "a") ;
结果:
Exception in thread "main" java.lang.NullPointerException at java.util.TreeMap.compare(Unknown Source) at java.util.TreeMap.put(Unknown Source) at review.test.collection.TestNull.main(TestNull.java:11)
有的地方说TreeMap只有在元素数量大于1的时候才会调用Comparator比较器,所以TreeMap在添加的第一个元素key为null的时候不会引发NullPointerException,但是通过实验证明,即使将null作为第一个加入元素的key值,亦或者只加入一个null-value键值对,结果都是会引发NullPointerException的,所以得出的结果是TreeMap所有键值对的key都不可以为null。
(2)HashMap:允许添加null-null键值对,但是要求只能加入一个key为null的键值对,如果加入多个key为null的键值对,则后加入的键值对会覆盖先加入的键值对,保持集合中最终只有一个key为null的键值对。但是可以多个键值对的value都为null。
Map set = new HashMap() ;set.put(null, null) ;set.put(null, 1) ;set.put(2 , null) ;set.put(3, null) ;
调试结果:
并且在对存在key为null的HashMap进行value的取出操作时,不能使用get方式,否则一样会引发NullPointerException。只能通过遍历去获取
Set<Map.Entry<Integer,Integer>> s = set.entrySet();for(Map<Integer,Integer> entry : s){ System.out.println(entry);}
对于List而言:
ArrayList和LinkedList都是有序的,可以加入多个null值,并且可以正确输出。
List list = new ArrayList() ;list.add(null) ;list.add(null) ;list.add(1) ;for(Object obj:list) { System.out.println(obj+" ");}
调试及输出结果:
对于Set而言:
(1)HashSet:允许添加null值,但因为是无序的,所以集合中实际最终只有一个null值,并且添加的null值将会第一个被输出。这里涉及到hash对null的处理实现,可参考: HashMap中插入null key的过程分析
Set set = new HashSet() ;set.add(2) ;set.add(null) ;set.add(null) ;set.add(1) ;for(Object obj:set) { System.out.println(obj+" ");}
调试结果:
(2)TreeSet:和TreeMap一样,TreeSet对添加null值非常敏感,TreeSet完全不允许添加null,只要添加null值就会引发NullPointerException。
- java 集合类知识整理
- Java集合类知识整理
- JAVA集合实用知识整理
- java集合知识整理总结
- [知识整理]Java集合(一) - List
- [知识整理]Java集合(二) - Set
- java集合类知识
- Java集合类(整理)
- java集合类整理
- Java 集合类整理
- Java集合类整理
- java集合类整理
- Java知识整理(六)之SE.集合框架
- Java知识:初识集合类
- java 集合类知识汇总
- java枚举类知识整理
- java 集合相关类整理
- 找工作知识梳理--Java--集合类篇
- spring security起步二:自定义登录页
- 切换Win10系统语言环境的方法
- dedecms 5.7版本已增加按权重排序功能
- JNDI配置数据源(tomcat上配置)
- Java实例化对象的几种方式
- Java集合类知识整理
- H5判断网络状态
- 一个C源文件到可执行文件 [反汇编-函数栈帧 编译 链接]
- MySQL系列之架构浅析
- js 阿拉伯数字转中文大写货币
- 行人属性“Actions and Attributes from Wholes and Parts”
- Tapestry(二):Tapestry基本知识
- 在seo中,怎么写原创文章。
- MyBatis 延迟加载,一级缓存,二级缓存设置