java.集合(Ⅱ).List

1.List

意义:实现了Collection的子接口之一
特点:元素是有序的,是可重复的,因为该集合体系有索引。
常见三子类
|——ArrayList:底层用的数据结构用的是数组结构。
特点:查询速度很快,但增删稍慢,线程不同步,长度可变—默认长度为10,当超过已有长度时,自动生成延长百分之50数组,并自动转移数据。
|——LinkedList:底层使用的是链表数据结构。
特点:增删速度很快,查询速度慢
|——Vector:1.2版本前使用,和ArrayList功能一致。
特点:线程同步。操作速度很慢,一般不用。枚举是Vector的特有取出方法
因为枚举和迭代是一样的。且枚举的名称以及方法名称都过长。所以在1.5版本后被迭代器取代了。

List基本方法
这里写图片描述
这里写图片描述

List特有方法
这里写图片描述

几个知识点:
⑴当按角标进行添加方法时,操作相当于插入。相应角标的元素将后移。
⑵角标是从0开始的
⑶List类有特有的输出所有元素的方法,即用f.size()与f.get()进行遍历

for(int i=0;i<f.size();i++)
write(f.get(i));//write是一个自定义静态输出方法,就不另外加进来了

2.ListIterator
意义:List集合特有的迭代器。ListIterator是Iterator的子接口。

在迭代时,不可以在 通过集合对象的方法操作集合中的元素 的同时,又通过迭代器对元素进行操作。
因为会发生并发修改异常

所以在操作中,只能通过一种途径的方法操作元素。而迭代器的方法只有
判断、取出、删除三种,即
这里写图片描述

因为其方法过少不能满足很多需求,所以List中就有了其子接口。ListIterator。其方法有:
这里写图片描述

该接口只能通过List集合的listIterator方法获取。

3.LinkedList

特有方法:
这里写图片描述
这里写图片描述

ex:

import java.util.LinkedList;

public class ListDemo {
    public static void main(String[] args)
    {
        LinkedList f = new LinkedList();

        f.offerFirst("java 01");
        f.offerFirst("java 02");
        f.offerFirst("java 03");
        write(f);
    }
    public static void write(Object obj)
    {
        System.out.println(obj);
    }
}

输出:
这里写图片描述

List的两个小练习:
去掉ArrayList中的重复元素

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

public class ListDemo {
    public static void main(String[] args)
    {
        ArrayList f = new ArrayList();
        f.add("java 01");
        f.add("java 02");
        f.add("java 02");
        f.add("java 01");
        f.add("java 03");
        f.add("java 01");
        write(f);
        write("_________");
        write(single(f));
    }

    public static ArrayList single(ArrayList f)
    {
        ArrayList f1 = new ArrayList();

        for(Iterator it=f.iterator();it.hasNext();)
        {
            Object obj = it.next();

            if(!f1.contains(obj))
            {
                f1.add(obj);
            }
        }
        return f1;
    }
    public static void write(Object obj)
    {
        System.out.println(obj);
    }
}

——————————————————
在ArrayList中输入学生信息,并排除重复的数据

import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedList;

 class Person
{
    private String name;
    private int age;
    Person(String name,int age)
    {
        this.name = name;
        this.age = age;
    }
    public boolean equals(Object obj)//contains用来判断对象是否相同,但它的底层自动调用的是默认方法equals,
                                    //但当默认equals不能满足需求时,需要进行方法覆盖
    {
        Person p = (Person)obj;
        return this.name.equals(p.name)&&this.age==p.age;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    public String getName()
    {
        return name;
    }
    public int getAge()
    {
        return age;
    }
}
public class ListDemo {
    public static void main(String[] args)
    {
        ArrayList f = new ArrayList();
        f.add(new Person("java 01",1));
        f.add(new Person("java 02",2));
        f.add(new Person("java 02",1));
        f.add(new Person("java 03",1));
        f.add(new Person("java 04",1));
        f.add(new Person("java 01",1));
        Iterator it = single(f).iterator();
        while(it.hasNext())
        {
            Person p =(Person)it.next();
            write(p.getName()+"....."+p.getAge());
        }

    }

    public static ArrayList single(ArrayList f)
    {
        ArrayList f1 = new ArrayList();


        for(Iterator it=f.iterator();it.hasNext();)
        {
            Object obj = it.next();

            if(!f1.contains(obj))//底层原理是equals
            {
                f1.add(obj);
            }
        }
        return f1;
    }
    public static void write(Object obj)
    {
        System.out.println(obj);
    }
}

一个知识点:
List中,contains和remove进行的比较,底层都是调用Object类中默认的equals方法,而当默认方法不能满足时,可以以覆盖equals方法的形式进行修改,就像第二个小练习中这样

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值