赞
踩
研究生一枚,为后端实习和未来工作打基础。无意间发现韩顺平老师的课程,细心细致,讲课和吴恩达老师一样,都是保姆式讲解,各种基础知识都会补充,爱了。
韩顺平老师课程地址:https://www.bilibili.com/video/BV1fh411y7R8?spm_id_from=333.999.0.0
阅读提醒:本笔试适合有编程语言基础的伙伴阅读,因为本兔兔是本专业的,有c、c++、python 、sql基础,笔记中特别的基础的内容就没有记录。完全零基础的小伙伴建议跟着韩老师的课程自己记录。
1、Java集合类的两大类
熟记、背诵
Collection
··List【列表】
····Vector (向量)
····ArrayList(数组列表)
····LinkedList(链表列表)
··Set【集合】
····HashSet
····TreeSet(有序)Map
··TreeMap【有序哈希字典】
··HashMap【哈希字典】
····LinkedHashMap
··HashTable【哈希表】
····Properies
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、概念
- 实现了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
- 底层是数组
- 线程不安全
源码分析
可以存null
底层实现了双向链表和双端队列的特点
上图的解释
增删改查源码阅读
https://www.bilibili.com/video/BV1fh411y7R8/?p=516&spm_id_from=pageDriver&vd_source=863cd5165874b9e91cbd88db7b5eaa82
注意:remove()默认删除的是头结点
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,表示添加失败;否则挂载到最后
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 不一定有序,顺序根据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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。