Java学习笔记(17)

集合进阶

单列集合

Collection

List set

Add clear remove contains isempty size

Add方法可能也会添加失败

同理,可能删除失败

Contains细节

为什么要重写equals?

因为contains底层用的是object类中的equals方法,比较的是地址值,这样即使元素相同,也会返回false,所以要重写equals方法

Collection遍历方式

迭代器遍历 iterator

获取迭代器,是调用.iterator方法,不是new,获取一个迭代器对象

迭代器遍历时,不依赖索引,利用指针和移动的方式获取集合中的元素

遍历完毕后,指针不会复位,会一直指向最后没有元素的位置

如果再想遍历,只能再次获取一个新的迭代器

第三点的意思主要是每次使用next都会移动指针,循环中多次使用next可能会指向没有元素的位置。

要删除,得用迭代器的remove方法删除;添加暂时没有办法

增强for遍历

JDK5之后出现,原理就是迭代器,简化迭代器代码

s表示第三方变量,依次表示每一个数据

细节:修改s,不会改变集合中的数据

Lambda表达式遍历

JDK8开始有

.forEach

只有迭代器可以删除掉collection的元素

List集合

删除remove 注意的细节

这里的1表示的是索引,而不是元素1

会优先调用实参和形参类型一致的方法

如果一定要删掉元素1

需要手动装箱,把1变成integer类型

List遍历

列表迭代器  也是一个接口,是iterator的子接口

在遍历的过程中,可以增删元素

迭代器可以删(用的是迭代器的remove方法,而不是集合的remove方法)

列表迭代器同时可以增删(用的也是迭代器的方法)

数据结构

后进先出,先进后出

队列

先进先出,后进后出

数组  (在内存中是一片连续的空间)

查询快,增删慢

链表

增删快,查询慢

只需要改变地址

双向列表

Arraylist

扩容机制

添加第一个元素的源码

添加第11个元素(或一次性加很多个元素)的源码

Linkedlist集合

双向列表

Linkedlist 添加元素过程的底层源码

Iterator源码

调用.iterator()方法,就是创建一个内部类的对象

泛型

JDK5开始的

只支持引用数据类型

没有泛型的时候,集合怎么存数据的?

直接add皆可,都会被看成是object类型

但是就不能使用集合里元素类型的子类特有方法

泛型好处

泛型其实是伪泛型

Java文件里有写泛型,但是到编译时,即编译成class文件时,集合里面的数还是会被当成object类型处理,只不过,底层还是会将object类型根据泛型强转成对应的类型。

这就是泛型的擦除。

原因:泛型是JDK5才出现的,为了向下兼容,才这样做。

为什么不能写基本数据类型?

因为基本数据类型没得转成object类型,只有写他的包装类,才能转成object类型编译

泛型的使用场景

泛型类

类型不确定时,在定义一个类时就可使用

泛型方法

Public static都是修饰符

E...e是可变参数,用来表示一个或者多个变量,此时e就是一个数组,可以遍历获取里面每一个元素

泛型接口

第一种

第二种

泛型的继承

<>里写什么类型,只能添加什么类型的对象,即使是子类也是不行,泛型没得继承

但是数据是具备继承性的

泛型的通配符

?表示

可以接受Ye Fu,不能接受Zi

总结

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值