HashSet集合 【重点】
Map集合 【重点】
HashMap集合 【重点】
TreeMap集合 【了解】
可变参数 【重点】
HashSet集合 【重点】
特点:
1、不能保证存取有序
2、没有索引
3、不能存储重复元素
里面没有要学习的特有方法,所有使用的方法还是Collection接口中的那些方法
HashSet存储字符串
HashSet存储学生对象
观察:
1、直接将学生对象存储到HashSet集合中没有做任何操作,是否会运行报错?
不会报错
2、是否达到了去重效果?
没有,多个成员变量相同的对象都存储到了集合中
如何做到去重?
在元素对象所在的类中,生成(重写)hashCode和equals方法,
生成之后HashSet就会做到我们想要的去重效果
我们认为对象中的成员变量都相同是同一个,应该去重
3、是否依然无法保证有序?
是的
哈希值
是一个int类型的值,所以范围也在int范围
可以通过hashCode方法可以进行获取,hashCode方法是Object类中的方法,如果没有重写hashCode方法,
获取的哈希值可以反映对象的地址值,但是如果重写了就和地址值无关,一般和对象中的成员变量有关
同一对象(地址相同),多次调用hashCode方法计算的哈希值一定相同
不同的对象(地址不同),多次调用hashCode方法计算的哈希值可能相同,也可能不同
——>哈希值不同的一定不是同一个对象,哈希值相同的可能是同一个对象,也可能不是同一个对象
HashSet去重的原理(HashSet保证元素唯一的原理)
底层依赖的是hashCode和equals方法,通过这两个方法的配合使用,达到去重的效果
首先调用hashCode方法计算哈希值,根据哈希值计算元素在底层数组中存储的位置,如果该位置为null,
则说明当前要存储的元素与集合中已存储的所有元素的哈希值不同,此时直接存储。但是如果该位置不为null,
则说明当前要存储的元素和集合中已存储的元素哈希值相同,此时无法确定是否是同一个元素,那么要调用equals
方法进一步确定,如果equals方法判断不相同,则说明不是相同元素,则存储,如果equals方法判断相同,
则说明是相同元素,则不存。
总结:
1、能够使用HashSet存储简单类型元素(String、Integer),这些也可以称为JDK提供的类类型
不用做任何操作,直接存储到HashSet中即可,就可以做到去重
因为这些JDK提供的类类型底层已经重写了hashCode和equals方法,去重的时候和内容有关
2、能够使用HashSet存储自定义类型元素(Student、Person)
存储到HashSet中之后,还需要重写hashCode和equals方法,通过idea自动生成即可
重写之后,去重的时候和内容有关
3、能够描述HashSet的去重原理
单列集合的总结
体系结构
Collection
|-List
|-ArrayList
|-LinkedList
|-Vector
|-Set
|-TreeSet
|-HashSet
集合的选择
1、看是否需要存储重复元素
需要,只能选择List体系
不需要/不能,选择Set体系
2、List体系下选择哪个集合?
ArrayList:底层是数组,查询修改快,增删慢
LinkedList:底层是链表,查询修改慢,增删快
Vector:底层是数组,查询修改快,增删慢
Vector肯定不选,它基本上活在很老的代码和面试题中
如果增删特别多,选择LinkedList
其余情况都选ArrayList
由于真实环境中,只有还是将集合当做一个临时中间容器使用,
常见的操作是:存储进去之后,传递到下一层,然后取出元素,
并且存储的数据一般不会很多,所以List体系下基本上都是使用ArrayList
3、Set体系下选择哪个集合?
TreeSet:底层是红黑树,可以对集合元素去重和排序
HashSet:底层是哈希表,可以对集合元素去重,但是不能排序
所以如果要去重且排序,选择TreeSet
如果只是要去重,选择HashSet
由于真实环境中,基本不会使用Java集合进行排序,以后都是通过数据库的SQL进行排序
所以我们不会选择TreeSet,都选择HashSet
Map集合 【重点】
Map集合概述
什么是Map集合
Map是一个双列集合,存储的每一个元素由两列组成,
第一列称为键(Key),第二列称为值(Value),
Map集合存储的是键映射到值的对象,可以称为键值对
单列
add("hello");
add("world");
add("java");
add("php");
双列
键 值
put("zhangsan",24)
put("lisi",15)
put("wangwu",15)
Map集合的特点
1、Map的键和值是一一对应的,通过一个键最多只能找到一个值
2、键不能重复,但是值可以重复
如果键相同,则值覆盖(修改值)
3、Map也没有索引,不能通过索引操作Map集合中的元素
Map集合的体系结构
Map接口
|-TreeMap类
|-HashMap类
常用方法
添加(修改值)
V put(K key, V value):添加键值对数据,如果键相同此时有修改值的效果
方法会返回被修改的旧值,如果没有修改(没有相同的键)则返回null
删除
V remove(Object key):根据键删除整个键值对,返回的是被删除的键值对对应的值
void clear():清空集合
判断
boolean isEmpty():判断集合是否为空(判断集合是否有元素)
boolean containsKey(Object key):判断是否有指定的键
boolean containsValue(Object value):判断是否有指定的值
获取
int size():获取集合的长度
Collection<V> values():获取所有的值的集合
遍历
V get(Object key):根据键获取对应的值
Set<K> keySet():获取所有的键存储到Set集合中返回
Set<Map.Entry<K,V>> entrySet()
default void forEach(BiConsumer<? super K,? super V> action)
遍历
方式一:根据键获取值
V get(Object key)
Set<K> keySet()
步骤:
1、首先获取所有的键 keySet()
2、遍历获取每一个键
3、在遍历中根据获取的每一个键找到对应的值 get(K)
方式二:根据键值对对象找键和值
Set<Map.Entry<K,V>> entrySet()
步骤:
1、获取所有的键值对对象 entrySet()
2、遍历获取每一个键值对对象
3、根据键值对对象中的getKey()和getValue()方法分别获取键和值
方式三:Map默认方法forEach方法
default void forEach(BiConsumer<? super K,? super V> action)
HashMap集合 【重点】
HashMap是Map接口的实现类,Map接口中的共性方法HashMap都可以使用
HashMap没有要学习的特有方法。
HashMap的特点:
1、底层是哈希表结构,数据结构针对的是键,对值没有效果
2、键不同重复、无法保证有序的、不能通过索引操作的
3、HashMap键存储元素的特点和HashSet存储元素的特点一模一样
因为HashSet底层使用的就是HashMap的键
HashMap的键存储的自定义对象,我们需要重写hashCode和equals方法
TreeMap集合 【了解】
TreeMap是Map接口的实现类,Map接口中的共性方法TreeMap都可以使用
TreeMap没有要学习的特有方法。
TreeMap的特点:
1、底层是红黑树,数据结构针对的是键,对值没有效果
2、键不同重复、无法保证有序的(排序)、不能通过索引操作的
3、TreeMap键存储元素的特点和TreeSet存储元素的特点一模一样
因为TreeSet底层使用的就是TreeMap的键
TreeMap的键存储的自定义对象,我们需要指定自然排序规则或者比较器排序规则
可变参数 [重点]
什么是可变参数
JDK5.0的新特性(自动拆装箱、增强for、泛型和可变参数等)
表示参数的个数可以发生改变,形参只有一个,但是实参可以是0个、1个或多个
可变参数的格式
修饰符 返回值类型 方法名(参数列表) {
方法体
}
可变参数只能使用在方法的形参处(参数列表)
格式:
数据类型... 变量名
可变参数的注意事项
1、可变参数的本质是一个数组
2、如果一个参数是可变参数,既可以传递一个数组,也可以传递多个这种类型的数据
3、一个方法的可变参数最多只能有一个,而且必须放在参数列表的最后
4、可变参数只能使用在方法的形参处(参数列表)
可变参数和数组的区别
1、使用场景上
可变参数只能使用在方法的形参处
数组既可以使用在形参处,也可以和使用在方法内部定义局部变量,还可以使用类中方法外定义成员变量
2、当做形参进行实参传递上
可变参数,既可以传递一个数组,也可以传递多个这种类型的数据,还可以不传递(0个实参)
数组,只能传递这种类型的数组,不能传递多个这种类型的数据,而且不能不传递
总结:可变参数使用在形参处,可以比数组更加灵活
带可变参数的方法的使用(不可变集合的创建和使用)
List接口
static <E> List<E> of(E... elements)
Set接口
static <E> Set<E> of(E... elements)
Map接口
static <K,V> Map<K,V> of(K k1, V v1)
static <K,V> Map<K,V> ofEntries(Map.Entry<? extends K,? extends V>... entries)