1. 栈结构

1) 特点:

	1. 运算受限的线性表,其限制是仅允许在标的一端进行插入和删除操作,不允许在其他任何位置进行添加、查找、删除等操作
	
	2. 先近后出,第一个进去的,最后一个出来,最后进去的最先出来。

栈结构:
在这里插入图片描述

	压栈:	存元素。把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。

	弹栈:	取元素。把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。

2. 队列结构

1) 特点:

	1.	运算受限。仅允许在标的一端进行插入,而在表的另一端进行删除。
		
	2.	先近先出,先进去的先出来,最后进去的最后出来。

队列结构:
在这里插入图片描述

	队列有2个基本操作:
	在队列的尾部加入一个元素,或者是在队列的头部移除一个元素。

	也就是说,队列以一种先进先出的方式管理数据,如果你试图向一个已经满了的阻塞队列中添加一个元素或者是从一个空的阻塞队列中移除一个元索,将导致线程阻塞。

	在多线程进行合作时,阻塞队列是很有用的工具。工作者线程可以定期地把中间结果存到阻塞队列中,而其他工作者线线程把中间结果取出并在将来修改它们。

	队列会自动平衡负载。如果第一个线程集运行得比第二个慢,则第二个线程集在等待结果时就会阻塞。如果第一个线程集运行得快,那么它将等待第二个线程集赶上来。

2) 基本方法

1.	add()		//增加一个元索,如果队列已满,则抛出一个IllegalStateException异常

2.	remove()		//移除并返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常

3.	element()		//返回队列头部的元素,如果队列为空,则抛出一个NoSuchElementException异常

4.	offer()		//添加一个元素并返回true,如果队列已满,则返回false

5.	poll()		//移除并返问队列头部的元素,如果队列为空,则返回null

6.	peek()		//返回队列头部的元素,如果队列为空,则返回null

7.	put()		//添加一个元素,如果队列已满,则阻塞

8.	take()		//移除并返回队列头部的元素,如果队列为空,则阻塞
		         					 
		         					  
		         
注意点: 
	1) add() 、 offer() 和 put()  都是添加一个元素,但如果队列已满,add() 会抛出异常,offer() 会返回false, put() 会 阻塞。
	
	2)remove() 、pool() 和 take()  都是移除队列头部的元素,但如果队列已经没有元素,remove() 会抛出异常,pool() 会返回 null,take() 会阻塞。

	3)element() 和 peek() 都是 返回队列头部的元素,但是如果队列为空, element() 会抛出异常, peek() 会返回 null。 

3. 数组结构

1) 特点:

1.	有序的元素序列,在内存中开辟一段连续的空间,并在此空间存放元素。	

2. 连续存放,长度固定。		

3.	查询快,增删慢。

	查询快的原因:
			数组在内存中是连续存储的,可以根据索引直接定位到某个确定的元素。我们常说的数组的地址值其实是数组首个元素的地址值。

	增删慢的原因:
			数组的长度是不可变的,每一次对数组长度的操作,都需要创建一个新的数组。将原数组的数据根据情况复制到新数组中。

数组结构:
在这里插入图片描述

4. 链表结构

1) 特点:

		1.	查询慢,增删快
		
		2.	链表结构是由很多节点组成的,
			每一个节点最少包括2部分:一部分是存储数据的,另一部分是指向下个节点的地址值。

		查询慢的原因:
					链表中的每个元素在内存中是离散存储的,只能通过上一个节点才可以找到下一个节点。

		增删快的原因:
					如果要增删元素,直接改变元素下个节点对应的地址值就可以。

链表结构:
在这里插入图片描述

5. 哈希表

1) 特点

	1.	哈希表的底层是一个数组,数组中的每个元素都是一个链表。在jdk1.8及以后,如果链表的长度超过了8,那么这个链表会自动变成红黑树结构。
	
	2.	桶: 数组中的每一个元素都是一个桶。因为数组中的每个元素都是一个链表,所以对应的这个链表都是一个桶。

	3.	哈希冲突:出现在同一个桶内的对象,就是哈希冲突,哪怕这些对象的哈希值不一样也是。

	4.	加载因子: 是一个百分比,默认是0.75。当哈希表内某个桶的使用比例超过加载因子(也就是桶内的内容太多)时,就会进行再哈希。

	5.	再哈希:对哈希表进行扩容,让分类更广泛。

6. 红黑树结构

1) 树结构

根节点:	最上面的节点,叫做 根节点。
子节点:	根节点下面的节点,叫做	子节点。
叶节点:	没有子节点的节点,叫做	叶节点。

2) 二叉树

	如果一个树的节点最多只有2个,那么这个树就是二叉树。

3) 二叉查找树

	如果	一个二叉树具有排序功能,那么这个二叉树就是一个 二叉查找树。

4) 平衡树

	如果	一个树的根节点的左子树和右子树的高度差不大于1,那么这个树就是一个平衡树。

5) 红黑树

	红黑树是一个平衡的二叉查找树。

树结构:
在这里插入图片描述

7. 并发数据结构

1) 线程安全列表

	CopyOnWriteArrayList		写时复制,适合读多写少场景

2) 线程安全队列

ConcurrentLinkedQueue		非阻塞队列,通过CAS 实现
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐