2)LinkedHashSet
LinkedHashSet是HashSet的一个子类 , 具有HashSet的特性 , 也是根据元素的hashCode值来决定元素的存储位置 。但它使用链表维护元素的次序 , 元素的顺序与添加顺序一致 。由于LinkedHashSet需要维护元素的插入顺序 , 因此性能略低于HashSet , 但在迭代访问Set里的全部元素时由很好的性能 。
3)TreeSet
TreeSet可以保证元素处于排序状态 , 它采用红黑树的数据结构来存储集合元素 。TreeSet支持两种排序方法:自然排序和定制排序 , 默认采用自然排序 。
♦ 自然排序
TreeSet会调用集合元素的compareTo(Object obj)方法来比较元素的大小关系 , 然后将元素按照升序排列 , 这就是自然排序 。如果试图将一个对象添加到TreeSet集合中 , 则该对象必须实现Comparable接口 , 否则会抛出异常 。当一个对象调用方法与另一个对象比较时 , 例如obj1.compareTo(obj2) , 如果该方法返回0 , 则两个对象相等;如果返回一个正数 , 则obj1大于obj2;如果返回一个负数 , 则obj1小于obj2 。
♦ 定制排序
想要实现定制排序 , 需要在创建TreeSet集合对象时 , 提供一个Comparator对象与该TreeSet集合关联 , 由Comparator对象负责集合元素的排序逻辑 。
综上:自然排序实现的是Comparable接口 , 定制排序实现的是Comparator接口 。
【Java高级特性之集合】4、Map集合
Map接口采用键值对Map<K,V>的存储方式 , 保存具有映射关系的数据 , 因此 , Map集合里保存两组值 , 一组值用于保存Map里的key , 另外一组值用于保存Map里的value , key和value可以是任意引用类型的数据 。key值不允许重复 , 可以为null 。如果添加key-value对时Map中已经有重复的key , 则新添加的value会覆盖该key原来对应的value 。
常用实现类主要有HashMap、LinkedHashMap、TreeMap 。
1)HashMap
对于 HashMap而言 , key是唯一的 , 不可以重复的。所以 , 以相同的 key 把不同的value插入到 Map中会导致旧元素被覆盖 , 只留下最后插入的元素。不过 , 同一个对象可以作为值插入到 map中 , 只要对应的key不一样。
HashMap由 数组 +链表 组成的 , 数组是 HashMap的主体 , 链表则是主要为了解决哈希冲突而存在的。
HashMap工作原理如下:
HashMap基于hashing原理 , 通过put()和get()方法存储和获取对象 。当我们将键值对传递给put()方法时 , 它调用建对象的hashCode()方法来计算hashCode值 , 然后找到bucket位置来储存值对象 。当获取对象时 , 通过建对象的equals()方法找到正确的键值对 , 然后返回对象 。HashMap使用链表来解决碰撞问题 , 当发生碰撞了 , 对象将会存储在链表的下一个节点中 。
HashMap特点:
- Map提供了一种映射关系 , 元素是以键值对(key-value)的形式存储的 , 能根据key快速查找value;
- Map 中的键值对以 Entry 类型的对象实例形式存在;
- key 值不能重复 , value 值可以重复;
- key 对 value 是多(一)对一的关系;
- Map 接口提供了返回 key 值集合、 value 值集合、 Entry 值集合 , 的方法;
- Map 支持泛型 , 形式如: Map<K,V>;
- 默认初始容量为 16 ;
- 加载因子为 0.75:即当 元素个数 超过 容量长度的0.75倍 时 , 进行扩容 ;
- 扩容增量:原容量的 1 倍 。
LinkedHashMap使用双向链表来维护key-value对的次序(其实只需要考虑key的次序即可) , 该链表负责维护Map的迭代顺序 , 与插入顺序一致 , 因此性能比HashMap低 , 但在迭代访问Map里的全部元素时有较好的性能 。
大多数情况下 , 只要不涉及线程安全问题 , Map基本都可以使用HashMap , 不过HashMap有一个问题 , 是 迭代 HashMap的顺序并不是HashMap放置的顺序 , 也就是无序 。HashMap的这一缺点往往会带来困扰 , 因为有些场景 , 我们期待一个有序的Map 。这个时候 , LinkedHashMap就闪亮登场了 , 它虽然增加了时间和空间上的开销 , 但是 通过维护一个运行于所有条目的双向链表 , LinkedHashMap保证了元素迭代的顺序。 该迭代顺序可以是插入顺序或者是访问顺序 。
推荐阅读
- 明星|这些明星改变了我对“方脸”的偏见,高级显气质,而且越老越耐看
- Java|Java:2022年招聘Java开发人员指南
- 穿衣搭配|50+想要穿出高级感,快来和这位姐妹学习,普通单品都能超神
- Java|HR傲慢对待求职者,还“诅咒”对方找不到工作,大学生也太难了
- 在Java 8及更高版本中使用Java流
- Java实现第三方短信接口发送短信验证码
- 安卓|8月30日登场!ColorOS 13新特性爆料汇总
- Java|“年薪20万”VS“银行柜员”该怎么选?内部员工:无条件选后者
- Android 13 新特性:1 小时后自动清理剪贴板内容
- 燃脂|周冬雨拍杂志好大胆!首次尝试半裸风格,蓝色短发像精灵,好高级啊
