ArrayList-LinkedList-Vector

来源:互联网 发布:淘宝联盟有什么用 编辑:程序博客网 时间:2024/05/23 18:59

ArrayList

ArrayList是List接口的一个实现类,ArrayList集合的底层是使用一个数组来保存元素,在增加或删除指定位置的元素时,会导致创建新的数组,效率比较低,因此不适合做大量的增删操作。但这种数组的结构允许程序通过索引的方式来访问元素,因此使用ArrayList集合查找元素很便捷。

构造方法

  • ArrayList()
  • ArrayList(Collection< ? extends E> c)
  • ArrayList(int initialCapacity)

方法

  • Object clone()
  • void ensureCapacity(int minCapacity)
  • protected void removeRange(int fromIndex,int toIndex)
  • void trimToSize()

1.练习:去除ArrayList中重复字符串元素

package com.first;import java.util.ArrayList;import java.util.Iterator;public class HelloWorld {    public static void main(String[] args) {        ArrayList list=new ArrayList();        list.add("a");        list.add("a");        list.add("b");        list.add("b");        list.add("a");        ArrayList newList=getSingle(list);        System.out.println(newList);    }    /*     * 创建集合将重复元素去掉     *  1.明确返回值类型:ArrayList      *  2.明确参数列表:ArrayList     * 分析:      * 1.创建新集合     * 2.根据传入的集合(老集合)获取迭代器      * 3.遍历老集合      * 4.通过新集合判断是否包含老集合中的元素,如果包含就不添加,如果不包含就添加     */    private static ArrayList getSingle(ArrayList list) {        ArrayList newList=new ArrayList();        Iterator it=list.iterator();        while (it.hasNext()) {            Object obj=it.next();            if (!newList.contains(obj)) {                newList.add(obj);            }        }        return newList;    }}

运行结果为

 [a, b]

System.out.println(newList);可以将集合打印出来,是因为ArrayList的父类的父类AbstractCollection重写了toString()方法,这个方法又会调用每个元素的toString()方法,这里的元素是字符串,字符串默认已经重写了toString()方法。所以打印出来的不是其全类名@哈希值。

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

package com.first;import java.util.ArrayList;import java.util.Iterator;public class HelloWorld {    public static void main(String[] args) {        ArrayList list=new ArrayList();        list.add(new Student("张三",22));        list.add(new Student("张三",22));        list.add(new Student("李四",23));        list.add(new Student("张三",22));        ArrayList newList=getSingle(list);        System.out.println(newList);    }    private static ArrayList getSingle(ArrayList list) {        ArrayList newList=new ArrayList();        Iterator it=list.iterator();        while (it.hasNext()) {            Object obj=it.next();            if (!newList.contains(obj)) {                newList.add(obj);            }        }        return newList;    }}class Student {    String name;    int age;    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 obj) {        Student s=(Student)obj;        return this.name.equals(s.name)&&this.age==s.age;    }}

运行结果为

[Student [name=张三, age=22], Student [name=李四, age=23]]

contains方法底层依赖的是equal方法

LinkedList

构造方法

  • LinkedList()
  • LinkedList(Collection< ? extends E> c)

方法

  • void addFirst(E e)
  • void addLast(E e)
  • E getFirst()
  • E getLast()
  • E removeFirst()
  • E removeLast()

用LinkedList模拟栈结构

package com.first;import java.util.LinkedList;public class HelloWorld {    public static void main(String[] args) {        Stack s = new Stack();        s.in("a");        s.in("b");        s.in("c");        s.in("d");        while (!s.isEmpty()) {            System.out.println(s.out());        }    }}class Stack {    private LinkedList list = new LinkedList();    /*     * 模拟进栈方法     */    public void in(Object obj) {        list.addLast(obj);    }    /*     * 模拟出栈     */    public Object out() {        return list.removeLast();    }    /*     * 模拟栈是否为空     */    public boolean isEmpty() {        return list.isEmpty();    }}

Vector

没有集合前,用Vector,集合体系出现后,Vector已经完全不被重用了。

List的三个子类的特点

ArrayList:

​ 底层数据结构是数组,线程不安全,效率高。

Vector:

​ 底层数据结构是数组,线程安全,效率低,无论增删改查都慢。

LinkedList:

​ 底层数据结构是链表,线程不安全,效率高。

查询多用ArrayList

增删多用LinkedList

如果都多用ArrayList

0 0
原创粉丝点击