Java第十五天(List、ArrayList、LinkedList、Vector)

68.List集合

(1)概念

List是有序的集合,就像我们的数组一样。我们可以把list理解为是一个长度可变的数组,而且提供了丰富的api。List的集合底层就是数组。

baadb8ead3fd7d7d447fb71d400c26bb525.jpg

(2)List的添加和获得

import java.util.ArrayList;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
        List l1=new ArrayList();
        //List中添加
        l1.add("孙悟空");
        l1.add("猪八戒");
        l1.add("沙和尚");
        //指定索引位置添加
        l1.add(3,"挑担子");
        List l2=new ArrayList();
        l2.add("唐僧");
        l2.add("白龙马");
        l2.add("孙悟空");
        l2.add("猪八戒");
        l2.add("沙和尚");
        //指定索引位置添加子集合的内容
        l1.addAll(1,l2);
        System.out.println(l1);

        //Object o = l1.get(1);根据索引获得集合中的元素,默认返回的是Object的,但是如果已知是String类型可以强转
        String o = (String) l1.get(1);
        System.out.println(o);
        //获得集合中"孙悟空"第一次出现的索引,如果不包含该元素则返回-1
        int i=l1.indexOf("孙悟空");
        System.out.println(i);
        //获得集合中"孙悟空"最后一次出现的索引,如果不包含该元素则返回-1
        int j=l1.lastIndexOf("孙悟空");
        System.out.println(j);
    }
}

(3)List的遍历方法

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListTest1 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        //List中添加
        l1.add("孙悟空");
        l1.add("猪八戒");
        l1.add("沙和尚");
        //指定索引位置添加
        l1.add(3, "白龙马");
        ListIterator listIterator = l1.listIterator();
        while (listIterator.hasNext()){
            Object next = listIterator.next();
            System.out.println(next);
            //使用迭代器遍历的过程中集合本身是不能更改的,这样有多线程的并发问题;但是可以通过迭代器更改集合,所作的更改不参与本次遍历
            if(next.equals("白龙马")){
                listIterator.add("蹄儿朝西");
            }
        }
        System.out.println("-----------ListIterator第二次遍历------------");
        //list使用迭代器遍历是可以逆转的,对比Collection
        while (listIterator.hasPrevious()){
            Object previous = listIterator.previous();
            System.out.println(previous);
        }
        System.out.println("-----------使用for循环遍历------------");
        //还可以使用for循环进行遍历
        for (int i = 0; i < l1.size(); i++) {
            Object o=l1.get(i);
            System.out.println(o);
            //for循环中是可以更改集合的,i < l1.size()此处使用的是可变的动态的集合长度,因此所作的更改参与这次的遍历
            if(o.equals("蹄儿朝西")){
                l1.add("马有失蹄");
            }
        }
    }
}

44d0605086decfbc8022af15085683e1d42.jpg

(4)List删除方法

import java.util.ArrayList;
import java.util.List;

public class ListTest2 {
    public static void main(String[] args) {
        List l1 = new ArrayList();
        //List中添加
        l1.add("孙悟空");
        l1.add("猪八戒");
        l1.add("沙和尚");
        l1.add("孙悟空");
        l1.add("猪八戒");
        l1.add("沙和尚");
        System.out.println("//删除集合中指定索引的元素----------------");
        l1.remove(2);
        System.out.println("//删除集合中第一次检索到的指定元素----------------");
        l1.remove("猪八戒");
        System.out.println(l1);
        List l2 = new ArrayList();
        l2.add("唐僧");
        l2.add("白龙马");
        l2.add("猪八戒");
        l2.add("沙和尚");
        l1.addAll(1, l2);
        System.out.println("//指定索引位置添加子集合的内容----------------");
        System.out.println(l1);
        l1.removeAll(l2);
        System.out.println("//删除集合所有子集合包含的元素----------------");
        System.out.println(l1);
        l1.set(1,"孙行者");
        System.out.println("//修改指定索引处的元素----------------");
        System.out.println(l1);
        l1.clear();
        System.out.println(l1);
    }
}

19efb085eaa53e335ff44ab0731e1ea3d62.jpg

69.ArrayList

d6138ba7db9830bd50422e57ec7d42430ea.jpg

List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)

7619a025ab26507932cc07118202137be32.jpg

ArrayList的底层是数组的原理。

ArrayList中的元素和可以重复

是有序的集合,长度不固定。

不是线程安全的。

效率高。

ArrayList在添加数据的时候初始的长度是10,后续会以5个长度来扩充集合的长度。

ArrayList不是线程安全的集合,适合不要求线程安全的需求来实现。

好处是性能高。

缺点就是线程不安全,可能带来数据不准确。

如果线程要是同步的话,性能就会变低。

 

70.LinkedList

4878dbddbf7b5116ebb7e2673523c7fd38f.jpg

List 接口的链接列表实现。实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。

此类实现 Deque 接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

所有操作都是按照双重链接列表的需要执行的。在列表中编索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。

Linked也不是线程安全的。

链表:储存了元素和前后的地址

LinkedList是链表为原理,添加修改删除的性能高。

ab8e62d866198ce39e703dccddabe4043b3.jpg

import java.util.LinkedList;

public class LinkListTest {
    public static void main(String[] args) {
        LinkedList list=new LinkedList();
        list.add("取经");
        list.addFirst("西天");
        list.addLast("上大路");
        System.out.println(list);//[西天, 取经, 上大路]
        /*list.removeFirst();//[取经, 上大路]
        list.removeLast();//[取经]*/
        Object pop = list.pop();//出栈
        System.out.println(pop);//西天    栈顶的元素出栈
        System.out.println(list);//[取经, 上大路]
        list.push("小西天");//压栈    栈顶添加进去
        System.out.println(list);//[小西天, 取经, 上大路]
        Object pop1 = list.pop();
        System.out.println(pop1);//小西天    栈顶的元素出栈
        System.out.println(list);//[取经, 上大路]
    }
}

 

71.Vector

9cf46e0503c9ed19d9ddac2bef5af617983.jpg

Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

bd2b2a379ba5acd219c61ffd797702e732e.jpg

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

public class VectorTest {
    public static void main(String[] args) {
        Vector list=new Vector();
        list.add("banana");
        list.add(0,"apple");
        Vector list2=new Vector();
        list2.add("pineappple");
        list2.add("pineapple cake");
        list.addAll(list2);
        System.out.println(list.get(2));
        System.out.println(list.elementAt(2));
        System.out.println("---------Vector中使用elements()遍历----------");
        Enumeration elements = list.elements();
        while (elements.hasMoreElements()){
            Object o = elements.nextElement();
            System.out.println(o);
        }
        System.out.println("---------Vector中使用for循环遍历----------");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }
}

f55a329b65dbc07330961ba1de0f0abc382.jpg

 

转载于:https://my.oschina.net/u/4110331/blog/3049592

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值