java 19 集合框架(1)

 

 

 

 

 

多态写法这是实现类对象给到这个顶级的父类接口

 

 

 

 

那为什么要把集合转换成数组
比如说我集合中的数据确定下来之后
我可能要把这个集合呢传给某个方法
但这个方法它可能不是用集合来接数据,而是用数组来接数据的
那就意味着我需要把我的集合转成数组

 

arr2是把集合转换成指定数组形式

类型要一样

 

 

 

iterator

没有此元素异常的错误

 

当我们的程序呢去调用这个集合的terator方法的时候
他就可以得到一个所谓的迭代器对象
迭代器对象,它默认是站在集合的第一个元素位置处的

接着下面这个外循环呢就会开始执行it点,问第一个位置有数据麻
有数据之后它会进到这里面来,通过it.next
他是把这个数据取出来啊
它会同步的让迭代器移到下一个位置

 

 

缺少人的话,这样的话会踏空异常
以后一定要问一次取一次
千万不要这样去掉两次next,会有bug

 

你便利的这个集合中的元素类型是什么类型,都是string吧
那这个地方你就填一个数据类型为string,这个变量名你可以随便取名字
冒号然后再把集合往这边一放,
这个ele他就可以依次取出这个集合中的第一个数据,2,3,4数据
这个ele你就可以把它理解成一个游标
他会先游到第一个位置,取第一个游到这里取,依次循环
也可以遍历数组

快捷键集合对象点for回车就行了

 

这个foreach方法,它是需要接受一个consumer的对象
来对集合进行便利的,但是这个consumer它是一个接口
接口肯定不能直接创建对象的
因此啊我们这里呢是可以用接口的,一个匿名内部类的对象的
你可以直接去new一个匿名内部类的对象出来
我们这里啊他是new了一个匿名内部类对象,是送给了这边的这个action
action记住的就是我们这个匿名内部类对象,接着它这里面首先会问一问
就是这个action是不是null,是不是空的,往下走,
然后他就用这个增强for对这个集合进行便利
他每遍历到一个数据之后,他会把这个数据送给action
送给这头匿名内部类对象的这个accept方法对s进行接收

是可以进行简化的
简化

 

 

多态写法
直接把对象扔进去
现在打印存储的都是地址,集合存储对象它并不是存对象本身
而是存对象的地址信息,到时候跟据地址,到堆内存中找这些对象
需要重写tostring

 

 

这是增强for循环进行遍历,有快捷键,对象点for

 

main方法呢它会进到我们的站里面来执行
然后在这个里面呢它会创建一个arraylist集合对象,交给collection类型的变量
 

它是在我们的堆内存中创建了这样一个容器对象
容器对象代表了arrayList的集合,然后他会把这个容器的地址

复制给这个movies变量记住

记住由movies变量去指向这个集合容器

我们再通过这个movies掉a的方法,往里面添加一个电影对象
他实际上是在我们堆内存中,先创建这个电影对象出来

 

然后这个电影对象它是有自己的地址

他会把这个地址放到我们这个movies
也就是这个集合容器的第一个位置那里去的,那么我们这个集合容器的第一个位置的
这个地址就会指向第一部电影对象了啊

 

 

接着我们这里再加第二部电影对象的时候
它同样会在堆内存中创建第二个电影对象
再把第二个电影对象的地址

也存到我们这个集合容器的第二个位置这里来
然后我们这里就可以根据这个地址去找到第二个电影对象了

在堆内存中创建第三个电影对象

再把第三个电影对象的地址

同样存到我们集合的第三个位置

然后通过地址,就可以找到第3个电影对象了

接着输出集合,那这个集合中存储的,肯定是三个电影对象的地址
他不是把这个对象存进来
存的是这些对象在堆内存中的是不是地址信息

接着我们这边呢再通过增强for来便利这个movies
先等于我们这个集合容器中的第一个元素值
然后这个movie就可以根据这个地址去找到第1个电影对象
然后我们就可以去取第一个电影对象的名字
接着这个目标就会移到我们集合容器的第2个位置
他会拿到第二个电影对象的地址,去找到第二个电影对象
第二个电影对象的名字得分和主演了
依次类推

 

 

 

 

 

1.多态写法

 

 

 

 

 

 

 

 

数组它其实是在我们内存中的一块连续区域,并且他会把这块区域分割成
若干个相等的小区域,所以每块区域都是用来装一个数据的

 

 

 

 

 

 

 

 

 

 

 

那么链表呢它是由一个一个所谓的节点组成的,这个就叫做节点
这些节点在内存中它不是连续存储的,它跟数组不一样,数组的数据是连续存储的
链表的数据它是分散存储的,但是链表的每个节点它除了会包含数据值之外
它还会包含下一个节点的地址信息,通过这个地址信息
我们是可以去找到下一个节点的

 

那么当我们添加第一个数据a的时候,那么这个a数据就被称之为头节点
链表的头节点它本身的地址是会被记住的,到时候我们就可以通过这个地址找到头节点
从而找到整个链表,那接着我们再添加第二个数据
比如说是b这个数据的时候呢,那b这个数据它会有自己的一个地址,假如说这个地址是11
然后他会把自己的地址呢交给头节点a来记住
a是不是就指向了b这个节点呢
那假如我们再添加一个数据d的话,它可能也是在我们内存中的某一个位置
比如说它的位置是37,他就会让我们的b这个节点去指向d这个节点
那么他要把d这个节点的地址呢,放到b这边来

 

比如0 1 2 3 索引
比如说我现在说要找到第二个索引位置,不能马上找到位置,
因为元素在内存中不是连续的

 

 

 

 

 

队列就和我们现实生活中排队是一回事

 

 

那假如我现在有一堆数据要进入到这个队列
那队列呢它同时还必须满足一个先进先出,后进后出

 

 

比如说我的数据a要进入到队列

 

abcd都入队啦

 

那出队的话肯定是谁先进来,谁先出,先出a,b,c,d

 

 

没有用多态写啦
addlist代表入队
出队肯定出第一个人,这个removefirst代表就是把第一个人拿出来
同时删掉

 

 

假如我有一堆数据要入站的话
他首先呢要把这个数据a放到这个站里面去

 

 

比如说数据a他会呢先把数据a压到这个站底
再把数据b压进来,c,d也进来

 

前面数据栈顶,后面栈底
也就是说他后加的数据反而是放在了前面的

 

 

d后压进来的那他肯定是先出来的,c,b,a

 

 

addFrist代表每次都是第一个位置

 

 

 

Integer包装类代表整数
接口不能new对象,去找实现类

 

 

 

 

 

 

 

 

 

 

比如对这个底层数组长度求余的结果可能是三
你比如说它的哈希值可能是163
那么对长度16求余得到3
他就会把这个数据直接定位到
2和3之间,是不是一下子存到这个位置明确啊

 

如果还有数据,希值对底层数组长度求余
那这个余数呢它可能也是这里面的某一个索引
比如说它的含义值可能是160,求余为0,那它就会判断这个位置是不是null
是null把这个数据存进去好

 

 

又一个数据,同样拿这个数据的,希值对底层的数组长度求于得到的结果又是三
他此时就会发现这个位置是不为now啊,发现是有元素的
有元素呢它就会继续调用equals来比较一下
也就是让这两个元素呢进行equals比较,
如果equals比较是相等的,不存,反之,存
 

 

这个新元素会占老元素的位置,老元素挂下面

 

新元素,它算出来的位置可能又是这里,继续操作
他就会去掉,去除

 

 

无序:比如说添加第一个元素为例,他并不是直接存到数组的第一个位置的
它会按照这个元素的哈希值,对底层数组长度求于算出这个位置
那第一个数据是可能存到到后面去了,也可能是前面

 

无索引:比如说你先加了第一个数据,它的索引呢并不是零,他可能跑到后面去啦
那你用零取到的可能是一个你不确定的数据,所以官方就索性对HashSet的集合不支持
比如说我要找某一个数据的话,我只需要拿这个数据的哈希值对底层的数组长度求余
比如说是索引三,根据3是不是直接可以去底层数组这里去定位这个位置

 

 

所谓的加载因子的概念,它指的是一旦我们数组中的这个坑啊,占了16x0.75

也就是说一旦占满了数组中的这12个坑了,那么它就会扩容
它并不会等到把这个数组所有坑都占完了,它会扩容成原来这个数组的两倍的样子
再把原数组中的所有的数据,重新转移到新数组中去

 

它一个节点这里啊可以往下面挂多个元素的
小的元素往左边走,大的往右边走
小的哈西值左,大的右

 

 

 

 

 

 

 

 

 

 

重写tostring可以看到地址
后面有两个重复的,说明内容一样的两个不同对象
HashSet集合认为他们是不重复的
它会把它保留到这里啊

 

 

拿这个数据也就是这个对象啊
这个对象的哈希值,根据哈希值算出它的位置
假如说a算到了这个位置,他看到这个位置有数据
接着呢他就会拿这个对象再去与这里面的数据
一个一个的进行equals比较
equals也一样,他才认为这个对象是怎么样重复的,才会把它给去掉才会把它给去掉
 

 

 

 

如果你希望我们的high set集合认为内容一样的,两个不同对象是重复的
那么你就必须重写这个对象的hash code方法
和它的什么equals方法
这样high set集合就会认为内容一样的是重复的,就会帮你去掉一个重复的

 

 

 

那么当我们添加第一个数据到link的aset,集合里面去的时候去的时候
link的开set的集合会拿这个数据的哈希值与底层数组长度求余
得到的结果作为这个数据的位置
比如说他算的结果就是所以八
那他就会把这个数据存到这个位置这里来

linkedHashSet它引入了双链表机制啊,所以呢它里面其实会有一个变量负责
记住第一个元素的地址,到时候我们可以通过这个变量去找到第一个元素,也就是找到头节点啊
同时呢它里面其实还有一个变量,负责记录最后一个元素的地址
那由于啊我们现在这个里面只有一个数据,所以他找头节点的这个变量
以及找尾节点的这个变量,都会指向这同一个数据啊

添加第2个变量的时候link high set集合也会拿第二个数据的哈西值
与底层数组长度求余得到第二个数据的位置

 

 

比如存储到黄色的位置,LSET它里面的每个元素是额外多了一个双链表机制,
来记住它前后元素的位置的,那么当你添加完第二个数据的时候
第二个数据它会通过这个变量找到

 

找到当前的最后一个元素,然后呢他会把自己的地址送给这个元素

 

带到皇设,然后呢自己也可以去指向前一个元素了
接着它就会变成是不是最后一个元素

 

 

 

那么当我们第一次加这个数据六的时候
它其实就会在底层建一棵红黑树
那么它会让这个六成为这个红黑树的根节点
那么等你再加第二个元素五的时候,他会拿5,与这个根节点六进行大小比较
那五肯定比六小,它就会把五放在六的左边这个位置,
在加5的时候,他会继续拿着这个五与这个根元素六比较,发现比六小就往左边找
然后在这里发现了一个跟五一样的数据,于是呢他就不会再把这个五加进去了
因为相等的情况下,他就不会再去加,要去重复的
然后这边呢再加这个七这个数据的时候
他会拿着七继续与这个根元素也有进行比较
发现七比六大比六大就会放在六的右边去

他接下来呢就会从这个红黑树的,这个左边到右边这样去,比如说567这样去便利

 

 

不知道规则肯定会错误

 

 

它的this是不是代表这个主调学生对象
因为他这个边会让这两两学生对象
然后呢拿某一个选对象来调这个compare to方法
然后再送另一个选项对象给o来进行这个比较

而这个被比较者是不是就是o代表的

如果大小规则是相等的情况下,所以牛魔王它不存的

 

他会就近选择自己自带的比较器对象进行排序,就是TreeSet集合

 

简化

 

 

 

 

 

 

使用迭代器遍历

 

 

有两个没有删除成功,原因:
你这个索引i先占这个王麻子,王麻子里面不带理
然后往这边走,往这边走遍历到了小李子,小李子是包含了李的
所以他会把小李子是不是给删掉
爱花是不是就占到了第二个位置
但是我们的索引是不是还是要往前走的,他会绕过这个数据的

他每次删一个元素的时候呢,它会导致呢后面元素会移动上来
然后它这个索引往前走又会导致漏删元素啊

 

 

i--是关键

 

 

增强for循环来遍历并删除数据,都会异常

 

莱姆大表达也会异常

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值