杰神之Java集合中的List的一些方法

List

  • List 接口
    List接口是一个有序的 Collection,使用此接口能够精确的控制每个元素插入的位置,能够通过索引
    (元素在List中位置,类似于数组的下标)来访问List中的元素,第一个元素的索引为 0,而且允许有相同的元素。
    List 接口实例存储的是有序的,可以重复的元素。
    List和数组类似,可以动态增长,根据实际存储的数据的长度自动增长List的长度。
    查找元素效率高,插入删除效率低,因为会引起其他元素位置改变
  • <实现类有ArrayList,LinkedList,Vector> 。
  • ArrayList 和 LinkedList 的区别
    ArrayList:数组实现
    数组实现特点:查询快,增删慢(参照 LinkedList)
    查询:直接使用角标查询
    增删:需要把要添加的元素的位置,后面的元素全部移动一位
    LinkedList:链表实现
    链表实现特点:查询慢,增删快
    查询:判断离头近还是尾近,然后从头或尾,一个个查找,找到为止
    增删:将要插入/移除的元素的地址保存/删除,后面的元素不用进行任何操作
  • 数组查询和链表查询的区别
    这里写图片描述

ArrayList 一些方法代码举例:

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);
        // 通过角标获取对应的元素
        Object object = list.get(4);
        System.out.println(object);
        // 通过get方法进行遍历
//      for (int i = 0; i < list.size(); i++) {
//          Object object1 = list.get(i);
//          System.out.println(object1);
//      }
        // set方法 不要越界
        list.set(1, "z");
        System.out.println(list);
        // 根据角标删除 remove 
        //返回的是被删除的元素
        Object remove = list.remove(3);
        System.out.println(remove);
        System.out.println(list);

        List li =new ArrayList();
        li.add(111);// 自动装箱
        li.add(222);
        li.add(333);
        // 删除 111 元素
        //list.remove(0);
        li.remove((Integer)111);    //系统不会自动装箱 就按数字传入方法 所有按角标删除的方法调用的 所以越界 Integer.valueOf(i) 如果要使用按元素删除需要手动装箱

        System.out.println(li);

在昨天的博客中提到了使用迭代器(Iterator)遍历数组 上面ArrayList中也提供了get方法 也可利用For循环进行遍历. 那么问题来了,如果我想在集合中添加一串字符应该如何实现呢?使用迭代器遍历添加?

List list =new ArrayList();
        list.add("a");
        list.add("b");
        list.add("c");
        list.add("d");
        // 添加完4个元素 集合长度是4
        // 如果使用迭代器遍历 那么长度必须是固定的 长度不能变
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
            String string = list.toString();
            if (iterator.next().equals("b")) {
                // 这时发生的异常 ConcurrentModificationException 
                // 并发修改异常
                // add  相当于修改集合长度
                // 注意:在迭代器遍历的时候 不要直接使用集合做操作
                list.add("oh");     
            }
        }System.out.println(list);

我们可以用特有的迭代器操作

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);
        // 注意! 在迭代器中 进行对集合的添加或删除 要使用 迭代器的方法 不能直接使用集合来操作

vector类(现被arrayList 取代)

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());
        }
        /*
 * 创建一个集合 添加a,a,a,b,b,b,c,c,c
 * 去除重复
 */
 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"); 
        ArrayList arrayList2 = new ArrayList();
        Iterator iterator = arrayList.iterator();
        while (iterator.hasNext()) {
            Object next = iterator.next();
            if (!arrayList2.contains(next)) {
                arrayList2.add(next);
            }
        }System.out.println(arrayList2);
/*
 * 创建一个集合 添加学生信息
 * 去除重复
 * 根据上一题思路 应用到这题中 打印确失败了 这是为什么呢?
 */
ArrayList list = new ArrayList();
        list.add(new Student("james", 18));
        list.add(new Student("james", 18));
        list.add(new Student("TOM", 19));
        list.add(new Student("TOM", 19));
        list.add(new Student("Jellry", 18));
        list.add(new Student("Jellry", 18));
        ArrayList list1 = new ArrayList();
        Iterator iterator = list.iterator();
        while (iterator.hasNext()) {
                Object next = iterator.next();
                Student student = (Student)next;
            if (!list1.contains(student)) {
                list1.add(student);
            }
        }
        for (Object object : list1) {
            Student student = (Student)object;
            System.out.println(student);
        }

队列和栈

队列的特点:先进先出
栈的特点:先进后出

使用 LinkedList 模拟栈结构
private static void fun1() {
    LinkedList linkedList = new LinkedList();
    // 添加元素A,B,C,D模拟进栈
    linkedList.addLast("A");
    linkedList.addLast("B");
    linkedList.addLast("C");
    linkedList.addLast("D");
    System.out.println(linkedList);
    // 模拟出栈
    // 每次删之前查看一下这个集合是否为空的
    while (!linkedList.isEmpty()) {
        linkedList.removeLast();
        System.out.println(linkedList);
    }
}
ArrayList 去重
public static void fun2() {
    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 arrayList1 = new ArrayList();
    // 遍历原数组,取出每一个元素,比对是否存在于新数组中,不存在则放入,存在就放弃
    // 原数组迭代器
    Iterator iterator = arrayList.iterator();
    while (iterator.hasNext()) {
        // 判断原数组中元素是否存在于新数组中
        // 不存在就添加入新数组中,否则放弃
        Object next = iterator.next();// 不能调用两次 next() 方法
        if (!arrayList1.contains(next)) {
            // 将元素添加到新数组中
            arrayList1.add(next);
        }
    }
    System.out.println(arrayList1);
}
去除重复的学生
public static void fun3() {
    ArrayList arrayList = new ArrayList();
    // 六个学生的地址都不一样,所以不是同一个对象
    arrayList.add(new Student("鹏鹏", 18));
    arrayList.add(new Student("鹏鹏", 18));
    arrayList.add(new Student("水水", 17));
    arrayList.add(new Student("水水", 17));
    arrayList.add(new Student("茜茜", 16));
    arrayList.add(new Student("茜茜", 16));
    Iterator iterator = arrayList.iterator();
    ArrayList arrayList2 = new ArrayList();
    while (iterator.hasNext()) {
        Object next = iterator.next();
        Student student = (Student)next;
        if (!arrayList2.contains(student)) {
            arrayList2.add(student);
        }
    }
    for (Object object : arrayList2) {
        Student student = (Student)object;
        System.out.println(student);
    }
}
public class Student {
    private String name;// 姓名
    private int age;// 年龄
    public Student() {
        super();
    }
    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) {
        // 比较的是地址
        // return super.equals(obj);
        // 现在需求比对姓名和年龄
        Student student = (Student)obj;
        return this.name.equals(student.getName()) && this.age == student.getAge();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值