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

68.List集合java

(1)概念api

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

(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("马有失蹄");
            }
        }
    }
}

(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);
    }
}

69.ArrayListapp

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

ArrayList的底层是数组的原理。spa

ArrayList中的元素和能够重复线程

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

不是线程安全的。

效率高。

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

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

好处是性能高。

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

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

 

70.LinkedList

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

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

全部操做都是按照双重连接列表的须要执行的。在列表中编索引的操做将从开头或结尾遍历列表(从靠近指定索引的一端)。

Linked也不是线程安全的。

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

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

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

Vector 类能够实现可增加的对象数组。与数组同样,它包含可使用整数索引进行访问的组件。可是,Vector 的大小能够根据须要增大或缩小,以适应建立 Vector 后进行添加或移除项的操做。

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));
        }
    }
}

相关文章
相关标签/搜索