Java-Collection接口下子接口List

Collection子接口、实现类:


这里写图片描述


list常用方法:

public static void fun() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    //  使用list中添加方法 add(int index, Object obj)
    //  添加的角标 就是后面元素 所在位置 不能越界
    list.add(4, "x");
    System.out.println(list);

    //  get方法
    Object object = list.get(2);
    System.out.println(object);

    //  通过get方法进行遍历
    for (int i = 0; i < list.size(); i++) {
        System.out.println(list.get(i));
    }

    //  set方法(不要越界)
    list.set(4, "z");
    System.out.println(list);
}

这里写图片描述


删除注意点:

public static void fun() {
    List list = new ArrayList();
    list.add(111);
    list.add(222);
    list.add(333);
    //  删除111元素 用两个删除
    //list.remove(0);
    //  删除时 系统没有自动装箱 数字传入方法
    //  调用的是角标删除的方法 所以越界
    //  如果非要使用按元素删除 需要手动装箱
    list.remove(Integer.valueOf(111));
    System.out.println(list);
}

并发修改异常:

public static void fun() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    //  添加完4个元素 集合长度是4
    //  使用迭代器遍历时 长度固定(4)不变
    //  获取集合中的迭代器
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {            
        if (iterator.next().equals("b")) {
            //  发生异常ConcurrentModificationException
            //  并发修改异常
            //  相当于修改集合长度
            //  注意:在迭代器遍历时 不要直接对集合做操作
            list.add("Oh~Yes");
        }
    }
    System.out.println(list);
}

这里写图片描述


解决并发修改异常:

//  思路:让迭代器去完成 添加元素
//  注意:迭代器中进行对集合添加或删除 要使用迭代器中的方法
//        不能直接使用集合去操作
public static void fun() {
    List list = new ArrayList();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("d");
    ListIterator listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        if (listIterator.next().equals("b")) {
            //  让迭代器 向集合中 添加元素
            listIterator.add("Oh~Yes");
        }
    }
    System.out.println(list);
}

这里写图片描述


List特有迭代器(逆向遍历):

public static void fun() {
    List list = new ArrayList();
    list.add("a");//    ←
    list.add("b");
    list.add("c");
    list.add("d");
    //  正向
    ListIterator listIterator = list.listIterator();
    while (listIterator.hasNext()) {
        System.out.println(listIterator.next());
    }
    //  正向遍历 使指针停留在最后一个元素上
    //  给逆向遍历提供起始的指针 否则无法遍历
    //  逆向
    //  hasPrevious 判断前一个元素有没有
    while (listIterator.hasPrevious()) {
        //  获取前一个元素
        System.out.println(listIterator.previous());
    }
}

这里写图片描述


实现类:


Vector:
public static void fun() {
    //  Vector 1.2(使用数组来实现 已经被ArrayList替代)
    //  创建一个Vector集合 迭代器遍历
    Vector vector = new Vector();
    //  添加元素
    vector.addElement("a");
    vector.addElement("b");
    vector.addElement("c");
    vector.addElement("d");
    System.out.println(vector);
    //  迭代器遍历
    //  获取vector中的迭代器
    Enumeration elements = vector.elements();
    while(elements.hasMoreElements()) {
        //  输出元素
        System.out.println(elements.nextElement());
    }
}

这里写图片描述


LinkedList:
public static void fun7() {
    //  linkedList
    LinkedList linkedList = new LinkedList();
    //  使用addFirst方法添加
    linkedList.addFirst("a");
    linkedList.addFirst("b");
    linkedList.addFirst("c");
    linkedList.addFirst("d");
    System.out.println(linkedList);

    //  使用addLast方法添加
    linkedList.addLast("a");
    linkedList.addLast("b");
    linkedList.addLast("c");
    linkedList.addLast("d");
    System.out.println(linkedList);

    //  获取头尾元素
    System.out.println(linkedList.getFirst());
    System.out.println(linkedList.getLast());
}

这里写图片描述


ArrayList和LinkedList的区别:

这里写图片描述


ArrayList:数组实现
数组实现 特点:查询快 增删慢(参照于LinkedList)
查询:直接使用角标查询
增删:把要添加元素 后面元素位置全部移动一位

LinkedList:链表实现
链表实现 特点:查询慢 增删快
查询:判断离头近还是离尾近 从头或尾 一个一个查找 找到为止
增删:将要插入的元素的地址保存 后面元素不用进行任何改动

队列结构和栈结构:

栈结构的特点: 先入 后出
队列结构特点: 先进 先出

模拟栈结构:
public static void fun() {
    //  使用LinkedList模拟栈结构
    LinkedList linkedList = new LinkedList();
    //  添加元素
    linkedList.addLast("a");
    linkedList.addLast("b");
    linkedList.addLast("c");
    linkedList.addLast("d");
    System.out.println(linkedList);
    //  模拟出栈
    //  每次删之前 查看一下这个集合是否是空的
    while (!linkedList.isEmpty()) {
        Object removeLast = linkedList.removeLast();
        System.out.println(removeLast);
    }
}

这里写图片描述


ArrayList去重:
/*
 * 创建一个ArrayList
 * 添加a,a,a,b,b,b,c,c,c
 * 去除重复
 */
public static void fun() {
    ArrayList arrayList = new ArrayList();
    arrayList.add("a");
    arrayList.add("a");
    arrayList.add("a");
    arrayList.add("b");
    arrayList.add("b");
    arrayList.add("b");
    arrayList.add("c");
    arrayList.add("c");
    arrayList.add("c");
    System.out.println(arrayList);
    //  创建新数组
    ArrayList newList = new ArrayList();
    //  获取老数组的迭代器
    Iterator iterator = arrayList.iterator();
    //  遍历老数组 取出每一个元素 看是不是 存在于新数组中
    while (iterator.hasNext()) {
    //  判断 老数组元素 是否存在新数组中
    //  如果存在 不添加新数组中
    //  如果不存在 就添加
    //  不能调用两次next()方法
    Object next = iterator.next();
    if (!newList.contains(next)) {
            //  将元素添加到新数组中
            newList.add(next);
        }
    }
    System.out.println(newList);
}

这里写图片描述


设计实例:
/*
 * 创建一个ArrayList
 * 保存6个学生
 * 去除重复学生
 */

//  学生类
public class Student {
    private String name;
    private int age;
    public Student() {
        super();
        // TODO Auto-generated constructor stub
    }
    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }   
    @Override
    public String toString() {
        return "姓名:" + name + " 年龄:" + age;
    }
    //  重写equals方法
    @Override
    public boolean equals(Object obj) {
        //  原来系统比较的地址
        //  现在比较地址已经不能满足我的需求
        //  我的需求 不看地址 只看姓名和年龄
        //  姓名和年龄同时 相同 就认为是同一个对象
        //  把传进来的转换成Student类型
        Student student = (Student)obj;
        //  判断姓名和年龄同时 相同
        return this.name.equals(student.getName()) && this.age == student.getAge();
    }
}

//  分析:
//  地址都不一样 所以不是同一个对象
//  根据对象名字和年龄去重
//  名字和年龄一样 两个对象重复 只保留一个
public static void fun() {
    ArrayList list = new ArrayList();
    list.add(new Student("鹏鹏", 18));
    list.add(new Student("鹏鹏", 18));
    list.add(new Student("水水", 17));
    list.add(new Student("水水", 17));
    list.add(new Student("兴兴", 16));
    list.add(new Student("兴兴", 16));
    System.out.println(list);
    //  创建新数组
    ArrayList newList = new ArrayList();
    //  获取老数组的迭代器
    Iterator iterator = list.iterator();
    while (iterator.hasNext()) {
        Object next = iterator.next();
        //  强转student
        Student student = (Student)next;
        if (!newList.contains(student)) {
            newList.add(student);
        }
    }
    //  打印新数组
    for (Object object : newList) {
        Student student = (Student)object;
        System.out.println(student);
    }
}

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值