JAVA基础篇List集合&数据结构

本文介绍了JAVA中List接口的特性,包括有序性、索引和可重复性,并探讨了ArrayList和LinkedList的实现原理及操作特点。同时,文章讲解了数据结构的基础知识,如栈、队列、数组、链表和二叉树,以及ArrayList和LinkedList的底层数据结构。最后,文章提到了HashSet和哈希表的概念,以及Collections的shuffle和sort方法,包括自然排序和比较器排序的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

List的概述 list是一个接口,是Collection的子接口
List接口有以下三个特点,有序(有序不是排序,有序指的是按照什么顺序存的就按照什么顺序取)
有索引(可以根据索引获取元素)
可以重复(可以存放重复元素)
List是一个接口,如果要用,需要使用实现类,最常用的实现类是ArrayList

List接口中的常见方法
public void add(int index,E element) 将指定的元素,添加到该集合中的指定位置上
public E get(int index) 返回集合中指定位置的元素
public E remove(int index) 移除列表中指定位置的元素,返回的是被移除的元素
public E set(int index,E element) 用指定元素替换集合中指定位置的元素,返回值的更新前的元素

数据结构
数据接口介绍
数据结构:数据用什么样的方式组合在一起
数据结构就是存储数据的方式,容器使用的数据结构不同,容器的特点就不同
常见的数据结构
栈结构特点 先进先出,生活中栈结构的例子,弹夹
专业名词 压栈 弹栈

队列结构的特点:跟栈完全相反,先进先出,生活中队列的例子 排队取钱

数组的特点:查询快,增删慢 ,为什么查询快,因为数组在内存中是连续存储的,连续存储指的是数组中的元素在内存中是相邻的,这样就可以根据上一个元素的地址值计算出下一个元素的地址值

为什么增删慢 数组的长度是固定的,每次进行增删操作需要创建一个新的数组

链表是由很多节点组成的,每一个节点至少有两个内容,真正保存的数据,指向下个节点的地址值
列表的特点:查询慢,增删快
为什么查询慢,链表在内存中是离散存储的,离散存储指的是链表中的节点在内存中是不相邻的,这样的话 如果想找到某个节点,必须先找到它的前一个节点
为什么增删块,如果进行增删操作,更改节点中的地址值即可

红黑树 它是由很多节点组成,没有分叉的节点叫做叶子节点
树中还有一个分类叫做二叉树,如果树中的每个节点最多只有两个子节点,那么这个树就是一个二叉树

在二叉树中有一种树叫做二叉搜索树,在二叉树的基础上多了一个排序功能

二叉搜索树的特点左边的都比根节点小,右边的都比根节点大

二叉搜索树中还有一种树,叫做平衡二叉查找树,在二叉查找树的基础上多了平衡的功能

在这里插入图片描述
如果最高的叶子节点和最低的叶子节点的高度超不过1,那么就是一个平衡树
在平衡二叉查找树中有一个分类,叫做红黑树,红黑树是自平衡二叉查找树,如果向红黑树中添加数据,红黑树会自动维持

ArrayList是List接口下的一个实现类
ArrayList底层使用数组来保存数据
LinkedList也是List接口的一个实现类,LinkedList底层使用双向链表来保存数据
特点:查询慢,增删快
LinkedList中的特有功能
public void addFirst(E e) 将指定元素插入此列表的开头
public void addLast(E e) 将指定元素添加到此列表的结尾
public E getFirst() 返回此列表的第一个元素
public E getLast() 返回此列表的最后一个元素
public E removeFirst() 移除并返回此列表的第一个元素
public E removeLast() 移除并返回此列表的最后一个元素
public E pop() 从此列表所表示的堆栈处弹出一个元素
public void push(E e) 将元素推入此列表所标书的堆栈

Set接口
set是Collection下面的子接口
Set接口有以下特点 无序(值是怎么存,不一定怎么取)
无索引(不能根据索引获取元素)
不可重复(不能存放重复的元素)

Set是一个接口,如果要使用,需要使用实现类,最常用的实现类是HashSet

HashSet是set接口下的一个实现类,满足Set接口的所有特点
因为Set接口下的集合是没有索引的,如果要遍历,需要使用迭代器或者增强for循环

哈希值其实就是一个int数字,可以把哈希值看成对象的一个标识,一个特征码。
在Object中,有一个方法叫做HashCode获取对象的哈希值
Object中的hashCode是根据地址值计算的象的哈希值

一般来说哈希值根据地址值进行计算没有意义,一般会根据对象的属性计算对象的哈希值,如果两个对象的属性相同,那么哈希值也应该相同,对象的哈希值允许重复

如果想要自己定义哈希值的计算规则,那么需要重写hashCode方法,对象的哈希值根据对象的属性值进行计算,两个对象象的属性完全相同,那么哈希值也应该相同

小结
哈希值就是一个int数子,可以看成对象的特征码
调用对象的hashCode可以获取哈希值
如果想要自己定义哈希值的计算规则,可以重写HashCode方法对象的哈希值允许重复

哈希表的概述
将来数组中保存的是对象,对象的特征码是哈希值,哈希值的取值范围(-21~21亿)一共有42亿中,如果根据对象的哈希值进行分类,要分成42亿中,需要创建长度是42亿的数组

如果想要根据哈希值进行归并,可以使用取余的方式

数组中的每一个元素都是链表
哈希表就是很多数据归并分类组成的 哈希表就是一个数组,他是如何一个索引保存的这个么多元素的,,因为他的每一个元素都是一个链表
在这里插入图片描述

在JDK8的时候,如果链表长度超过8,那么会自动变成一个链表
哈希表的概念,哈希表是一个数组,数组中的每一个元素都是一个链表
桶:哈希表中的每一个元素(链表)都是一个桶
哈希冲突 如果两个对象出现在了同一个桶内,那么这个就表示出现了哈希冲突
加载因为 是一个百分比,默认是0.75,如果哈希表中的使用超过了加载因子,就会进行再哈希
再哈希 对哈希表进行扩充,让分类更广

哈希表判断唯一性的过程
先比较两个对象的哈希值
如果两个对象的哈希值不同,那么一定不是同一个对象
如果两个对象的哈希值相同,那么不一定是同一个对象

如果对象的哈希值相同,那么嗨需要通过equals进行比较
如果两个对象通过equals比较的结果是true,表示两个对象是同一个对象
如果两个对象通过equals比较的结果是false,表示两个对象不是同一个对象

HashSet判断唯一性的过程,先比较对象的哈希值,如果两个对象的哈希值不同,那么肯定不是一个对象,如果两个对象的哈希值相同,那么不一定是同一个对象

如果两个对象的哈希值相同,那么还需要使用equals,true表示同一个对象 反之则不是同一个对象

结论 如果使用HashSet存储自定义对象并要保证唯一性(属性相同就看成是同一个对象)注意 前提是 对象重写了HashCode和equals

LinkedHashSet是Set接口下的另一个实现类
LinkedHashSet内部出了有一个哈希表之外,还有一个链表,链表的作用是保证有序
Set接口是无序的,但是它不能保证所有的实现类都无序

Collections 的概述 他是一个工具类,用来操作集合的工具类
常用方法
static void shuffle(List list) 打乱集合元素的顺序
static void sort(List list ) 对集合的内容进行排序(自然排序)
static void sort(List list,Comparator c) 对集合中的内容进行排序(比较器排序)第一个参数是要排序的集合

第二个参数是比较器
使用sort进行排序的集合,里面的元素一定要实现Comparable接口
对象必须具备比较的功能才能进行排序,这种排序叫自然排序 自然排序指的是对象本身就具备比较的功能,然后进行排序

当调用Collections的sort方法进行排序时,内部会自动调用对象的compareTo方法
如果该方法返回值是正数,那么表示调用者对象大于参数对象
如果该方法返回值是0,表示两个对象相等,如果该方法返回值是负数,表示调用者对象小于参数对象

公式 升序就是我(调用者)减它(参数)根据对象的什么属性进行排序,那么就让对象的什么属性相减

Collections中比较器排序的方法
static void sort(List list,Comparator c) 对集合的内容进行排序(比较器排序),第一个参数是要排序的集合

如果某个对象没有实现Comparable接口,那么表示该对象本身并不具备比较的功能,那么不能自己排序(不能使用自然排序)此时需要找一个法官帮对象进行排序,这个法官就是比较器,如果使用比较器比较对象谁大谁小,这种排序方式就叫做比较器排序

当使用Collections的sort反复噶进行比较器排序的时候,内部会自动调用compare方法比较对象谁大谁小
如果返回值是正数,表示第一个对象大于第二个对象
如果返回值是0,表示两个对象相等
如果返回的是负数,表第一个对象小于第二个对象

排序公式
升序就是第一个参数减第二个参数
根据哪个属性排序,那么就让对象的什么属性相减

自然排序和比较器排序的区别
自然排序:对象本身就具备比较的功能,那么可以使用自然排序的方法进行自然排序,如果一个类实现了Comparable接口,表示该类的对象就具备了比较的功能

比较器:如果对象本身不具备比较的功能,那么可以找一个法官帮这些对象进行比较,这个法官就是比较器
如果一个类实现了Comparator接口,那么这类就表示比较器了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值