适合有编程基础的人看的《韩顺平零基础30天学java》笔记(P499~P530)

写在最前边:

研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。

Java 基础

第三阶段 java语言中面向对象的一些应用

第四章 集合


在这里插入图片描述

学习方向:
1、底层实现——分析源码
2、应用场景——哪种情形用哪个类
概念:
1、技术来源——解决数组使用中的一些不足

在这里插入图片描述

2、集合的好处

在这里插入图片描述



一、集合框架图
1、Java集合类的两大类熟记、背诵
  • Collection 【单列集合】

在这里插入图片描述

Collection
··List【列表】
····Vector (向量)
····ArrayList(数组列表)
····LinkedList(链表列表)
··Set【集合】
····HashSet
····TreeSet(有序)

  • Map【双列集合,键值对形式】在这里插入图片描述

Map
··TreeMap【有序哈希字典】
··HashMap【哈希字典】
····LinkedHashMap
··HashTable【哈希表】
····Properies

二、Collection接口

在这里插入图片描述

1、继承了Iterable接口
其子类的特点:
  • 通过子接口 List、Set再实现子类。
  • 有的可存放重复元素、有的不可以
  • 有的是有序的、有的是无序的
2、Collection接口的 常用方法

在这里插入图片描述

细节方法接收的参数基本是Object对象,所以再操作基本数据类型的时候其实有一个自动装箱过程哦!
3、Collection接口的 遍历方法
(1)使用Iterator迭代器(方法)(因为Collection实现了Iterable接口
Iterator介绍——相当于一个指针

在这里插入图片描述

Iterator执行原理在这里插入图片描述

注意1:在使用iterator.next()之前必须先使用iterator.hasNext(),否则取空时会抛出异常
注意2:用完一次后,iterator指向空了就,下次再用需要重新使用iterator()方法重新取个指针来

Iterator代码快速生成 快捷键 -->> itit

在这里插入图片描述

查询所有的快捷键 -->> ctrl + j
(2)使用增强for循环(因为Collection实现了Iterable接口
增强for循环代码展示

在这里插入图片描述
注意1:增强for循环还可以再数组上使用
在这里插入图片描述
注意2:增强for循环底层用的还是iterator方法,就是简化版的迭代器遍历

二(1)、Collenction的子接口——List接口

在这里插入图片描述

1、概念
  • 实现了List接口的类,其实例对象中的元素是有序且可重复的。有序指的是:自然输出顺序=输入顺序
  • 支持索引,可使用get(下标)获取元素。因为List底层是数组
2、常用方法

增删改查都有,用的时候去查呗

3、三种遍历方式
  • 普通for Collection接口未实现,因为Set不能使用这种方法哦
  • 增强for
  • iterator迭代器

实现类

4、ArrayList
  • 可以存null
  • 底层是数组
  • ≈Vector,ArrayList效率高但是多线程时ArrayList不安全源码没有synchronized
源码分析
  • 元素存在ArrayList中的 transient Object[]数组elementData中,可以存放任何类型的元素,并且不会被序列化
  • 扩容机制——底层使用Arrays.copyOf()
    • 无参构造器:初始为0,首次添加元素扩容到10,后续每次需要扩容时,都按当前容量的1.5倍扩容
    • 参数为指定容量的构造器,初始为指定大小,后续每次需要扩容时,都按当前容量的1.5倍扩容
5、Vector
  • 可以存null
  • 底层是数组
  • 多线程时安全源码有synchronized
源码分析
  • 元素存在Vector中的 protected Object[]数组elementData中,可以存放任何类型的元素,并且不会被序列化
  • 扩容机制——底层使用Arrays.copyOf()
    • 无参构造器:初始为10,后续每次需要扩容时,都按当前容量的2倍扩容
    • 参数为指定容量的构造器,初始为指定大小,后续每次需要扩容时,都按当前容量的2倍扩容
6、LinkedList
  • 可以存null
  • 底层是数组
  • 线程不安全
源码分析

List下三个子类的区别

线程安全——使用Vector
线程无要求:

在这里插入图片描述

  • 改查多——使用ArrayList
  • 增删多——使用LinkedList

二(2)、Collenction的子接口——Set接口

在这里插入图片描述

1、概念
  • 实现了Set接口的类,其实例对象中的元素是无序且不允许重复的。无序指的是:自然输出顺序输入顺序,但是每次输出的顺序都是一样的
  • 可接收null
  • 因为元素无序,所以不支持 索引方式
2、遍历方式(就是Collection的,因为无所以所以没有普通for)
  • 增强for
  • iterator()

实现类

3、HashSet
  • 底层是HashMap,HashMap底层又是数组+链表+红黑树
    HashSet底层在这里插入图片描述
    HashMap底层 在这里插入图片描述
    jdk8:何时红黑树化?当一条链表元素个数等于8 && table数组元素个数等于64。若链表到达8,table<64,就先扩容table
  • 不能有重复的元素或者对象,最多有一个null
    注意,这里的对象,切记,根据地址引用来看是不是一个对象,而不是某个元素值呀!但是!new String(“李雨菲”)是特殊的!可以添加两个 new Dog("tom"),不可以添加两个new String(“李雨菲”),,原因如下:add()方法的源码探究
1.添加一个元素key时,先根据一个hash算法得到hash值,这个hash值 再映射为  table数组的索引 pos
2.根据索引值pos,查看table[pos]是否存在元素。
  无:直接加入;
  有,进行第3步。
3.调用“==” 和equals 对key 和 table[pos]进行比较:
  putVal方法中的  if(p.hash == hash && 
  					((k=p.key) == key || (key != null && key.equals(k))))
  ***这里就造成String类的对象和普通类的对象以及基本数据类型,不一样了。
  ******==” 针对的是普通对象\基本数据类型,比较的是地址\数值;
  ******equals针对的是String类和重载了equals方法的自定义类,比较的是内容。
  ***如果自定义的类重写了equals方法,那么也是可能相同的哦,看你自己怎么定义了。
  若equals结果为不相同:
  ***table[pos]挂载的后续结点与key比较:
  ******挂载的链表呈现红黑树结构,要调用红黑树的putTreeVal,还要有这些比较机制;
  ******挂载的链表呈现链表结构,遍历链表,只要有一个结点与key相同,就返回false,表示添加失败;否则挂载到最后
  • 不一定有序,顺序根据hash后的值决定
(1) add()方法会返回添加成功或失败的状态true/fasle
(2)扩容机制

在这里插入图片描述
可以debug以下代码体会HashSet的扩容机制
在这里插入图片描述

细节:扩容中的限扩容时机 : 12 指的是什么个数?

指的是table表中包含的所有结点个数,并不是table的12个位置被占用了。而是table中,所有链表的结点个数哦!韩老师牛逼!太细节了!源码如下:
在这里插入图片描述

(3)转成红黑树的机制

在这里插入图片描述
可以debug以下代码体会HashSet的转化成红黑树的机制
在这里插入图片描述
在这里插入图片描述

(3)程序员如何自定义HashSet中的重复添加机制呢?答:在想要自定义的类中,重写euqals()和hashCode()方法即可。

在这里插入图片描述

3.1、HashSet的子类 LinkedHashSet
  • 底层是 LinkedHashMap ,是HashMap的子类
    和HashMap的区别是,LinkedHashMap 维护了一个数组+双向链表双向链表最大的好处是可以维护元素的次序,使得输出顺序 = 输入顺序,但是效率还是不敌HashMap的红黑树。
  • 添加元素的机制同HashSet,只是把红黑树变成双向链表了,牺牲一些效率保证输入顺序 = 输出顺序
    在这里插入图片描述
4、TreeSet 底层是TreeMap
最大的特点就是可以按照 某种规则 排序 ≠有序
自定义排序方法,还是重写Comparator接口的compare()方法就行。和Arrays.Sort(nums , new Comparator(){…});是一个路子

在这里插入图片描述
在这里插入图片描述

new Comparator()最终给到的是TreeMap


TreeSet底层是TreeMap ; HashSet底层是HashMap


  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值