入门到入土,Java学习 day18(泛型,集合进阶2)

ArrayList集合底层原理

①利用空参创建的集合,在底层创建一个默认长度为0的数组

②添加第一个元素时,底层会创建一个新的长度为10的数组

③存满时,会扩容1.5倍

④如果一次添加多个元素,1.5倍还放不下,则新创建数组的长度以实际为准

LinkedList集合

底层数据结构是双链表,查询慢,首尾操作的速度是极快的

public void addFirst(E e) 在该列表开头插入指定的元素

public void addLast(E e) 将指定的元素追加到此列表的末尾

public E getFirst() 返回此列表中的第一个元素

public E getLast()返回此列表中的最后一个元素

public E removeFirst()从此列表中删除并返回第一个元素 day13

public E removeLast()从此列表中删除并返回最后一个元素

泛型

泛型:是JDK5中引入的特性,可以在编译阶段约束操作的数据类型,并进行检查。

泛型的格式:<数据类型>

注意:泛型只能支持引用数据类型

好处:统一数据类型,把运行时期的问题提前到了编译期间,避免了强制类型转换可能出现的异常,因为在编译阶段类型就能确定下来。

细节:不能写基本数据类型,指定泛型的具体类型后,传递数据,可以传入该类类型或者其子类类型,不小欸泛型类型默认是Object

泛型可以在很多地方进行定义,类后面泛型类,方法上面泛型方法,接口后面,泛型接口

泛型类

使用场景:当一个类中,某个变量的数据类型不确定时,就可以定义带有泛型的类

修饰符 class 类名<类型>{},类型写E什么的都行,表示不确定

泛型方法

方法中形参类型不确定时

使用类名后面定义的泛型,所有方法都能用

在方法申明上定义自己的泛型,只有本方法能用

泛型接口

如何使用,一种时实现类给出具体类型,另一种时实现类延续泛型,创建对象时再确定

泛型的继承和通配符

泛型不具备继承性,但是数据具备继承性

泛型的通配符:?

? extend E

? super E

使用场景:定义类,方法,接口的时候,如果类型不确定,就可以定义泛型,如果想类型不确定但是能知道是哪个继承体系中的,可以使用泛型的通配符

Set系列集合

1.Set系列集合的特点

无序、不重复、无索引

Set集合的方法上基本上与Collection的API一致

2.Set集合的实现类特点

HashSet:无序、不重复、无索引

底层采取哈希值存储数据,哈希表是一种对于增删改查数据性能都较好的结构

哈希表组成:JDK8之前是数组加链表,JDK8之后是数组加链表加红黑树

哈希值:对象的整数表现形式

根据hashCode方法算出来的int类型的整数

该方法定义在Object类中,所有对象都可以调用,默认使用地址值进行计算

一般情况下,会重写hashCode方法,利用对象内部的属性值计算哈希值

对象的哈希值特点

如果没有重写hashCode方法,不同对象计算出的哈希值是不同的

如果已经重写hashcode方法,不同的对象只要属性值相同,计算出的哈希值就是一样的,在小部分情况下,不同的属性值或者不同的地址值计算出来的哈希值也有可能一样。(哈希碰撞)

JDK8之前的底层原理

①创建一个默认长度16,默认加载因为0.75的数组,数组名table

②根据元素的哈希值跟数组的长度计算出应存入的位置

③判断当前位置是否为null,如果是null直接存入

④如果位置不为null,表示有元素,则调用equals方法比较属性值

⑤ 一样:不存 不一样:存入数组,形成链表

当链表长度大于8而且数组长度大于等于64自动转为红黑树

JDK8以前:新元素存入数组,老元素挂在新元素下面

JDK8以后:新元素直接挂在老元素下面

几个问题

HashSet为什么存和取的顺序不一样?

因为存的时候位置不确定,但是取的时候是遍历

HashSet为什么没有索引?

因为有链表,不可能链表上的索引都是一样的

HashSet是利用什么机制保证数据去重的?

利用HashCode方法和equals方法,重写

LinkedHashSet:有序、不重复、无索引

底层基于哈希表,也差不多,有序是因为使用了双向链表记录添加顺序

TreeSet:可排序、不重复、无索引

可排序:按照元素的默认规则从小到大排序

底层是基于红黑树的数据结构实现排序的,增删改查性能都好

对于数值类型:Integer,Double,默认按照从小到大的顺序进行排序。

对于字符、字符串类型:按照字符在ASCII码表中的数字升序进行排序。

排序规则一:

默认的排序规则,实体类中实现Comparable接口,重写里面的抽象方法,再指定比较规则

规则二:

比较器排序:创建对象时,传递比较器Comparator指定规则

总结:

1.如果想要集合中的元素可重复

用ArrayList集合,基于数组的。(用的最多)

2.如果想要集合中的元素可重复,而且当前的增删操作明显多于查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值