前言
1.为什么要使用集合?
- 数组的缺陷:定容[一旦数组定义好,数组的长度就无法改变],如果需要改变数组的长度,很复杂。学集合框架就是了解容器的数据结构(增删改查).
2.ArrayList数据结构也是数组那么为什么可以没有长度限制?
- 论证:ArrayList数据结构是数组
public static void main(String[] args) throws Exception {
List list = new ArrayList();
for (int i = 0; i < 100; i++) {
System.out.print(i+"==");
list.add(i);
elementDataLength(list);
}}
public static void elementDataLength(List list) throws Exception {
Field ed = list.getClass().getDeclaredField("elementData");
ed.setAccessible(true);
Object[] o = (Object[]) ed.get(list);
System.out.println("当前List集合容量为:"+o.length);}
- 结论:
- ArrayList的默认长度是10,如果超出规定长度会增长1.5倍,并向下取整
- 例如 10*1.5=15、15*1.5=22、22*1.5=33 ...
1.什么是UML?
UML是统一建模语言的简称.
2.集合框架
3.list集合
3.1.list集合特点
- 有序:List集合数据存储进去顺序和读取顺序一致。
- 不唯一:List集合数据允许添加重复的数据。
3.2.遍历方式(for;foreach;迭代器)
- for下标遍历
List lst=new ArrayList(); lst.add("xx"); lst.add("aa"); lst.add("bb"); for (int i = 0; i < lst.size(); i++) { System.out.println(lst.get(i)); }
forreach遍历
List lst=new ArrayList(); lst.add("yy"); lst.add("hh"); lst.add("mm"); for (String str : lst) { System.out.println(str); }
- 迭代器
List lst=new ArrayList(); lst.add("ss"); lst.add("pp"); lst.add("qq"); Iterator iterator = lst.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next());
3.3.删除list集合内容(for正反向删除;迭代器删除)
for循环正向删除
List lst=new ArrayList<>(); lst.add(22); lst.add(23); lst.add(24); lst.forEach(System.out::println); System.out.println("删除之前集合大小:"+lst.size()); int size = lst.size(); for (int i = 0; i <size; i++) { lst.remove(0); } System.out.println("删除之后集合大小:"+lst.size());
- ⚠注意这里正向删除必须先把集合长度利用一个变量保存,否则每次删除之后数组长度会发生变化随之原数组下标也会发生变化,i++后从而删不干净,并且remove(0)的好处就是每次都会有下标为0的数组存在。
for遍历逆向删除
List lst=new ArrayList<>(); lst.add(12); lst.add(13); lst.add(14); lst.forEach(System.out::println); System.out.println("删除之前集合大小:"+lst.size()); int size = lst.size()-1; for (int i = size; i >=0; i--) { lst.remove(i); } System.out.println("删除之后集合大小:"+lst.size());
- ⚠注意这里同样用变量接收但是长度需要减一,因为数组下标是从0开始的。
- 迭代器删除
List lst=new ArrayList<>(); lst.add(12); lst.add(13); lst.add(14); lst.forEach(System.out::println); System.out.println("删除之前集合大小:"+lst.size()); Iterator<String> iterator = lst.iterator(); //判断下一个元素是否存在 while(iterator.hasNext()) { //若存在,移动到下一个元素位置 //易出错 iterator.next(); //删除元素 iterator.remove(); } System.out.println("删除之后集合大小:"+lst.size());
3.4List优化 ( 初始容量10,负载因子1.5 )
作为数组而言:下标不能超越定义的范围,而集合长度却是没有范围限制的。 由于list集合底层是数组,当我们每次添加到list集合中就会改变集合的容量。所以我们把list初始容量调高就会提升运行的效率。
4.LinkedList和ArrayList的区别
1. LinkedList的特点
如图所示: LinkedList是一种链表
该特点:根据节点依次往下查找元素,因此查询效率比ArrayList低。因为该集合是无序的,删除该集合中的某一元素并不会对其他元素造成变化,所以在新增和删除的时候比ArryList要快.
2. ArrayList数据结构
2.1 ArrayList的特点
首先ArrayList底层是一个数组,顾名(Array)思义。如数组的特点有序根据下标进行排序,元素可重复。
如图所示:数组可根据下标找到指定元素,并按加入顺序进行排序。
5. 什么是堆栈与队列?
都是一种数据结构
①队列&堆栈区别: 队列:先进先出
堆栈:先进后出
我们可以把堆栈想象成给枪装子弹,先装的就会后打出去。而队列则相反。
6.增长因子论证
4.1 存储过程(list集合)
以ArrayList为例以数组方式进行存储,数组长度是不可变的,默认是10;
4.2 list的扩容因子
public class yaya {
public static void main(String[] args) throws Exception {
ArrayList list = new ArrayList();
for (int i = 0; i < 50; i++) {
list.add(i);
System.out.print("当前集合长度"+i+"\r");
elementDataLength(list);
}
}
// 该方法是获取底层数组的长度
private static void elementDataLength(ArrayList l) throws Exception {
Field f = l.getClass().getDeclaredField("elementData");
f.setAccessible(true);
Object[] o = (Object[]) f.get(l);
System.out.println("当前集合底层数组容量长度为:" + o.length);
}
}
运行结果:
由此这样可以得到一个结论:
当添加内容超过默认数组长度会自动扩容,增长因子为 ‘原容量的0.5倍 + 1++’(每扩容一次叠加1,如扩容第二次就加2),因此我们可对其进行调优,根据需求修改默认底层数组长度减少扩容次数,从而提高效率。
ArrayList list = new ArrayList(50); 可根据需求定义默认长度,超过该长度才进行扩容
最后,本期介绍结束呐,谢谢您的观看😊😊😊。