Java Set接口 Map 与枚举

Set接口

概述

一个不包含重复元素的 collection。更确切地讲,set 不包含满足 e1.equals(e2) 的元素对
e1e2,并且最多包含一个 null 元素

特点

  1. Set接口是无序的
  2. Set 是继承于Collection的接口。它是一个不允许有重复元素的集合。
  3. Set可以存储null值,但是null不能重复
  4. Set的实现类都是基于Map来实现的(HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的)。

HashSet类

概述

此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用 null 元素。

特点

  1. 底层数据结构是 哈希表,HashSet的本质是一个"没有重复元素"的集合,它是通过HashMap实现的。HashSet中含有一个"HashMap类型的成员变量"map,在HashSet中操作函数,实际上都是通过map实现的。

  2. 哈希表保证唯一 依赖hashcode和equals方法

    ​ 原理:
    ​ 首先判断hashCode是否相同
    ​ 不相同
    ​ 就存储到集合中
    ​ 相同
    ​ 比较equals方法是否相同
    ​ 相同 就不存储
    ​ 不相同就以链表的方式存储到集合中

  3. 哈希表导致元素存储无序主要因为系统通过哈希算法计算出来的索引和对象本身的hashCode本身有关,所以这个整数值是无序的,从而存储到集合中自然就是无序的

HashSet存储自定义对象去除重复元素需要重写 hashCode和equals方法

TreeSet

概述

基于 TreeMapNavigableSet 实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的 Comparator 进行排序,具体取决于使用的构造方法。

特点

  1. TreeSet 是一个有序的并且可排序的集合,它继承于AbstractSet抽象类,实现了NavigableSet, Cloneable, java.io.Serializable接口。

  2. TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。

  3. TreeSet是非同步的,线程不安全的,效率高。

  4. 二叉树保证元素唯一

    ​ 【

    ​ 第一个元素进来作为根节点存储

    ​ 后面元素进来和根节点比较

    ​ 大了,放在元素的右边

    ​ 小了,放在元素的左边

    ​ 相等,设置原值

  5. 二叉树保证元素可排序 --> 利用二叉树中序遍历取元素的特点。

  6. 注意中文排序可以使用 Collator类处理

  7. 建议使用三目运算符进行排序

  8. 针对返回值是double类型的,可以考虑使用三目转换成int类型的结果

LinkeHashSet

概述

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现
List接口外,LinkedList类还为在列表的开头及结尾getremoveinsert` 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列双端队列

特点

  1. 底层数据结构是 链表和哈希表
  2. 链表保证元素有序
  3. 哈希表保证元素唯一

Map集合

Map集合提供了集合之间一种映射关系

让集合和集合之间产生关系

Map集合的特点

1.能够存储唯一的列的数据(唯一,不可重复) Set

2.能够存储可以重复的数据(可重复) List

3.值的顺序取决于键的顺序

4.键和值都是可以存储null元素的

一个映射不能包含重复的键。

每个键最多只能映射到一个值。

常用功能

1.添加功能

​ V put(K key, V value)

​ void putAll(Map<? extends K,? extends V> m)

2.删除功能

​ V remove(Object key)

​ void clear()

3.遍历功能

​ Set keySet()

​ Collection values()

​ Set<Map.Entry<K,V>> entrySet()

4.获取功能

​ V get(Object key)

5.判断功能

​ boolean containsKey(Object key)

​ boolean containsValue(Object value)

​ boolean isEmpty()

6.修改功能

​ V put(K key, V value)

​ void putAll(Map<? extends K,? extends V> m)

7.长度功能

​ int size()

枚举

何为枚举?

枚举是在一定范围内取值,并且这个值必须是枚举类型中的任意一个,并且只能有一个

特点:

1.必须在规定范围内取值

2.这个值只能取一个

3.这个值可以是规定范围内的任意一个

枚举中常用的方法

String name()

返回此枚举常量的名称,与其枚举声明中声明的完全相同。

int ordinal()

返回此枚举常数的序数(其枚举声明中的位置,其中初始常数的序数为零)。

static <T extends Enum>

T valueOf(类 enumType, String name)

返回具有指定名称的指定枚举类型的枚举常量。

T valueOf(String name)

T[] values();

枚举的特点总结

枚举既然是一个类,那么枚举是否有构造方法,成员方法,静态方法,静态变量,成员变量,抽象方法?

有的话,有意义吗?

1.枚举中所有的成员,必须出现在枚举对象的下面

2.如果枚举类中有一个成员,那么 枚举对象最后不能省略分号

3.枚举中构造方法必须私有

4.抽象方法有意义 - 可以用来描述某个枚举成员的信息,提高程序的可读性

5.枚举也是switch语句中 的常量 形式之一

switch语句中可以有哪些?

byte short int char String 枚举

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值