Java集合框架
数组和集合的区别:
1,数组是固定长度的,缺少灵活性
2,数组保存的数据类型需要一致性
3,数组进行增加数据的代码比较复杂
1,两大接口Collection和Map
集合主要分为两组(单列集合和双列集合)
Collection:(单列集合)
**List**:
ArrayList, LinkedList , Vector
Set:
HashSet, TreeSet
Collection:添加数据的方法为add();
Map: (双列集合,K ,V)
HashMap:, TreeMap ,HashTable:
LinkerHashMap Properties
Map添加数据的方法为put();
2,Collection接口实现类
继承了iterable接口collection extends iterable
1)collection实现子类可以存放多个元素,每个元素可以是Object
2)有些Collection的实现类,可以存放重复的元素,有些不可以
3)有些Collection的实现类,有些事有序的(List),有些无序的(set)
4)Collection接口没有直接的实现子类,是通过它的子接口Set和List来实现的
常用方法:
2,1 接口的遍历方式 1-使用Iterator(迭代器)
基本介绍
1)Iterator对象称为迭代器,主要用于遍历Collection集合中的元素。
2)所有实现了Collection接口的集合类对象都有一个iterator()方法,用于返回一个实现了Iterator接口的对象,既可以返回一个迭代器。
3)iterator仅用于遍历集合,iteratot本身不存放对象。
4)属于iterable的接口方法
迭代器的执行原理:
快捷键生成 itit 生成迭代器遍历
如果希望再次遍历,需要重置迭代器
2,2 接口的遍历方式 2-使用for(增强for)
增强for底层也是itrerator迭代器:也称简化版的迭代器
快捷键的方式大写I:i;
2,3接口的遍历方式 3-使用for(普通for)
2,3 List接口的方法(属于java.util包;底层是数组)
1)集合中元素有序,(添加顺序和取出的顺序一致),且可重复,允许多个空null
2)集合中的每个元素都有相对应的顺序索引,支持索引;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YqJYnxpD-1642594994015)(C:\Users\null\AppData\Roaming\Typora\typora-user-images\image-20220119145957656.png)]
常用的List接口方法
dd
3, ArrayList的注意事项:
等同与Vector,ArrayList是线程不安全(没有synchronized修饰)但执行效率高,Vector是线程安全的但执行效率低,在多线程的情况下,不建议使用ArrayList
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vVdHTW01-1642594994016)(C:\Users\null\AppData\Roaming\Typora\typora-user-images\image-20220119152352163.png)]
4,ArrayList的底层源码分析
1)ArrayList中维护了一个Object类型的数组elementData,transient(表示 瞬间,短暂。表示该属性不会被序列化) Object[] elemenetData;
2)当创建ArrayList对象时,如果使用的无参构造器,则初始elementData的容量为0,第一次添加,则扩容elementDate为10,如需要再次扩容,则扩容为1.5倍;
执行List.add确认容量大小;决定是否要扩容,然后在赋值
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PtvAWU29-1642594994016)(C:\Users\null\AppData\Roaming\Typora\typora-user-images\image-20220119154117476.png)]
进入ensureCapacityInternal方法,该方法第一次扩容为10
1)modCount++记录集合修改的次数
2)如果elementData的大小不够,就调用grow方法;
1)进入grow的方法,
真的扩容给;
1)使用扩容机制来确定要扩容多大
2)第一次newCapacity=10
3)第二次及其以后,按照1.5倍来扩容
4)扩容Arrays.copyOf(),保证原先的数组,在进行扩容,通俗点就叫;在新的扩容的位置=复制原先的内容+扩容的容量
3)如果使用的是指定大小的构造器,则初始elementData的容量指定大小,如果需要扩容,则直接扩容elementData为1.5倍;
1)创建了一个指定大小elementData数组
this.elementData = new Object[capacity]
\image-20220119164740869.png" alt=“image-20220119164740869” style=“zoom:50%;” />
1)创建了一个指定大小elementData数组
this.elementData = new Object[capacity]