List集合的特点&迭代器的原理

1、Collection顶层接口


Collection接口是集合框架的顶层接口是listset的父接口,不是Map集合的父接口,以下是关系图如示:

2、有序、无序


有序:元素添加的顺序和元素输出的顺序一致

无序:允许添加重复元素

案例

        List list = new ArrayList();
            list.add("ewq");
            list.add("wq");
            list.add("q");
            list.add("dsa");
            list.forEach(System.out::println);

输出结果:

3、遍历方式for&foreach&iterator


for:根据下标获取元素

List list = new ArrayList();
            list.add("ewq");
            list.add("wq");
            list.add("q");
            list.add("dsa");
        int size = list.size();
        for (int i=0;i <size;i++){
            System.out.println(list.get(i));
        }

foreach:循环输出集合中所有元素

        for (Object i : list) {
            System.out.println(i);
            }

iterator:获取迭代器循环输出集合中所有元素

 Iterator ite = list.iterator();
        while (ite.hasNext()){
            Object var=ite.next();
            System.out.println(var);
        }

4、迭代器的原理


两个重要的方法:

1) hashNext():用于判断迭代器中的下一个元素是否存在,不移动下标

2) naxt():移动下标并读取当前数据

//        while(it.hasNext()){
//            System.out.println(it.next());
//        }

5、删除方法


1) for正面删除

int size = list.size();
        //1) for正向删除
//        System.out.println("数据大小为:"+list.size());
//        for (int i = 0;i<size; i++){
//                list.remove(0);
//            }
//        System.out.println("数据大小为:"+list.size());


2) for负面删除

//        System.out.println("数据大小为:"+list.size());
//        for (int i = size-1;i>=0;i--){
//                list.remove(i);
//            }
//         System.out.println("数据大小为:"+list.size());

3)迭代器(推荐)

    while (it.hasNext()){
            it.next();
            it.remove();
        }

6、集合优化


避免造成资源空间浪费,对于一些大型项目而言就尤为重要

案例:

package com.zking.test;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class text02 {
    public static void main(String[] args) {
        //1.list集合优化
        //核心概念:
        //1、负载因子:1.5
        //2、初始容量:10
        //3、扩容计算公式:容器大小*负载因子
        List lst =new ArrayList<>(50);
        for(int i = 0;i<50;i++){
            lst.add(i);
            System.out.println(i);
            getLen(lst);
        }
    }

    public static void getLen(List lst){
        try{
            //获取类对象
            Class cls = lst.getClass();
            //获取类对象中的属性
            Field field = cls.getDeclaredField("elementData");
            //设置权限
            field.setAccessible(true);
            //获取属性的值
            Object[] arr = (Object[]) field.get(lst);
            System.out.println("list集合的大小:"+arr.length);
        }catch (Exception e){
            e.printStackTrace();
        }
    }

}

7、范型


从 Java 1.5 开始提供了泛型。泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。

注意:

> JDK1.5以上才有。
> 1)以类型为参数的类叫做泛型
> 2)泛型的默认类型为Object
> 3)作用:提高程序的健壮性、简化代码

案例:

package com.zking.test;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class test3 {
    public static void main(String[] args) {
        //范型
        List<Integer> list = new ArrayList<>();
            list.add(1);
            list.add(2);
            list.add(3);
         //获取迭代器
        Iterator ite = list.iterator();
        while (ite.hasNext()){
            ite.next();
            ite.remove();
        }
    }

}

8、装拆箱

示例:送快递,寄快递时需要对物品进行包裹,收快递后就需要对包裹进行拆包。

> 装箱:值类型到引用类型

> 拆箱:引用类型到值类型

9、ArrayList、LinkedList和Vector的区别


ArrayList和LinkedList的区别

- **相同点**

1、LinkedeList和ArrayList都实现了List接口。

2、ArrayList和LinkedList是两个集合类,用于存储一系列的对象引用(references)。

- **不同点**

1、ArrayList底层实现是数组,而LinkedList是双向链表。

2、ArrayList查询快(下标)、增删改慢、LinkedList是查询慢,但是在插入删除时效率比较高。

ArrayList和Vector的区别

- **相同点**

1、ArrayList和Vector都是用数组实现的

2、默认初始化大小都是10

- **不同点**

1、Vector多线程是安全的,而ArrayList不是。Vector类中的方法很多有synchronized进行修饰,这样就导致了Vector在效率上无法与ArrayList相比;

2、两个都是采用的线性连续空间存储元素,但是当空间不足的时候,两个类的增加方式是不同的。(ArrayList每次存储时会检查空间大小,不够时会扩充为原来的1.5倍,Vector会扩充为原来空间的2倍)。

  • 26
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值