课程内容
-
ArrayList集合
JCF
Collection Map
[单值类型的集合] [键值对类型的集合]
List Set SortedMap
有序 无序
不唯一 唯一
SortedSet
有序
唯一
ArrayList0:包装类
-
ArrayList底层基于Object[]实现的 所以只能存储引用数据类型 如果想要装基本数据类型 需要将基本数据类型转换成包装类 -》 集合
-
包装类里面提供一个方法[parseXXX] 可以将字符串转换成对应的基本数据类型
ArrayList1:基本用法及特点
创建ArrayList对象:
ArrayList list = new ArrayList();//5.0之前 默认往集合里面装Object
ArrayList<泛型> list = new ArrayList<泛型>();//5.0开始加泛型
ArrayList<泛型> list = new ArrayList<>();//7.0泛型自动推断
如何添加元素:
list.add(元素);//元素添加进列表的尾部
list.add(下标,元素);//元素插入到列表的指定位置
Collections.addAll(集合,元素,元素...);//一次添加多个元素
Collections和Collection之间的区别?
Collection是所有单值集合统一的父接口:interface
Collections是集合的工具类:class
如何得到元素/修改元素
E xx = list.get(下标);
list.set(下标,元素);
如何判断是否包含/集合是否为空?
boolean x = list.contains(E e); 数组没有contains()
boolean y = list.isEmpty();
如何得到元素的第一次出现的下标/最后一次出现的下标
int x = list.indexOf(E e); 数组没有indexOf()
int y = list.lastIndexOf(E e); 数组没有lastIndexOf()
得到集合大小:
list.size()
将集合里面的元素装进数组里面:
Object[] data = list.toArray();
XXX[] data = list.toArray(new XXX[0]);
如何遍历集合对象:
for + 下标
foreach
迭代器
ArrayList2:如何删除
ArrayList类里面删除元素:
list.remove(int 下标):指定下标删除 [原理:数组的后元素往前面移动]
list.remove(Object 元素):指定元素删除 [原理:
拿着被删除的元素.equals(集合元素)]
清空集合:list.clear()
================================================================
list.contains(Object 元素):包含元素 [原理:
被包含的元素.equals(集合元素)]
list.indexOf(Object 元素):找元素下标 [原理:
被查找的元素.equals(集合元素)]
lastIndexOf()和indexOf()同理
ArrayList3:如何在遍历集合的同时进行删除
for + 下标 -》 删除一个跑掉一个 除非到这删除 但是Set集合用不了
forEach -> foreach遍历的时候进行删除 会触发CME异常
迭代器 -》 使用迭代器遍历集合的时候 不允许对集合的整体进行添加/删除操作
否则触发CME异常 如果在遍历的时候想要进行删除 使用car.remove()
CME【快速失败】的原理?
每一个集合底层都有一个变量叫modCount 记录对集合的处理次数[添加/删除/修改底层数组空间大小] 每次处理 modCount++
在执行list.iterator()的时候 迭代器会将集合自己的modCount的值拷贝到迭代器自己的属性[expectedModCount]里面
当执行car.next()触发modCount和expectedModCount值的比较 一旦两个值不一样触发CME异常
ArrayList4:ArrayList构造方法
构造方法:
ArrayList list = new ArrayList();//[]:默认10块空间
ArrayList list = new ArrayList(int x);//[]:开辟x块空间
ArrayList list = new ArrayList(Collection 单值集合);//将参数集合里面的元素装进list集合里面
集合无论底层开辟多大空间 都可以存储无数个元素 集合会自动扩容
jdk6.0及之前 x * 3 / 2 + 1
jdk7.0及之后 x + (x >> 1)
在项目开发的时候尽量避免扩容:
1:创建一个新的数组对象
2:将老数组里面的元素复制到新数组里面
3:改变引用指向
4:回收老数组对象
5:添加元素
扩容:list.ensureCapacity(int 容量)
缩容:list.trimToSize()
List接口:
-
ArrayList
-
Vector语法和ArrayList一模一样
-
LinkedList语法和ArrayList一模一样
-
Stack:用数组模拟栈结构
面试题:
-
ArrayList和Vector之间的区别?
同步线程不同
Vector同一时间允许一个线程进行访问 效率较低 但是不会出现并发错误
ArrayList同一时间允许多个线程进行访问 效率较高但是可能会出现并发错误
jdk5.0开始 集合的工具类里面提供一个方法 可以将线程不安全的ArrayList 变成线程安全的List集合 于是Vector渐渐被淘汰
List list = Collections.synchronizedList(ArrayList对象);
扩容机制不同:
Vector:分构造方法
Vector(8) -> 2倍扩容 -> 8 -> 16 -> 32....
Vector(8,3) -> 定长扩容 -> 8 -> 11 -> 14 -> 17...
ArrayList分版本:
jdk6.0及之前 x * 3 / 2 + 1
jdk7.0及之后 x + (x >> 1)
出现的版本不同:
Vector:since jdk1.0
ArrayList since jdk1.2 -
ArrayList和LinkedList之间的区别?
ArrayList和LinkedList底层数据结构不同 导致他们的优劣势不同
ArrayList底层基于数组实现的
优势:查找 随机访问效率高
劣势:插入元素 / 删除元素效率低
LinkedList底层基于双向循环链表
优势:插入/添加/删除元素效率高
劣势:查找效率极低
在开发的时候 尽量避免使用LinkedList的get(下标)
标签:下标,删除,ArrayList,元素,list,day14,m1,集合 From: https://www.cnblogs.com/zhaodenghui33/p/18185494