数据结构
简单的介绍一下java里常用的数据结构
栈
先进后出,后进先出(类似子弹的结构)
压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
队列
队列:queue,简称队,它同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除。
同堆栈一样,也是一种运算受限的线性表,其限制是仅允许在表的一端进行插入,而在表的另一端进行删除
先进先出(类似火车过山洞,一侧入,一侧出)
数组
数组:Array,是有序的元素序列,数组是在内存中开辟一段连续的空间,并在此空间存放元素。就像是一排出租屋,有100个房间,从001到100每个房间都有固定编号,通过编号就可以快速找到租房子的人。
特点
查找元素快:通过索引,可以快速访问指定位置的元素
增删元素慢:每次曾删数组(因为数组的长度不可变),其实都会新建一个数组,再复制原数组来进行操作
链表
链表:linked list,由一系列结点node(链表中每一个元素称为结点)组成,结点可以在运行时i动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。(我们常说的链表有单向链表和双向链表,这里先说单向)
特点
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
增删元素快:增加元素:只需要修改连接下个元素的地址即可。
红黑树
红黑树是一种有意思的二叉树(二叉查找树)
红黑树:binary tree ,是每个结点不超过2的有序树(tree),类似于我们生活中的树结构,只是每个节点只有2个子节点。顶上的叫根结点,两边被称作“左子树”和“右子树”。
特点
提高搜索效率:红黑树的左节点比右节点小(左节点<根节点<右节点)
常用集合的数据结构特点
ArrayList集合
- 集合数据存储的结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以 ArrayList 是最常用的集合。
- ArrayList 内部是用 Object[]实现的,当我们 new 一个空参 ArrayList 的时候,系统内部使用了一个 new Object[10]数组(内存默认长度为10,size是获得逻辑长度,初始0),
- add方法,如果集合的长度 s 等于数组的长度则重新分配新数组,重新分配数组的时候需要计算新分配内存的空间大小,分配当前长度一半(s/2)的长度
LinkedList集合
- 集合数据存储的结构是链表结构。方便元素添加、删除的集合,适合一些添加与删除都处于首尾的操作,查询慢(从头到尾遍历)
HashSet集合
- 所存储的元素是不可重复的,并且元素都是无序的,底层的实现其实是一个HashMap 支持,根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。使用哈希表结构
LinkedHashSet集合
- 元素唯一,但是存储有序,底层结构采用哈希表+链表
HashMap
- HashMap:基于哈希表实现。使用 HashMap 要求添加的键类明确定义了 hashCode()和 equals(),可以调优初始容量和负载因子,可以通过通过 hashcode 对其内容进行快速查找,非线程安全
这里简单的讲一下HashMap,因为该集合面试常常被问的比较多
- 哈希表:数组+链表,我们将有限个数组,看做一个个桶,这些桶的编号就是key(键)的哈希值,当我们存储对象的时候,计算key的哈希值,找到对应的桶(数组位)存进去,如果发生哈希冲突(两个key的哈希值相同,则通过链表(单链表)的方式将数据一个一个挂起来,而到了JDK1.8之后,同一个位置的数据超过8个,则使用红黑树存储哈希冲突的数据)
- 关于扩容:扩容方面涉及的点比较多,因为篇幅问题不在这里展开,后续有机会单独列一篇。不过如果真被面试问到了,可以答每次扩容都是2的幂,为什么要这么设计呢?因为在HashMap通过键的哈希值进行定位桶位置的时候,会调用下列方法:
static int indexFor(int h, int length) {
return h & (length-1);
}
- 可以看到这里是将哈希值h与桶数组的length-1(实际上也是map的容量-1)进行了一个位运算得出了对应的桶的位置,h & (length-1)。
(java中%、/操作比&慢10倍左右,因此采用&运算会提高性能。)
LinkedHashMap
存储有序,链表+哈希表结构,他是 HashMap 的子类
TreeMap
- 基于红黑树实现。TreeMap 没有调优选项,因为该树总处于平衡状态。TreeMap 中所有的元素都保持着某种固定的顺序,如果需要得到一个有序的结果就应该使用TreeMap,线程安全