Collections接口的总结和五种常见的数据结构

Collections接口的总结和五种常见的数据结构

学的不精,如有错误,欢迎指正。

五种常见的数据结构

为了理解Collections实现类的特性,需要了解这五种常见(在列表方面)的数据结构类型。

栈的特点为先进后出

由于栈的入口和出口只有一个且是共用的,先进去的数据(方法)会放在栈的最底层,这的进入栈的动作叫做进栈(也叫做压栈),后进入的数据会依次叠加在先进入栈的数据之上。当要释放数据时,最上面的数据会先离开栈,这个动作叫做出栈(也叫做弹栈)。

你可以构想一个场景:往水杯里放置东西,最先放的东西在水杯最底部,当往杯子里又放了其他东西之后,最先放进去的东西(下层的)就无法直接取出来,唯一的方法就是把后放进去的东西(上层的)先取出来,直到最下层的东西上部没有其他东西时,才能取出最先放进去的东西(下层的东西)。

队列

队列的特点为先进先出

数组

数组的特点是查询快,增删慢

查询快的原因是数组的地址是连续的。
增删慢的原因是数组的长度是固定的,每次修改都会在内存区新建一个数组,再回收上一个数组。

链表

链表有两种:单向链表和双向链表。
链表的特点是增删快,查询慢
增删快的原因是链表长度不固定,可直接在当前链表上操作。
查询慢的原因是其每个数据的地址不连续。

单向链表图解:
ㅤㅤ①ㅤㅤㅤ②ㅤㅤㅤ③

0x11数据10x22

ㅤㅤㅤㅤㅤㅤ↓

0x22数据20x33

ㅤㅤㅤㅤㅤㅤ↓

0x33数据30x44

其中
①代表当前数据的地址
②代表当前数据的内容
③代表当前数据所链接的下个数据的地址
注:链表结构下的数据与数据之间的地址是无规律可循的,上述地址举例只是随意列写的数字!
双向链表暂不举例。

红黑树

红黑树是一种二叉查找树,可以保证每一条长的路径不超过短的路径的两倍。具体不深入,因为我不会。

Collections接口的各个子接口

1. List

三大特点:
1.有序的
2.带索引的
3.可重复的

ArrayList

其底层是一个数组结构,所以ArrayList列表查询快,增删慢。

LinkedList

其底层是一个链表结构,所以LinkedList列表查询慢,增删快。

Victor

在JDK1.2+被ArrayList代替。

2. Set

1.没有索引
2.不允许有重复元素

HashSet

由哈希表实现,不保证迭代顺序恒久不变。
特点:
1.速度快(底层是哈希表结构)
2.无索引
3.无序
4.元素不能重复
5.可以使用null元素

元素不能重复的原因
我们来探究一下HashSet集合不允许有重复元素的原因。
Set集合在调用add();方法的时候会默认调用元素的hashCode方法和equals方法,以判断元素是否有重复。
++操作过程++:

//创建HashSet集合对象
HashSet<String> set = new HashSet<>();
set.add("aaa");

调用add方法时,获取到字符串"aaa"的hashCode值,然后在集合中寻找是否有相同的hashCode存在,如果没有,则直接加入字符串,如果有,则通话会调用equals方法判断是否系哈希冲突造成的哈希值重复,是,则存储字符串,否则不存储。

注:set集合存储元素不重复的前提条件:存储的元素必须重写hashCode();方法和equals();方法.

哈希表
哈希值

十进制整数,由系统随机给出。用于模拟对象的逻辑地址(非实际地址)。
int hashCode()返回对象的哈希码值。
字符串类的哈希值
字符串类中的hashCode被重写过,具体不展开。

哈希表存储数据的结构(哈希表)

JDK1.8- 哈希表=数组+链表
JDK1.8+ 哈希表=数组+红黑树(提高了查询的速度)

存储数据到集合中的操作过程:

1.通过hashCode计算元素的哈希值

例如:abc的hashCode=96354;重地=1179395;通话=1179395。
其中我们发现重地和通话的哈希值相等。我们把这种元素不同哈希值相同的情况称之为哈希冲突。

将哈希值放入数组,并根据元素的哈希值将元素挂载到相应数组下。

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

重地和通话的关系是链表关系

可以通过哈希值找到对应数组元素,所以查询很快。

注:JDK1.8+ 如果数组存储的下挂元素超过8位,就会将链表结构自动转化成红黑树结构。(目的是提高查询速度)。

LinkedHashSet

LinkedHashSet extends HashSet
底层:哈希表+链表(比HashSet多了一条链表,用来记录元素的存储数据,可以保证元素有序)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值