(目录)
1. 原生数组带来的问题,抛出问题
- 原生数组容易造成超出边界,如果非要使用传统的数组,增删改查,就要用到数据结构,非常复杂
- CRUD是指在做计算处理时的增加(Create)、读取查询(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写
由此引出Java Conllections FrameWork即Java集合框架,也可称为函数库
2. Conllections家族
- Java集合框架是一个包含一系列实作可重复使用集合的数据结构的类别和界面集合
- Java集合大致可以分为两大体系,一个是
Collection
,另一个是Map
这里是引用java.util.Collection下的接口和继承类关系简易结构图:
java.util.Map下的接口和继承类关系简易结构图:
3. 黑帮的帮规
-
lterables
集合层次结构中的根接口,可以理解成帮派老大 - 当我们要帮派帮忙时,一般请它下面的小弟来办事,所以用的时候找类来实现
- 所有类和接口都自身相关的规定,也必须遵守总集合的规定
4. ArrayList第一讲
ArrayList
类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。
ArrayList
继承了 AbstractList
,并实现了 List
接口可以自动扩容
泛型限定是指将类型做限定,可设置成只能存放String
类型
如果要进行CRUD,可以创建一个Student
类
正常来说Student
并不是以数组的形式输出的,而是toSring
,如果要再添加一个对象扩容的话,又要getter
setter
一遍
如果换成集合形式输出, 效果会大不同
这下扩容就方便多了,只需.add()
即可,也不用担心数组下标,不用像传统输出写一个for循环了
5. ArrayList第二讲
.add()
方法可以添加元素和替换元素
.add(0, 4)
表示在第0个下标处插入元素4
.addAll()
表示合并元素,讲arrayList_2
合并到arrayList_1
之后
查看源代码中,集合是先转换为数组,再拷贝到一份新数组返回
.toarray()
方法表示返回集合的数组形式
.clear()
方法表示清楚数据
.contaions()
方法用于判断字符串中是否包含指定的字符或字符串
.get()
方法获得集合里的元素,for循环遍历具有操作性,集合的长度要用.size()
,数组的长度用.length()
.get()
的源代码中,是先检查指是否存在,在返回元素值
如何对集合中每个元素操作呢?增强for循环 for each
,可以实现对每个元素值都加1
6. ArrayList第三讲
索引(下标)是从0开始的
.indexOf()
方法用于查找元素首个下标
.lastIndexOf()
方法用于查找元素最后一个下标
.isEmpty()
方法用于检查集合是否为空
.remove()
方法用于删除元素,默认根据下标删除,可以根据object
和index
删除
.removeAll()
方法用于移除所有元素
.replaceAll()
方法用于替换所有元素
.toLowerCase()
用于转换成小写
.toUpperCase()
用于转换成大写
.retainAll()
方法用于取交集
.set()
方法用于给指定的下标元素设置值
.sort()
方法用于排序,默认从小到大
.reverse()
方法用于置反集合
.subList()
方法用于切割容器,需要注意截止于前一个元素
7. Linked链表
-
ArrayList
数组集合,增删慢,查询快 -
LinkedList
链表集合,增删快,查询慢
8. LinkedList一带而过
- 链表是数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的地址
- 链表可分为单向链表和双向链表
- Java
LinkedList
类似于ArrayList
,是一种常用的数据容器
9. 提醒
- 多看JDK文档,多练习,把基础打好
10. iterator 迭代器初试
- 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需目标或结果
- 每一次对过程的重复被称为一次“迭代”,而每一次迭代的结果会被用来作为下一次迭代的初始值
迭代器Iterator
,不管用于ArrayList
还是LinkedList
都可以迭代输出
迭代器类似用链表的形式去迭代,也可以指定泛型
11. fori、增强for、迭代器的区别、注意事项和分别用途
-
fori
适合数据的读取与修改 -
for each
适合数据的读取 -
Iterator
不要使用嵌套,适合数据的读取与修改
for each
绝对不能与.remove()
方法一起使用,危险会导致所有数据删除
for each
已经是一个小型的迭代器了,如果一定要修改集合的话可以使用迭代器,但不建议在for each
中使用对象引用去修改元素
12. 谈谈三者性能
比较时间复杂度,foreach和迭代器谁更快呢?
- 如果是
ArrayList
,用三种方式遍历的速度是for
>Iterator
>foreach
,速度级别基本一致,一般都会用for
或者for each
,因为Iterator
写法相对复杂一些 - 如果是
LinkedList
,则三种方式遍历的差距很大了,数据量大时越明显,Iterator
>foreach
>>>for
,推荐使用foreach
或者Iterator
13. Set和HashSet
-
HashSet
基于HashMap
来实现的,是一个不允许有重复元素的集合,允许有 null 值,是无序的,即不会记录插入的顺序 -
HashSet
不是线程安全的, 如果多个线程尝试同时修改HashSet
,则最终结果是不确定的,必须在多线程访问时显式同步对HashSet
的并发访问
HashSet
实现了 Set
接口
使用Hash
函数实现HashSet
,元素无序,且不重复
14. LinkedHashSet
如果要创建有序集合呢?LinkedHashSet
便是有序的
15. Map、HashMap、Entry
java.util.Map下的接口和继承类关系简易结构图:
HashMap
是映射关系,即键Key
值Value
对
HashMap
不能使用迭代器Iterator
.replace()
方法可以替换键Key
对应的值Value
让Key
以集合形式输出,.keySet()
方法返回值是HashMap
中Key
值的集合
让HashMap
以集合形式输出, .entrySet()
方法的返回值也是Set集合
16. Map注意点
已经存在的键值对,再次.put()
会替换原来的,.get()
不存在的值会返回null
17. Entry与Map转换Set之后遍历: Iterator<Entry<Integer,Integer>> iterator = entrySet.iterator(); (什么?看不懂这行?)
-
Entry
就是用来管理键值对对象的,将对象包裹起来,提供遍历的方式 -
Entry
可以使用迭代器,筛选值,但只适合在内存中使用,不适用于JDBC
18. 提及 LinkedHashMap以及课后作业
HashMap
是无序的,可以自定义泛型,而LinkedHashMap
相当于有序的HashMap
,可以自己写一个包括增删改查的学生管理系统了
19. 集合框架部分结束
剩下的类需要自己去学习了!了解各类是怎么实现的,以及其之间的区别,JDK的新特性暂时用不到,还没学习到框架