Day19 03.20 泛型 HashSet TreeSet

03.20
Day 19

集合框架

泛型

object数组只能存对象,1不是对象基本数据类型。将1转化为integer存放在Object数组
自动装箱
在这里插入图片描述
list。add();添加数据
list。get();取出数据

在集合中存放数据的时候可以存放任何数据类型的数据,底层是一个Object,取出数据的时候默认也是Object对象。如果要将当前对象转化为要使用的对象必须知道取出来的值是什么类型的。
不然经常出现java.lang.ClassCastException

add添加的是user对象,
在这里插入图片描述
E:
T:type
K:KEY
V:value

泛型在定义了接口是指定参数类型,这个参数类型默认用E(element)来表示元素,类型参数值是在申明变量或者创建对象的时候确定。

如果给集合指定泛型,那就意味着操作内容就必须传递指定的参数类型。在获取集合中的数据的时候可以不用再转化为对象类型,默认就返回传递的泛型类型。

E表示一个占位符。

问题:
一旦确定了参数类型泛型就确定了。传递参数的时候必须跟泛型同样的数据。

List <User> list =  new ArrayList <User>();

场景:在公司员工领导我们要在不同情况下表示不同泛型怎么办?

List <?> list = new ArrayList ();

通过?来设置占位符,在运行时再确定具体的内容。根据子类的泛型来确定父类的泛型。
在这里插入图片描述

在这里插入图片描述

set接口

set继承collection
1、set存放的元素不能重复出现,当加入一个元素到容器中,要比较元素的内容是否重复,自动去掉重复的内容。如果存放的是对象,比较对象是否一样,需要重写hashcode和equals方法
2、存放在容器中的元素可能有顺序,也可能没顺序。
3、元素在容器中没有顺序,所以我们不能通过下标获取里面的元素、

set有两个实现类 hashset treeset

hashset

hashset基于hash算法的set接口实现
1、set元素不能重复
2、元素没有顺序
3、不能使用get 、 set 随机访问
4、元素允许为null

在hashset集合中存放对象,只要调用add方法进行比较,调用对象hashcode方法和equals方法比较对象是否一样,如果一样的不会存放进去。

判断两个对象是否相等:
1、set判断两个对象的hashcode码是否一样(hashcode一旦确定,元素在内存中位置也将确定下来,桶运算),如果两个hashcode码不一样,两个对象不相等。
2、如果hashcode码相等,在调用对象的equals方法来比较值是否相等。如果值相等,才能确定这两个对象相等。

深入挖掘:
hashset数据结构:采用了hash表
jdk 1.8之前:哈希表=数组+链表
jdk 1.8及之后: 哈希表=数组+链表
数组+红黑树(查询效率非常快)
jdk 1.8中,hash存储采用数组+链表+红黑树来存数据,当产生hash冲突的时候(hash值一样,但是内容却不一样)值就会用链表来存,但是链表长度超过8的时候,自动变成红黑树来进行排序。

没办法通过get去获取,只能通过循环去获取
在这里插入图片描述

判断是否存在当前数据在这里插入图片描述

判断是否为空
在这里插入图片描述
泛型集合
将对象存放在set集合中,对象的引用是一样的,去重
存放 的时候对象的引用是不同的,set集合识别三两个不同的对象
在这里插入图片描述

判断set对象集合中是否相等,需要在类中重写hashCode与equals

String已经重写过hashcode码
在这里插入图片描述
在这里插入图片描述
哈希冲突:hashcode码一样
hashcode码的值 在当前内存处 放入对象的引用
在这里插入图片描述

Treeset

在这里插入图片描述
1、可以允许排序的一种集合,,继承SortedSet接口
2、元素也是不能重复
3、底层是基于treemap来实现,基于红黑树算法。treeset的数据来源于treemap的key值,采用自然排序或自定义排序

了解红黑树。

treeset 添加数据 获取第一个数据 获取最后一个数据
在这里插入图片描述
特点:
在存储数据的时候,存放的数据是数值或者字符串(本身有排序算法),按照默认排序(自然排序)。
存放的数据是对象的时候,treeset默认是不知道你的对象怎么比较,需要存放的对象身上实现Comparable,重写ComparaTo方法来实现自定义的排序
Comparable称为比较器。常用于集合框架里面

迭代器

iterator接口称为迭代器,用于遍历集合的一种接口,
遍历:从集合中取出每一个元素的过程,在connection中有一个对象iterator对象,通过这个对象可以遍历集合中的所有元素
提供给集合用,输出数据

所有的集合类都可以使用迭代器来完成数据的获取
通过调用iterator获取到迭代器接口对象,返回迭代器泛型,值根据集合的泛型来定
next方法可以获取到集合中的元素
while(it。hasNext)
通过循环获取到集合中所有的元素
在这里插入图片描述

Collections

集合翻转
在这里插入图片描述
集合排序
在这里插入图片描述

collection与collections
collections:集合工具包,用于操作collection所定义的各种集合。所有的方法都是静态的,排序、反转、对元素进行搜素,线程安全的内容。
collection:接口,集合的顶层框架,主要用于制定集合的规范

Map接口

在这里插入图片描述
在这里插入图片描述
由一些列键值对组成的集合,提供了Key-value的映射,它并没有继承collection,
特点:
1、key-value有一 一对应的关系,一个key对应唯一的值
2、因为map的键采用set来存放,键不能重复,value可以一样
3、HashMap和treeMap hashMap hash算法 ,TreeMap采用树结构(红黑)
4、如果经map的所有key放在一起,那就是一个set集合,key可能有顺序,可能没顺序。
5、如果将所有的值取出来放在一起,变成一个collection

分析源码:
1、hashmap基于hash表来实现的,数组+链表(单链) 数组+红黑
2、底层采用entey(jdk 1.7以及以前 1.8 node来表示)+链表
3、HashMap采用key-value的形式来存数据,允许为null,但是只能出现一次
4、HashMap县城不安全
5、HashMap存入的顺序和取出的顺序可能不一样
6、H
.ashMap保存数据的时候,根据key的hash值来确定存的位置
分析代码的属性和方法:
1、initialCapacity:初始容量,值得是hashmap在初始化的时候自身的容量,可以在构造方法中传递进来,如果你不指定值,默认16
2、size:当前hashmap的键值对数量
3、loadfactor(default-load_factor):当hashmap的值到达一定的范围后,就要开始扩容,加载因子默认是0.75,也可以通过构造来指定加载因子,比如默认容量为16,0.7516=12,当你容量到达12的时候,就要开始考虑扩容。
4、threshold:扩容阀值:一般默认扩容为原来的2倍。
扩容阀值=hashmap总量
加载因子

map取数据的时候一般单个单个取

没有定义泛型的时候,键可以任何泛型,值也可以任何泛型在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
获取到所有的值在这里插入图片描述
匹配集合中是否存在键和值在这里插入图片描述
key就是hashcode

map里存的是一个集合,集合里存的是一个对象
在这里插入图片描述

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,根据您的要求,以下是Python代码实现: ``` import csv constellation_list = [ ('Aries', '03.21-04.19'), ('Taurus', '04.20-05.20'), ('Gemini', '05.21-06.21'), ('Cancer', '06.22-07.22'), ('Leo', '07.23-08.22'), ('Virgo', '08.23-09.22'), ('Libra', '09.23-10.23'), ('Scorpio', '10.24-11.22'), ('Sagittarius', '11.23-12.21'), ('Capricorn', '12.22-01.19'), ('Aquarius', '01.20-02.18'), ('Pisces', '02.19-03.20') ] def get_constellation(month, day): day_in_month = [ 0, # 0 位未使用 20, # 1 - 1 月 50, # 2 - 2 月 79, # 3 - 3 月 110, # 4 - 4 月 141, # 5 - 5 月 172, # 6 - 6 月 203, # 7 - 7 月 234, # 8 - 8 月 265, # 9 - 9 月 295, # 10 - 10 月 325, # 11 - 11 月 355, # 12 - 12 月 ] if month < 1 or month > 12 or day < 1 or day > 31: return "输入日期错误!" if day < day_in_month[month]: return constellation_list[month-1][0] else: return constellation_list[month][0] def get_constellation_by_date(date): try: year = int(date[0:4]) month = int(date[4:6]) day = int(date[6:8]) except: return "输入日期错误!" return get_constellation(month, day) with open('const.csv', 'r', encoding="UTF-8") as csvfile: reader = csv.reader(csvfile) for row in reader: name = row[0] month = int(row[1]) day = int(row[2]) correct_name = get_constellation(month, day) if correct_name != name: print('有错:{} 的生日是{}月{}日,应该是{}座,而不是{}座'.format(name, month, day, correct_name, name)) print(get_constellation_by_date('19930918')) print(get_constellation_by_date('20200231')) ``` 上面的代码中,我们在代码最开始定义了星座列表`constellation_list`,里面存放了每个星座的名字及其起止日期。 接着,我们定义了一个`get_constellation()`函数,用于根据月份和日期计算对应的星座名称。该函数的实现过程为:首先,创建了一个存放每月最后一天的列表`day_in_month`,其中0位未使用,1~12位为相应月份的最后一天;然后,如果输入的月份或日期不合法,就返回一个“输入日期错误!”的提示;否则,当输入的日期小于相应月份的最后一天时,返回相应的星座名称,否则返回下一个月份的星座名称。 接着,我们定义了一个`get_constellation_by_date()`函数,用于读取`const.csv`文件并根据用户输入的出生日期获取对应的星座名称。该函数首先尝试将输入日期的年、月、日解析成整数,如果出错则返回一个“输入日期错误!”的提示;否则,调用`get_constellation()`函数计算对应的星座名称并返回。 最后,我们读取了`const.csv`文件并分别调用了`get_constellation_by_date()`函数获取了两个日期的星座名称,分别为白羊座和“输入日期错误!”(因为2月份只有28/29天,而这里输入的是30号,所以日期不合法)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值