Set接口
概述
一个不包含重复元素的 collection。更确切地讲,set 不包含满足e1.equals(e2)
的元素对e1
和e2
,并且最多包含一个 null 元素
特点
Set
接口是无序的Set
是继承于Collection
的接口。它是一个不允许有重复元素的集合。Set
可以存储null值,但是null不能重复- Set的实现类都是基于
Map
来实现的(HashSet
是通过HashMap
实现的,TreeSet
是通过TreeMap
实现的)。
HashSet类
概述
此类实现Set
接口,由哈希表(实际上是一个HashMap
实例)支持。它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null
元素。
特点
- 底层数据结构是 哈希表,HashSet的本质是一个"没有重复元素"的集合,它是通过
HashMap
实现的。HashSet中含有一个"HashMap类型的成员变量"map,在HashSet中操作函数,实际上都是通过map实现的。 - 哈希表保证唯一 依赖hashcode和equals方法
【
原理: 首先判断hashCode是否相同 不相同 就存储到集合中 相同 比较equals方法是否相同 相同 就不存储 不相同就以链表的方式存储到集合中
】
- 哈希表导致元素存储无序主要因为系统通过哈希算法计算出来的索引和对象本身的hashCode本身有关,所以这个整数值是无序的,从而存储到集合中自然就是无序的
HashSet存储自定义对象去除重复元素需要重写 hashCode和equals方法
TreeSet
概述
基于TreeMap
的NavigableSet
实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator
进行排序,具体取决于使用的构造方法。
特点
- TreeSet 是一个有序的并且可排序的集合,它继承于AbstractSet抽象类,实现了NavigableSet, Cloneable, java.io.Serializable接口。
- TreeSet是基于TreeMap实现的。TreeSet中的元素支持2种排序方式:自然排序 或者 根据创建TreeSet 时提供的 Comparator 进行排序。这取决于使用的构造方法。
- TreeSet是非同步的,线程不安全的,效率高。
- 二叉树保证元素唯一
【
第一个元素进来作为根节点存储
后面元素进来和根节点比较
大了,放在元素的右边
小了,放在元素的左边
相等,设置原值
】
- 二叉树保证元素可排序 --> 利用二叉树中序遍历取元素的特点。
- 注意中文排序可以使用
Collator
类处理 - 建议使用三目运算符进行排序
- 针对返回值是
double
类型的,可以考虑使用三目转换成int类型的结果
LinkeHashSet
概述
List
接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括null
)。除了实现 List接口外,
LinkedList类还为在列表的开头及结尾
get、
remove和
insert` 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。
特点
- 底层数据结构是 链表和哈希表
- 链表保证元素有序
- 哈希表保证元素唯一
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> 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 valueOf(类 enumType, String name)
返回具有指定名称的指定枚举类型的枚举常量。
T valueOf(String name)
T[] values();
枚举的特点总结
枚举既然是一个类,那么枚举是否有构造方法,成员方法,静态方法,静态变量,成员变量,抽象方法?
有的话,有意义吗?
1.枚举中所有的成员,必须出现在枚举对象的下面
2.如果枚举类中有一个成员,那么 枚举对象最后不能省略分号
3.枚举中构造方法必须私有
4.抽象方法有意义 - 可以用来描述某个枚举成员的信息,提高程序的可读性
5.枚举也是switch语句中 的常量 形式之一
switch语句中可以有哪些?
byte short int char String 枚举