Java列表(ArrayList、LinkedList、Vector类的相关功能及应用)

集合框架(ArrayList存储数据并遍历)

​ JDK1.8新增的一个方法也能遍历集合
void forEach(Consumer<? super E> action) 执行特定动作的每一个元素的 Iterable直到所有元素都被处理或操作抛出异常

代码示例:
去除一个列表中的重复的元素

package org.westos.demo;

import java.util.ArrayList;

/**
 * @Author: Administrator
 * @CreateTime: 2019-05-03 09:10
 */
public class MyTest2 {
    public static void main(String[] args) {
        ArrayList<Integer> list = new ArrayList<>();
        list.add(300);
        list.add(300);
        list.add(300);
        list.add(500);
        list.add(500);
        list.add(500);
        list.add(100);
        list.add(100);
        list.add(500);
        list.add(200);
        list.add(500);
        list.add(100);
        list.add(500);
        list.add(400);
        list.add(500);
        list.add(500);
        list.add(500);
        list.add(500);
        list.add(500);
        list.add(100);
        list.add(300);
        list.add(300);
        list.add(300);
        list.add(300);
        list.add(100);

        for (int i = 0; i < list.size() - 1; i++) {
            for (int j = i + 1; j < list.size(); j++) {
                Integer a = list.get(i);
                Integer b = list.get(j);
                if (a.equals(b)) {
                    list.remove(b);
                    j = i;
                }
            }
        }    
        System.out.println(list);
    }
}
  1. ArrayList创建对象就是一般方法,在上述代码中使用到了泛型,这里先不做过多讲解,在后续博客中会讲解到泛型,只需要知道在上述代码创建的列表中只能存储Integer类型的数据,否则会报错

  2. 在上述代码中,先给一个列表中添加了很多个元素,之后对其进行处理,去除列表中重复的元素

  3. 在比较列表中每一个元素时使用到了equal方法,这里需要提一下,因为在之前Integer类的博客中有讲解到,equal方法比较的是两个Integer对象的内容大小,而因为Integer类会提前创建从-128~127个对象,所以在自动装箱时就可能会发生创建新对象的情况,就会有新的地址值,所以用==比较就会发生错误,所以在这里一定要使用equal方法

  4. 去除重复元素的思想是将每一个元素对后面的每一个元素进行比较,如果发现重复的就将后面的元素删除,所以使用for循环嵌套,或使用迭代器自带的添加删除功能,否则会发生并发修改异常

  5. 这里使用for循环嵌套,n个元素比较n-1次,从而确定了两个循环的初始条件,list.remove(b);,依据索引删除元素

  6. 开头还提到了forEach方法,代码如下:

    list.forEach(new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.println(o);
            }
    });
    
  7. 这里的方法需要一个参数就是Consumer接口,根据之前的传参博客知道如果一个方法的参数需要一个接口,传上一个该接口的子类的对象,可以直接使用匿名内部类完成,在圆括号中输入new Consumer()后按住alt+enter之后再按回车键便可自动生成下面的代码,在public void accept(Object o) {}代码的括号中输入需要的代码逻辑即可

  8. 由于上述代码的Consumer接口中只含有一个抽象方法,所以可以使用Lambda表达式实现简写,代码实现如下:Consumer con = (obj) -> System.out.println(obj);,不用纠结于此,后面还会再次讲解到

集合框架(ArrayList功能)

  1. int indexOf (Object o)
    返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 - 1。

  2. int lastIndexOf (Object o)
    返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 - 1。

  3. List<E> subList ( int fromIndex, int toIndex)
    返回一个视图之间的指定 fromIndex和 toIndex这两个指定索引的列表,List list1 = list.subList(0, list.indexOf(200)+1);
    根据起始索引和结束索引从集合中截取一段元素,放到一个新集合中

  4. void forEach (Consumer < ? super E > action)
    执行特定动作的每一个元素的 Iterable直到所有元素都被处理或操作抛出异常。
    .

集合框架(Vector的特有功能)

Vector类概述: Vector 类可以实现可增长的对象数组 , Vector 是同步的。

Vector类特有功能:

  1. public void addElement(E obj) 将指定的组件添加到此向量的末尾,将其大小增加1。

  2. public E elementAt(int index) 返回指定索引处的组件。

  3. public Enumeration elements() 返回此向量的组件的枚举。

  4. void insertElementAt (E obj,int index)将指定对象作为此向量中的组件插入到指定的 index 处。

  5. vector 特有的迭代方式 elements()获取一个迭代器
    代码实现:

    Enumeration elements = vector.elements();
    while (elements.hasMoreElements()){
        Object o = elements.nextElement();
        System.out.println(o);
    }
    

集合框架(LinkedList的特有功能)

LinkedList类概述: List 接口的链接列表实现 , 此实现不是同步的

LinkedList类功能:

  1. public void addFirst(E e)及addLast(E e) 将指定元素插入此列表的开头 / 结尾。

  2. public E getFirst()及getLast() 返回此列表的 第一个 / 最后一个 元素。

  3. public E removeFirst()及public E removeLast() 移除并返回此列表的 第一个 / 最后一个 元素。

  4. E getFirst ()返回此列表的第一个元素。

  5. E getLast ()返回此列表的最后一个元素。

  6. int indexOf (Object o)返回此列表中首次出现的指定元素的索引,如果此列表中不包含该元素,则返回 - 1。

  7. int lastIndexOf (Object o)返回此列表中最后出现的指定元素的索引,如果此列表中不包含该元素,则返回 - 1。

  8. E peek ()获取但不移除此列表的头(第一个元素)。

  9. E peekFirst () 获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。

  10. E peekLast () 获取但不移除此列表的最后一个元素;如果此列表为空,则返回 null。

  11. E pop ()从此列表所表示的堆栈处弹出一个元素。

  12. void push (E e)将元素推入此列表所表示的堆栈。

  13. E removeFirst () 移除并返回此列表的第一个元素。

  14. E removeLast ()移除并返回此列表的最后一个元素。

  15. E poll() 获取并移除此列表的头(第一个元素)

集合框架(用LinkedList模拟栈数据结构的集合并测试)

需求:请用LinkedList模拟栈数据结构的集合,并测试/栈的数据结构特点:先进后出

package org.westos.java;


import java.util.LinkedList;


/**
 * @Author: Administrator
 * @CreateTime: 2019-05-03 11:11
 */
public class MyTest {
    public static void main(String[] args) {

        MyStack myStack = new MyStack();
        myStack.addEle(100);
        myStack.addEle(200);
        myStack.addEle(300);
        myStack.addEle(400);
        myStack.addEle(500);

        Object o = myStack.get();
        System.out.println(o);
        Object o2 = myStack.get();
        System.out.println(o2);

        Object o3 = myStack.get();
        System.out.println(o3);
        Object o4 = myStack.get();
        System.out.println(o4);
        Object o5 = myStack.get();
        System.out.println(o5);
        Object o6= myStack.get();
        System.out.println(o6);
    }
}


class MyStack {
    LinkedList linkedList;
    public MyStack() {
        linkedList= new LinkedList();
    }

    public void addEle(Object obj){
        linkedList.addFirst(obj);
    }

    public Object get(){
        //将第一个元素取出,并删除他
        Object poll = linkedList.poll();

        //把删除的元素再次加入到容器的最后面
        linkedList.addLast(poll);

        return poll;

    }

}

通过上述代码便可实现模拟栈操作

集合框架(去除ArrayList中重复字符串元素方式)

需求:ArrayList去除集合中字符串的重复值(字符串的内容相同)
思路:创建新集合方式

package org.westos.demo6;

import java.util.ArrayList;

/**
 * @Author: Administrator
 * @CreateTime: 2019-05-03 11:25
 */
public class MyTest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("abc");
        list.add("bbb");
        list.add("abc");
        list.add("abc");
        list.add("ccc");
        list.add("ddd");
        list.add("ccc");
        list.add("ddd");
        ArrayList newList = new ArrayList<>();
        for (int i = 0; i < list.size(); i++) {
            String s = (String) list.get(i);
            if(!newList.contains(s)){
                newList.add(s);
            }
        }

        System.out.println(newList);

    }
}

通过上述代码便可以实现去除集合中重复字符串的功能

集合框架(去除ArrayList中重复自定义对象元素)

需求:ArrayList去除集合中自定义对象元素的重复值(对象的成员变量值相同)

package org.westos.java;

import java.util.ArrayList;
import java.util.Objects;
import java.util.function.Consumer;

/**
 * @Author: Administrator
 * @CreateTime: 2019-05-03 11:29
 */
public class MyTest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add(new Student("张三",232));
        list.add(new Student("张三", 232));
        list.add(new Student("张三", 23));
        list.add(new Student("张三2", 23));
        list.add(new Student("张三3", 23));
        list.add(new Student("张三5", 23));
        list.add(new Student("张三", 23));
        list.add(new Student("张三", 23));
        list.add(new Student("张三4", 23));
        list.add(new Student("张三7", 23));
        list.add(new Student("张三5", 23));

        ArrayList newList = new ArrayList();   //定义一个新的列表
        for (int i = 0; i < list.size(); i++) {
            Student student = (Student) list.get(i);
            if(!newList.contains(student)){
                newList.add(student);
            }
        }
        newList.forEach(new Consumer() {
            @Override
            public void accept(Object o) {
                Student student= (Student) o;
                System.out.println(student.getName()+"=="+student.getAge());
            }
        });


    }
}


class Student {
    private String name;
    private int age;

    public Student() {
    }

    public Student(String name, int age) {
        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 "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Student student = (Student) o;
        return age == student.age &&
                Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}

在上述代码中在自定义类中重写了equal方法,为什么?
查看contains方法的源码可以看到

public boolean contains(Object o) {
        return indexOf(o) >= 0;
}

再查看index方法的源码

public int indexOf(Object o) {
    if (o == null) {
        for (int i = 0; i < size; i++)
            if (elementData[i]==null)
                return i;
    } else {
        for (int i = 0; i < size; i++)
            if (o.equals(elementData[i]))
                return i;
    }
    return -1;
}

里面使用到了自定义类的equal方法,自定义类默认方法是比较两个对象的引用,但是在这个案例中当两个对象的值相同时认为它们相等会更有意义,所以需要对equal方法进行重写,当两个对象的内容相等时就认为他们相等,便可将列表中内容相同的对象认为相等并删除后面的元素,实现了去除ArrayList中重复自定义对象元素的功能

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值