欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【JavaSE_学习笔记】List接口的三个子实现类

程序员文章站 2024-03-16 13:12:46
...

【JavaSE_学习笔记】List接口的三个子实现类

ArrayList

面试题:ArrayList无参构造方法默认的容量是多少?容量不够用时,自动增长多少?
  ArrayList底层是使用了一个Object数组实现的,往ArrayList中存储数据时,数据实际是存储在了Object数组中,使用无参构造方法时,Object数组的初始容量为10,但容量不够用时自动增长50%
ArrayList特有的方法:
  ensureCapacity(int minCapacity):改变ArrayList的初始容量
   一般用ArrayList的带参构造实现初始容量
  trimToSize():将ArrayList的容量调整为列表的当前大小
ArrayList的特点:
  查询速度快,修改也快,增删满,线程不安全,不同步,执行效率高
  查询快:因为数组中元素与元素的内存地址是连续的
  增慢:因为每次都要检查容量是否够用,还要拷贝内容到新数组
  删慢:因为删除数据要将后边的元素拷贝到前边
ArrayList的应用场景:
  如果操作的数据查询较多,增删较少,这是应用ArrayList,如图书馆
练习:

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

/**
 * 需求:ArrayList去除集合中字符串的重复元素
 *      1)首先创建一个集合
 *      2)给集合中添加很多重复元素
 *      3)再次创建一个新集合
 *      4)获取迭代器遍历
 *      5)获取到该集合中的每一个元素
 *              判断新集合中是否包含这些有素
 *              有,不搭理它
 *              没有.说明不重复,添加进来
 *       6)遍历新集合
 * @author Apple
 */
public class ArrayListTest {

    public static void main(String[] args) {

        //1)创建一个集合
        ArrayList array = new ArrayList() ;

        //2)给集合中添加多个重复元素
        array.add("hello") ;
        array.add("hello") ;
        array.add("hello") ;
        array.add("world") ;
        array.add("world") ;
        array.add("world") ;
        array.add("Java") ;
        array.add("Java") ;
        array.add("hello") ;
        array.add("Javaweb") ;
        array.add("JavaEE") ;
        array.add("JavaEE") ;

        //3)创建一个新的集合
        ArrayList newArray = new ArrayList() ;

        //4)遍历旧集合,获取当前迭代器对象
        Iterator it = array.iterator() ;
        while(it.hasNext()){
            String s = (String) it.next() ;

            //拿到了每一个字符串元素
            //判断新集合是否包含旧集合中的元素

            if(!newArray.contains(s)){
                //不包含,就将元素直接添加到新集合中
                newArray.add(s) ;
            }
        }

        //遍历新集合
        Iterator it2 = newArray.iterator() ;
        while(it2.hasNext()){
            String s = (String) it2.next() ;
            System.out.println(s);
        }
    }
}
import java.util.ArrayList;
import java.util.Iterator;

/**
 *  需求:ArrayList去除集合中字符串的重复元素,
 *          附件条件:不能创建新集合!
 * @author Apple
 */
public class ArrayListTest2 {

    public static void main(String[] args) {

        //创建一个集合,添加重复元素
        ArrayList array = new ArrayList() ;

        array.add("hello") ;
        array.add("hello") ;
        array.add("hello") ;
        array.add("world") ;
        array.add("world") ;
        array.add("world") ;
        array.add("Java") ;
        array.add("Java") ;
        array.add("hello") ;
        array.add("Javaweb") ;
        array.add("JavaEE") ;
        array.add("JavaEE") ;

//      System.out.println(array);
        /**
         * 由选择排序的逻辑想到:
         * 拿0索引对应的元素依次和后面索引对应的元素进行比较
         * 同理,1索引对应的元素和后面.....
         * 前面的索引对应的元素如果和后面索引对应的元素重复了,从集合移出后面索引的对应的元素
         */
        for(int x = 0 ;x <array.size() -1 ; x ++){
            for(int y= x +1 ; y <array.size() ;y++){
                //判断
                if(array.get(x).equals(array.get(y))){
                    array.remove(y) ;
                    y -- ;
                }
            }
        }

        //遍历集合
        Iterator it = array.iterator() ;
        while(it.hasNext()){
            String s = (String) it.next() ;
            System.out.println(s);
        }
    }
}

LinkedList

底层使用了链表数据结构实现的
【JavaSE_学习笔记】List接口的三个子实现类
LinkedList的特点:
  查询速度慢,修改也慢,增删快,线程不安全,不同步,执行效率高。
  查询慢:因为需要从第一个元素开始一个一个查询到目标元素
  增快:只需使上一个的地址指向目标元素
  删除快:使地址直接指向下下一个元素,下一个元素不再指向下下一个,则将下一个元素删除
LinkedList特有的方法:
  void addFirst(E e):把元素添加到集合的首位置
  void addLast(E e):把元素添加到集合的末位置
  getFirst():获取集合的首位置元素
  getLast():获取集合的末尾元素
  removeFirst():删除并返回集合的首元素
  removeLast():删除并返回集合的末尾元素
  
  队列的数据结构具备的特点:先进先出、后进后出
  E push():压栈
  E pop():弹栈
  栈数据结构具备的特点:先进后出、后进先出
  boolean offer(E e):将指定元素添加到此列表末尾
  E poll():获取并移除此列表的第一个元素
  E peek():获取但不移除此列表的第一个元素
  E peekFirst():获取但不移除此列表的第一个元素
     若此列表为空,则返回null
  E peekLast():获取但不移除此列表的最后一个元素
     若此列表为空,则返回null
  descendingIterator():返回逆序的迭代器对象
练习:

public class Demo10 {

    public static void main(String[] args) {
        LinkedList list = new LinkedList();
        list.add("张三");
        list.add("李四");
        list.add("王五");

    /*  list.addFirst("狗娃");
        list.addLast("狗剩");

        System.out.println("首元素:"+ list.getFirst());
        System.out.println("末尾元素:"+ list.getLast());

        System.out.println("删除的首元素:"+ list.removeFirst());
        System.out.println("删除末尾元素:"+ list.removeLast());




        list.push("狗娃");  //把元素添加到集合的首位置
        System.out.println("出栈(删除并返回集合中首元素):"+ list.pop());



        list.offer("标哥");
        System.out.println("删除并返回集合的首元素:"+ list.poll());
        */


        Iterator it = list.descendingIterator(); 
        while(it.hasNext()){
            System.out.print(it.next()+",");
        }
    }


}

ArrayList和LinkedList的存储查找优缺点:
  1.ArrayList是采用动态数组存储元素的,允许直接用索引来查找对应的元素,但插入元素要涉及数组元素移动及内存的操作
   总结:查找速度快,插入操作慢
  2.LinkedList采用双向链表实现存储,按序号索引数据需要进行向前或者向后遍历,但插入数据时只需记录本项的前后项即可,插入速度较快

Vector

一般需求没有指明使用哪种集合去完成,默认采用ArrayList完成
要考虑线程安全时,则使用Vector
特点:
  底层数据结构是数组,多线程安全的,执行效率低。同步,查询快,增删满
特有的方法:
  void addElement(E obj):在集合末尾添加元素
  ——->相当于:add(Object e)
  E elementAt(int index):返回制定角标的元素
  Enumeration elements():返回集合中的所有元素,封装到Enumeration对象中
  —–>相当于:Iterator iterator()
  Enumeration接口:向量的组件枚举有两个方法
  boolean hasMoreElements():——>相当于:hasNext()
  Object nextElement():———–>相当于:next()
练习:

import java.util.Enumeration;
import java.util.Vector;

public class VectorDemo {

    public static void main(String[] args) {

        //创建一个Vector集合对象
        Vector v = new Vector() ;

        //添加元素
        //public void addElement(E obj)
        v.addElement("hello");
        v.addElement("hello");
        v.addElement("world");
        v.addElement("Java");

        //public Enumeration<E> elements()----->相当于:Iterator iterator() ;
        Enumeration en = v.elements() ;
        //遍历元素
        /**
         * boolean hasMoreElements():------>相当于:hasNext()
        Object nextElement():----------->相当于:next();
         */
        while(en.hasMoreElements()){
            //获取元素
            String s = (String)en.nextElement() ;
            System.out.println(s);
        }
    }
}   

相关标签: java se