java_数据结构

栈(先进后出)

理解:比作一个口的盒子,先放进去的东西在最下面,如果出去的话,会最后出去。

队列(先进先出)

理解:比作两个口的盒子。

数组(查询快、增删慢)

查询快:数组就一块空间,地址是连续的,首地址找到数组,索引找到数组内元素。
增删慢:因为数组长度固定,所以增删元素,会创建新数组,把原数组数据复制给新数组。原数组在 内存中被销毁。

链表(查询慢,增删快)

查询慢:地址不是连续的,每次查询都需要从头开始查询。
增删快:因为增删对链表的整体结构没有影响。
链表中每个元素称为一个节点,一个节点包括数据源(存储数组),两个指针域(存储地址,一个是自己地址,另一个是下一个节点地址)

  • 单向链表:只有一条链子,不能保证元素的顺序(存取顺序可能不一致),是无序的。

  • 双向链表:一条链子记录元素顺序,所以是有序的。

二叉树(分支≤两个)

二叉树

  • 排序树/查找树:在二叉树的基础上,元素是有大小顺序的,左子树小,右子树大,因为这个原因,索引查询速度很快。

  • 平衡树:左子树和右子树数量相等

  • 不平衡树:左子树和右子树数量不相等

  • 红黑树,查询速度非常快,查询叶子节点的 最大次数 不能 超过最小 次数2倍。

红黑树特点:
1、节点可以是红色的也可以是黑色的
2、跟节点是黑色的
3、叶子节点(空节点)是黑色的
4、每个红色的节点的子节点都是黑色的
5、任何一个节点到其每一个叶子节点的所有路径上的黑色节点数相同

哈希表

哈希表查询数据非常快,是因为本身数组的地址就是连续的,查询速度快,并且还将相同哈希值的数据分为了一组。
1.8之前:哈希表 = 数组 + 链表
1.8之后:哈希表 = 数组 + 链表 +红黑树
数组结构:是把元素进行了分组(相同哈希值的元素为一组)
链表/红黑树结构:是把相同哈希值的元素连接到一起

将数据存储到集合中:
先计算元素的哈希值(就是数据的存储位置),相同的哈希值的元素都放到一组。

哈希冲突:两个元素值不同,但是哈希值相同。比如“重地”、“通话”字符串的哈希值是相同的。

1.8之后,相同哈希值(存储地址)的个数操过了8位,就会将这个链表转成红黑树结构
示意图如下:
哈希表示意图

哈希值:

哈希值是一个十进制的整数,由系统随机给出(是对象的一个逻辑地址,是模拟出来得到的地址,不是数据实际存储的物理地址)。
Object类的hashCode方法可以获取对象的哈希值。
String重写了hashCode()方法

特殊的巧合:“重地”和“通话”巧合hash值相同

       String s1 = new String("a");
        String s2 = new String("a");
        System.out.println("s1:"+s1.hashCode());
        System.out.println("s2:"+s2.hashCode());
        System.out.println("重地:"+"重地".hashCode());//重地和通话巧合hash值相同
        System.out.println("通话:"+"通话".hashCode());    

输出为:

s1:97
s2:97
重地:1179395
通话:1179395
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值