集合框架之List集合

目录

1.什么是UML?

2.集合框架

3.list集合

3.1.list集合特点

3.2.遍历方式(for;foreach;迭代器)

3.3.删除list集合内容(for正反向删除;迭代器删除)

3.4List优化 ( 初始容量10,负载因子1.5 )

4.LinkedList和ArrayList的区别

1. LinkedList的特点

2. ArrayList数据结构

 2.1 ArrayList的特点

5. 什么是堆栈与队列?

6.增长因子论证

4.1 存储过程(list集合)

 4.2 list的扩容因子


目录

一.什么是UML?

二.集合框架

三.list集合

3.1.list集合特点

3.2.遍历方式(for;foreach;迭代器)

前言

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);  可根据需求定义默认长度,超过该长度才进行扩容

最后,本期介绍结束呐,谢谢您的观看😊😊😊。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值