List集合特点以及迭代器的方法原理

List 集合特点:

1.1:有序 

List集合数据存进去的顺序和取出来的顺序一致

List lst=new ArrayList();
lst.add(2);
lst.add(1);
lst.add(5);
lst.add(8);
System.out.println(lst);
1.2:不唯一

List集合数据允许添加重复数据

List lst=new ArrayList();
lst.add(2);
lst.add(1);
lst.add(5);
lst.add(8);
lst.add(8);
System.out.println(lst);

2.1:遍历方式

2.1.1 for下标
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
for (int i = 0; i < lst.size(); i++) {
	System.out.println(lst.get(i));
}
2.1.2 foreach
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
for (String str : lst) {
	System.out.println(str);
}
2.1.3 迭代器
List lst=new ArrayList();
lst.add("zs");
lst.add("ls");
lst.add("ww");
Iterator iterator = lst.iterator();
while(iterator.hasNext())
	System.out.println(iterator.next());

2.2 删除方式

2.2.1 for 正向删除

        

List list = new ArrayList();
    list.add("txj");
    list.add("wyy");
    list.add("xy");
System.out.println("删除前的集合个数:" + list.size());
    int size = list.size();    
    for (int i = 0 ;i<size;i++){
        list.remove(0);
      }
System.out.println("删除后的集合个数:" + list.size());
2.2.2 for逆向删除
        List list = new ArrayList();
        list.add("txj");
        list.add("wyy");
        list.add("xy");
        list.add("txy");
        list.add("tyy");
        System.out.println("删除前的集合个数:" + list.size());
        int size = list.size();
        for (int i = size - 1; i >= 0; i--) {
            list.remove(i);
        }
        System.out.println("删除后的集合个数:" + list.size());
2.2.3 迭代器删除

        List集合删除推荐使用迭代器.

        List list = new ArrayList();
        list.add("txj");
        list.add("wyy");
        list.add("xy");
        list.add("txy");
        list.add("tyy");
        System.out.println("删除前的集合个数:" + list.size());
        Iterator it = list.iterator();
        //判断下一个元素是否存在
        while (it.hasNext()) {
            it.next();
            it.remove();
        }
        System.out.println("删除后的集合个数:" + list.size());

3.优化

         概念:初始化大小10、负载因子1.5、向下取整
        公式:容器大小\*1.5倍
        例如:10\*1.5=15、15\*1.5=22、22\*1.5=33 ...(如有余数 :向下取整)

        tedian:List集合优化目的在于利用合理的存储空间存下所有元素数据,不多不少,不造成空间浪费。

    public static void main(String[] args) {
        //list 集合优化
        List list = new ArrayList<>(50);
        for (int i = 0; i < 50; i++) {
            list.add(i);
            System.out.println(i);
            getList(list);
        }
    }

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

4. 迭代器的原理

迭代器中有两个重要的方法:

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

        方法二:next():移动下标并取出当前元素

        List lst = new ArrayList();
        lst.add("ssl");
        lst.add("txj");
        lst.add("wyy");
        //获取迭代器
        ListIterator it = lst.listIterator();
        //判断下一个元素是否存在
        while(it.hasNext()){
        //移动下标取出当前元素并输出
            System.out.println(it.next());
        }

5. 泛型

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

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

案例:获取List集合中的偶数

        List<Integer> lst = new ArrayList();
        lst.add(1);
        lst.add(3);
        lst.add(4);
        lst.add(8);
        //获取迭代器
//        Iterator it = lst.iterator();
        ListIterator<Integer> it = lst.listIterator();
        //循环便利
        while (it.hasNext()) {
            //移动下标取值
            Integer val = it.next();
//            Object next = it.next();
            //类型转换
//            Integer val = Integer.parseInt(next.toString());
            //判断偶数
            if (val % 2 == 0) {
                System.out.println(val);
            }  
         }

6.拆装箱

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

        6.1:装箱

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

int a=10;
Integer b=new Integer(a);
        6.2:拆箱

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

Integer c=new Integer(10);
int d=c.intValue();

7.ArrayList、LinkedList和Vector的区别

        7.1.ArrayList和LinkedList的区别

             相同点:

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

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

             不同点:

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

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

        7.2.ArrayList和Vector的区别


              相同点

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

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

             不同点

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值