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

【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

底层使用了链表数据结构实现的
这里写图片描述
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);
        }
    }
}   

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值