list,set,map集合

1.集合

1.概念:
集合就是一个存储数据的容器
2.集合和数组的区别:
· 1.数组的长度固定,集合的长度不是固定的
2.数组可以存储基本类型和引用类型,但是集合中存储的元素类型只能是引用类型
3.集合和数组的对比
相同点:都是数据的容器,在一个数组或集合中可以存储多个数据
不同点:
元素: 数组中的元素只能是相同类型的,几个中的元素是任意的
数组中可以存储基本类型和引用类型,集合只能存储引用类型
长度:
数组是定长的,一旦初始化长度就不可以发生修改
集合长度是可以修改的,可以删除元素和添加元素
4.集合的框架结构介绍图:
在这里插入图片描述

主要是collect接口,list,queeue,set接口实现collect,另外还有map接口也是属于集合。重点学习主要是list,set,map接口!

List接口

1.List接口中的方法名:
在这里插入图片描述
2.add()方法案例:在之前先创建一个DVD类。属性都是String类型的编号,名字,评价。
通过list添加一个DVD元素
在这里插入图片描述
3.增强型for循环(for-each循环)语法:
在这里插入图片描述
案例:
在这里插入图片描述

List接口的实现类:
ArrayList类:
	ArrayList类是List接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括null在内的所有元素。
AllayList存储特点:
	相对有序存储,可以存储相同的元素(不排重),可以通过下标访问集合元素
	存储结构:数组
底层:
	调用无参的构造方法,其底层将会给一个空的数组
	当第一次调用add方法时,数组的长度为10

LinkList类:
LinkedList类是List接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括null)。
LinkList存储特点:
相对有序存储,可以存储相同元素(不排重),可以通过下标访问集合元素,通过链表实现的集合
存储结构:双向链表
用法跟AllayList一样。

ArrayList和LinkedList的总结

ArrayList存储结构是数组,LinkedLis存储结构是链表。
ArrayList集合适用在对元素查询、遍历操作,不适合插入和删除。
LinkedList集合适用在对元素插入和删除操作,不适合遍历和查找。

set接口

1.set接口常用方法:
在这里插入图片描述
存储特点:
相对无序存储,不可以存储相同的元素(排重),不能通过下标访问

Set接口的实现类
1.HashSet:

定义:此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
Hash:哈希——实际含义散列,就是一种算法,把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。
哈希表:数组加链表,既有数组的优点也有链表的优点。为了方便我们更快的查值

1.哈希表是如何进行存储数据的?
先在内存中声明一个16个长度的数组,当你要添加值时,先得到该值的hashCode()值,随机选择一个空位存储该值
当你第n次添加值时,首先算出该值的hashcode()值,来确定他的存放位置,如果之前没出现过,那么数组就可能要扩容了;但是如果该hashcode()值出现过,由于该位置上已经有值存储过了,那么此时就要考虑取舍了,如何取舍取决于两个值的equals是否相同,相同就不需要在进行存储了,如果不同,在数组的基础上添加链表格式,形成链表

2.因为HashSet是具有排重功能所以在进行存储数据的时候需要将要存储的数据和已经存储进去的数据进行比较,其中涉及俩种方法----hashcode()和euqals()
euqals()就是比较俩个数据的内容是不是一致,但是在存储的时候是由上述所说的由内存中声明一个数组,通过对数据的hashcode值来确定数据的存放位置,当hashcode()值一样时,在进行equals()的判断,一样时则进行取舍覆盖,就是新的值存进之前的位置中将旧的值覆盖,如果hashcode()值一样,且equals()值也不一样,就需要在数组上面添加链表形式,新的数据挂在数组上面,俩个数据同时存在。但是在这基础上计算hashcode()的值需要我们对其进行重写和equals()的重写。

重写hashcode()

HashSet集合排重时,需要判断两个对象是否相同,对象相同的判断可以通过hashCode值判断,所以需要重写hashCode()方法

案例:
设计一个Animal类,重写hashCode方法,向一个HashSet集合中添加Animal对象,检验是否排重(若所有属性都相同,视为相同元素)
在这里插入图片描述
向HashSet集合中添加多个Animal对象时,所有属性都相同时,并没有完成想要的排重效果;
所以只重写hashCode方法并不能实现我们想要的排重效果,还需要实现重写equals方法。

重写equals()

equals()方法是Object类中的方法,表示比较两个对象是否相等,若不重写相当于比较对象的地址,
所以我们可以尝试重写equals方法,检查是否排重

案例:
设计一个Animal类,重写equals方法,向一个HashSet集合中添加Animal对象,检验是否排重(若所有属性都相同,视为相同元素)
在这里插入图片描述

2.TreeSet

TreeSet集合是可以给元素进行重新排序的一个Set接口的实现。使用元素的自然顺序对元素进行排序,或者根据创建 set 时提供的Comparator进行排序,具体取决于使用的构造方法。
存储特点:
无序存储,排重,通过二叉树实现的集合,可以给元素进行重新排序
SortedSet接口:
TreeSet除了实现了Set接口外,还实现了SortedSet接口

SortedSet方法名:
在这里插入图片描述
TreeSet中的排序

自然排序:
	元素所属的类需要实现java.lang.Comparable接口,并重写compareTo方法。​compareTo方法除了可以进行排序外,还有排重的功能,但是必须在compareTo方法中对类中所有的属性值都进行判断,否则不比较那个属性,排重就会忽略哪个属性

案例:设计一个Student类,实现将Student对象添加到TreeSet集合中时,对所有的元素进行排序
在这里插入图片描述

定制排序(外比较器)

元素需要通过java.util.Comparator接口(比较器)中的compare方法进行比较大小,并排序。
compare方法除了可以进行排序外,还有排重的功能,但是必须在compare方法中对类中所有的属性值都进行判断,否则不比较那个属性,排重就会忽略哪个属性
TreeSet集合中的无参数构造方法默认使用自然排序的方式对元素进行排序,使用TreeSet集合的定制排序时,创建集合对象不可以直接使用无参数构造方法,需要使用传入一个Comparator比较器的构造方法创建集合对象。
案例:
按照字母的长度来排列字符串 ,如果长度一样 按照编码顺序排列
“dog” “hello” “beijing” “tianjin” “shanghai” “guangzhou”
在这里插入图片描述

Map接口

定义:
Map接口是将键映射到值的对象。一个映射不能包含重复的键,每个键最多只能映射到一个值,值可以重复。
cn—>中国
usa—>美国
uk—>英国
us—>美国
cn—>中华人民共和国

Map接口中常用的方法
在这里插入图片描述
方法案例:
在这里插入图片描述
在这里插入图片描述

Map接口常用类
1.HashMap

基于哈希表的Map接口的实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序。

存储特点:
相对无序存储,元素以键值对形式存在,键不可以重复,值可以重复,元素整体排重,可以快速的通过键查找到所对应的值,通过哈希表实现的集合。

Map集合的排重,只需要重写键所属的类的hashCode和equals方法即可。

哈希表是如何进行存储数据的?

先在内存中声明一个16个长度的数组,当你要添加值时,先得到该值的hashCode()值,随机选择一个空位存储该值
当你第n次添加值时,首先算出该值的hashcode()值,来确定他的存放位置,如果之前没出现过,那么数组就可能要扩容了;但是如果该hashcode()值出现过,由于该位置上已经有值存储过了,那么此时就要考虑取舍了,如何取舍取决于两个值的equals是否相同,相同就不需要在进行存储了,如果不同,在数组的基础上添加链表格式,形成链表

HashMap的存值原理?(高频考点)

当时实例化一个hashMap对象时,我们会将它的加载因子赋值为0.75,当调用put方法时,首先会算出键的hash值(跟hashcode()有关系),然后会实例化出一个16个长度的数组,根据键的hash值算出该键值对的存储位置
当所有的键hash都不一样时,如果存入的值超过了门槛值(加载因子*容量),会进行扩容,扩容为原来的两倍
当出现hash值相同的键(极大可能是因为你重写hashcode方法),那么就会出现多个元素存储在同一个数组的下标中,那么此时会先调用equals方法,如果相同,则去覆盖原有值,如果不同,则将该值存放到上一个值的next属性中,形成链表(jdk1.8之后,当链子长度超过7之后,则会转成红黑树树结构进行存储)
案例:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
map集合中若向集合中添加相同键的键值对时,新的值会将旧的值覆盖。
上述代码中map集合中有两个键值对,结果分别为:张三-12—二哈,lisi-12—旺财

2.LinkedHashMap

LinkedHashMap集合是具有可预知迭代顺序的Set接口的哈希表和链接列表实现。此实现与HashSet的不同之外在于,后者维护着一个运行于所有条目的双重链接列表。用法与HashSet类似。
存储特点:
有序存储,元素排重,通过链表实现的集合。

3.Hashtable

此类实现一个哈希表,该哈希表将键映射到相应的值。任何非null对象都可以用作键或值。
他是一个古老的集合,所以他的线程是安全的
Hashtable有一个子类Properties,Properties集合使用的比较频繁。

存储特点:
相对无序存储,元素排重,通过哈希表实现的集合。

HashMap与Hashtable的区别
1)Hashtable线程安全的,而HashMap线程不安全的
2)Hashtable中不允许存在null的键和null值,但是HashMap中允许null的键和null值

Map集合的遍历

1.使用keySet方法与get方法结合
在这里插入图片描述
结果:
在这里插入图片描述
2.调用Map集合的entrySet方法,相当于将Map集合转成一个Set集合,再通过Set集合的遍历方式遍历即可。
在这里插入图片描述

集合总结

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值