Collection & list

本文深入探讨了ArrayList与LinkedList这两种常用集合类的区别与特性,包括它们的底层实现、增删查改的操作方式及效率对比等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Collection
|–list 元素是有序的,可以重复
|–ArrayList
|–LinkedList
|–Vactor
|–set 元素是无序的,不可以重复
|–HashSet
|–TreeSet

ArrayList
collection接口的子类 ArrayList

    Emp e1 = new Emp();
        e1.setName("e1");
    Emp e2 = new Emp();
        e2.setName("e2");
    Emp e3 = new Emp();
        e3.setName("e3");

    ArrayList arr = new  ArrayList();

    /**
     * 1、add方法的参数类型是Object,以便于接收任意类型对象
     * 2.集合中存储的都是对象的引用(地址)
     */

    arr.add(e1);
    arr.add(e2);
    arr.add(e3);

    /**
     * 把取出方式定义在集合的内部,
     * 这样取出方式就可以直接访问集合内部的元素
     * 那么取出方式就被定义成了内部类
     * 而每一个容器的数据结构不同
     * 所以取出的动作细节也不一样。但是都有共性内容
     * 判断和取出。那么可以将写共性抽取
     * 内部类(接口),直接访问集合元素
     */
    //*********************************************
    Iterator it = arr.iterator();
    //*********************************************
        while(it.hasNext()){
            Object obj = it.next();
                    if(obj.equals(e1)){
                        //it.remove();
                        arr.add(e2);
                    }
        }
    //当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常。
    //迭代器对集合的引用进行操作,同时集合本身对自己进行操作,引发并发修改异常
    //要么用集合的方法,要么用迭代器的方法,此时用
    //*********************************************
    ListIterator li = arr.listIterator();
    //*********************************************
    System.out.println(li.hasNext()+"|1|"+li.hasPrevious());
            //(true |1| false)
    //正向遍历
    //*********************************************
    while(li.hasNext()){
        Object obj=li.next();
        if(obj.equals(e2)){
            li.set(e1);
            li.add(e1);
        }
    }
    System.out.println(li.hasNext()+"|2|"+li.hasPrevious());
            //(false |2|true)
    //逆向遍历
    //*********************************************
    while(li.hasPrevious()){
        Object obj=li.previous();
        if(obj.equals(e2)){
            System.out.println("1");
        }
    }
    System.out.println(li.hasNext()+"|3|"+li.hasPrevious());
        //(true |3| false)

ArrayList:
底层的数据结构使用的是数组结构(JDK1.2)。(线程不同步,速度快)(带下标)特点:查询速度快,增加和删除速度稍慢
构造一个初始容量为 10 的空列表。超过元素数量超过10的时候,再添加元素,会new一个新的数组,长度50%延长,将原有的拷贝过来,然后再后面加新的元素,可变长度数组

LinkedList:
底层使用的是链表数据结构。特点:增加和删除速度很快,查询速度慢。

public class LinkedListDem {

/**
 * LinkedList:特有方法
 * addFirst();将指定元素插入此列表的开头。 
 * addLast();将指定元素添加到此列表的结尾。 
 * getFirst(); 获取元素,但不删除元素,如果集合中没有元素,
 * getLast();--,会出现java.util.NoSuchElementException
 * removeFirst();获取元素,并删除元素,如果集合中没有元素,
 * removeLast();会出现java.util.NoSuchElementException
 * 在JDK1.6出现了替代方法:
 * offrt();将指定元素添加到此列表的末尾(最后一个元素)。 
 * offerFirst();在此列表开头插入指定的元素
 * offerLast();在此列表末尾插入指定的元素
 * peekFirst();获取元素,但不删除元素,
 * peekLast();--如果集合中没有元素,返回null
 * pollFirst();获取元素,并删除元素,
 * pollLast();--如果集合中没有元素,返回null
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    Emp e1 = new Emp ();
    e1.setName("a1");
    Emp e2 = new Emp ();
    e2.setName("a2");
    Emp e3 = new Emp ();
    e3.setName("a3");
    Emp e4 = new Emp ();
    e4.setName("a4");

    LinkedList <Emp> ll = new LinkedList<Emp>();
    //      System.out.println(ll.getFirst());//java.util.NoSuchElementException
    //      System.out.println(ll.removeFirst());//java.util.NoSuchElementException
        //  System.out.println(ll.peekFirst());//null
        //  System.out.println(ll.pollFirst());//null
        ll.add(e1);
        ll.add(e2);
        ll.add(e3);
    //      System.out.println(ll.getLast()+"||"+ll);//此人的人名是:a3||[此人的人名是:a1, 此人的人名是:a2, 此人的人名是:a3]
    //      System.out.println(ll.removeFirst()+"||"+ll);//此人的人名是:a1||[此人的人名是:a2, 此人的人名是:a3]
    //      System.out.println(ll.peekFirst()+"||"+ll);//此人的人名是:a1||[此人的人名是:a1, 此人的人名是:a2, 此人的人名是:a3]
    //      System.out.println(ll.pollFirst()+"||"+ll);//此人的人名是:a1||[此人的人名是:a2, 此人的人名是:a3]
            ll.offer(e4);
            ll.offerFirst(e4);
            System.out.println(ll);//[此人的人名是:a4, 此人的人名是:a1, 此人的人名是:a2, 此人的人名是:a3, 此人的人名是:a4]

}

}


package test;

import java.util.LinkedList;

public class LinkedListTest {

/**
 * 使用LinkedList 模拟一个堆栈或者队列数据结构
 * 堆栈:先进后出,如同一个杯子
 * 队列:现金新出,如图一个水管 First in  First out
 */
public static void main(String[] args) {
    // TODO Auto-generated method stub
    DuiLie dui = new DuiLie();
    Emp e1 = new Emp ();
    e1.setName("a1");
    Emp e2 = new Emp ();
    e2.setName("a2");
    Emp e3 = new Emp ();
    e3.setName("a3");
    dui.addEm(e1);
    dui.addEm(e2);
    dui.addEm(e3);
    System.out.println(dui.getBordor());//321
    while(!dui.isNull()){
        System.out.println(dui.getEm());
    }

/*  [此人的人名是:a3, 此人的人名是:a2, 此人的人名是:a1]
            此人的人名是:a3
            此人的人名是:a2
            此人的人名是:a1
            */

}



}

 class DuiLie{
    private LinkedList bordor;

public LinkedList getBordor() {
    return bordor;
}
public void setBordor(LinkedList bordor) {
    this.bordor = bordor;
}
public DuiLie(){
    bordor = new LinkedList();
}
public void addEm(Emp e){
    bordor.offerFirst(e);
}
public Object getEm(){
    return  bordor.pollFirst();
//      return  bordor.pollLast();
    }
    public Boolean isNull (){

    return bordor.isEmpty();
}
}

Vector:
底层的数据结构使用的是数组结结构(JDK1.0)(线程同步,速度慢,被ArrayList替代了)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值