1.集合框架图

集合主要是两种:单列集合,双列集合;

collection的两个子接口:list,set都是属于单列集合;

map接口的实现子类是双列集合;

image-20241015204325925

image-20241015204458234

2.集合基本入门

new一个arraylist对象,调用这个对象里面的方法,去往这个对象集合里面添加新的元素:我们可以看到,使用这个add方法添加新的元素的时候,这个数据类型是不一样的,这个也是和数组的一个区别,我们的数组里面的数据类型必须是一样的,因为这个数组的类型就是确定的;

list.remove表示移除对应下标位置的元素;

list.size表示的就是打印这个集合里面的这个元素的个数;

list.empty就是判断这个集合是不是空的;

listclear是清空这个集合里面的所有的元素;

image-20241015211414828

下面的这个主要介绍我们的这个addAll方法,这个方法的参数就可以是一个集合:

我们上面把这个list清空了,这个时候我们创建了一个list2结合,向这个结合里面插入数据,调用这个addAll方法就可以把这个list2集合里面的内容拷贝到list里面去;

image-20241015211428672

3.迭代器遍历

3.1基本介绍

下面的这个就是迭代器的执行原理:首先我们需要判断这个hasNaext是不是存在下一个元素,然后使用这个next得到下一个元素,这个同时我们的指针也是需要进行下移的;

image-20241015211221334

3.2案例引入

首先我们创建一个对象,这个对象里面包含了三个属性,还要加上这个构造器,以及这个构造函数(带参数的)等等内容;

我们在这个主方法里面调用这个带参数的构造方法进行这个类的实例化创建对象,最后打印这个col集合里面的内容;

image-20241015212406556

3.3迭代器引入

迭代器就是用来对于这个集合里面的元素进行遍历的,这个时候使用的下面的这个迭代器的方式就可以遍历这个集合列表,打印输出遍历到的每一个元素;

image-20241015213043841

下面的这个就是在原有的基础上面把这个指针重置,然后对于这个集合里面的内容重新遍历;

image-20241015213551332

3.4集合增强for使用

这个for增强本质就是迭代器,进入他的底层调用的就是我们的迭代器的方法,对于这个for里面的这个内容的写法,我们可以和数组的进行类比:Object表示数据类型,book就是遍历的每一个元素的名字,col就是这个集合的名字;

image-20241015214129282

image-20241015213958659

4.list接口的方法

这个接口实现了很多的方法,但是我们之前基本上都学习过,因此这个时候我们只是简单的看一下:

下面的这个就是new一个arraylist对象,使用我们的这个list进行接收,然后往这个列表里面插入数据;

image-20241016111924088

list.get(3)表示打印的是这个列表里面的3下标的数据,我们的这个列表里面是可以插入重复的元素,也可以插入null数值的;

我们也可以在这个指定位置插入,第一个参数就是下标,第二个参数就是插入的内容,除此之外,这个还有indexof,lastindexof等等方法,这个之前我们都是见过的,就是换了一个结构罢了,但是这个方法实现的功能都是确定的;

image-20241016111939543

下面的这个就是韩老师上课的一个案例:这个案例是针对三本书的价格进行排序,使用的排序的方法就是冒泡排序,下面的这个冒泡排序大家应该很熟悉了,主要就是这个list里面使用的是这个set进行这个数据交换的;

原来的这个book1是这个j下标的引用,book2是j+1下标的引用,这个时候我们想要进行交换,就可以使用这个set方法对于这个引用的指向进行改变,我们把这个book2指向这个j下标的内容b00k1指向这个j+1的内容;

image-20241016112709479

5.ArrayList介绍

5.1底层源码规律

1.ArrayList里面的这个数据实际上是一个Object类型的数组elementData[];

transient表示短暂的,不会被序列化;

synchronized表示的是线程安全,但是我们的这个ArrayList没有这个线程安全;

2.创建ArrayList对象的时候,如果使用无参构造器,这个时候容量就是0,当我们添加数据的时候,这个容量就是10,加满之后按照1.5倍进行扩容;

3.使用有参数的构造器,就会开辟指定参数大小的空间,然后不够了按照1.5倍进行扩容;

5.2底层源码分析

我们定义一个列表,向这个列表里面插入数据,我们使用循环往这个列表里面插入15个数据,因为这个默认的是10大小空间,因此这个时候就会扩容;

当我们加到10个之后,这个时候第一次的空间就不够了,会进行二次扩容,10+10/2就是15个大小空间,我们在这个循环的外面再次插入数据,就会进行第三次扩容操作;

image-20241016125130115

首先我们插入的数据会被转换为integer类型的,是用的就是这个valueOf方法进行转换的

image-20241016133845739

这个modcount++是进行这个集合的修改次数的计算

image-20241016134036768

这个里面会取判断我们的这个数组是不是空的,因为我们这个时候数组列表里面没有任何元素,这个时候就会进入这个grow方法里面去;

image-20241016134133249

在这个grow方法里面,我们会进行这个数组容量的更新,如果本来是就有元素,就不会进入这个里面,进入这个里面说明我们的这个空间不够了,是进行的扩容操作;在最开始插入第一个元素的时候,会进入这个grow里面去,当我们的最开始的10不够的时候,就会再次扩容,这个里面的oldCapacity>>1就是进行的/2的操作,加上原来的之后,这个新的容量就是我们的原来的容量的1.5倍;

image-20241016170400685

5.3显示全部数据的IDEA设置

我们在这个调试的过程里面,可能会遇到下面的这个情况,就是我们扩容之后的这个数据没有显示出来,这个时候我们只需要进行下面的这个配置即可;

下面的这个hide其实是需要取消勾选的,我的这个默认的情况下就是勾选上的,我们需要保证这两个选项是没有勾选的;

image-20241016130349013

通过上面的这个设置我们想要看到的效果就是我们的null也可以显示出来,我们的15扩容之后就是15+15/2=22,这个时候全部的数据就显示出来了,即使是空的,也是显示,方便我们看这个现象更加直观;

image-20241016130509463

我们没进行这个设置的时候这个Object[22]@599就已经显示出来这个这个列表的大小:就是22,但是我们没有进行设置的时候,这个null就不会显示出来,我们上面的这个设置效果就是为了把这个即使是空的数据也要显示出来,方便我们进行调试,因为这个IDEA里面的这个默认显示的是被阉割的,并不是完整的,而是已经有的不是空的数据;

image-20241016131536193
ull就不会显示出来,我们上面的这个设置效果就是为了把这个即使是空的数据也要显示出来,方便我们进行调试,因为这个IDEA里面的这个默认显示的是被阉割的,并不是完整的,而是已经有的不是空的数据;

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部