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里存的是一个集合,集合里存的是一个对象