栈(先进后出)
理解:比作一个口的盒子,先放进去的东西在最下面,如果出去的话,会最后出去。
队列(先进先出)
理解:比作两个口的盒子。
数组(查询快、增删慢)
查询快:数组就一块空间,地址是连续的,首地址找到数组,索引找到数组内元素。
增删慢:因为数组长度固定,所以增删元素,会创建新数组,把原数组数据复制给新数组。原数组在 内存中被销毁。
链表(查询慢,增删快)
查询慢:地址不是连续的,每次查询都需要从头开始查询。
增删快:因为增删对链表的整体结构没有影响。
链表中每个元素称为一个节点,一个节点包括数据源(存储数组),两个指针域(存储地址,一个是自己地址,另一个是下一个节点地址)
二叉树(分支≤两个)
-
排序树/查找树:在二叉树的基础上,元素是有大小顺序的,左子树小,右子树大,因为这个原因,索引查询速度很快。
-
平衡树:左子树和右子树数量相等
-
不平衡树:左子树和右子树数量不相等
-
红黑树,查询速度非常快,查询叶子节点的 最大次数 不能 超过最小 次数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