java中的集合(一)

目录

List接口的常用实现类:

1.1ArrayList

1.2Vector

1.3LinkedList

1.4Queue接口

相关面试题


Collection是集合框架最基础的父类接口,可以存储一组无序、不唯一的对象。

List接口

List是Collection的常用子类接口,可以存储一组有序,不唯一的对象

List接口的常用实现类:

1.1ArrayList

ArrayList可以在内存中分配连续的空间,底层是基于索引的数据结构,所以访问元素的效率较高。索引有点在与访问元素的效率高,但是添加或删除元素时会移动兄弟元素的位置,所以添加或删除元素时效率低。

下面代码举例:

/**
 * @author EA_emran
 */
public class LearnArrayLest {
    public static void main(String[] args) {
        ArrayList list = new ArrayList();
        list.add("Hello");
        list.add("JavaEE");
        list.add("JavaSE");
        list.add("Spring");
        list.add("Mybatis");
        list.add("SpringMVC");
        System.out.println("list"+list);
        System.out.println("=========");
        System.out.println("list长度"+list.size());
        System.out.println("==========");
        System.out.println("list是否包含Java:"+list.contains("Java"));
        System.out.println("==========");
        //使用iterator遍历
        Iterator iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.print(iterator.next()+",");
        }
        System.out.println();
        System.out.println("============");
        //for循环遍历
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        System.out.println("===========");
        System.out.println();
        //移除元素
        list.remove("Hello");
        list.remove(4);
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        System.out.println();
        System.out.println("===============");
        //指定位置添加元素
        list.add(0,"Java好玩");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        System.out.println();
        System.out.println("==============");
        //替换元素
        list.set(3,"ArrayList");
        for (int i = 0; i < list.size(); i++) {
            System.out.print(list.get(i)+",");
        }
        System.out.println();
        System.out.println("JavaEE在集合中的下标"+list.indexOf("JavaEE"));
        //截取集合,半闭半开区间[)
        List list1 = list.subList(2,4);
        System.out.println(list1);
    }
}

运行结果

java中的集合(一)

1.2Vector

Vector是一个早起的List实现类,用法基本跟Arraylist一致,区别在于Vector是线程安全的。

大多数的Java程序员使用ArrayList而不是Vector,Vector每次扩容请求其大小的2倍空间,相较于Arraylist占空间效率低。

Stack是Vector的子类,实现了一个“后进先出”的栈

下面代码举例:

/**
 * @author EA_emran
 */
public class LearnVectorStack {
    public static void main(String[] args) {
        Stack stack = new Stack();
        stack.push("Hello");
        stack.push("JavaSE");
        stack.push("JavaEE");
        stack.push("JavaME");

        System.out.println(stack);

        for (int i = 0; i < stack.size(); i++) {
            System.out.println(stack.get(i));
        }
        System.out.println("===========");
        //peek()看查栈顶元素
        System.out.println(stack.peek());
        //pop()方法移除栈顶元素对象,并且作为函数的值返回该对象
        System.out.println(stack.pop());

        System.out.println(stack.peek());
    }
}

运行结果

java中的集合(一)

1.3LinkedList

LinkedList实现了一个“先进先出”的队列,采用双向链表的形式内部没有声明数组,对于频繁的插入或删除元素的操作效率高。

但是LinkedList不单单保存每个元素的节点数据,还要保存前后节点的位置信息,因此需要更多的内存空间,查询时需要从第一个元素开始遍历,所以查询效率低是它的缺点。

下面代码举例:

/**
 * @author EA_emran
 */
public class LearnLinkedList {
    public static void main(String[] args) {
        LinkedList linkedList = new LinkedList();
        linkedList.add("JavaSE");
        linkedList.add("javaEE");
        linkedList.add("Mybatis");
        System.out.println(linkedList);
        System.out.println("============");
        //在链表的最后添加元素
        linkedList.offer("Spring");
        linkedList.addLast("SpringMVC");
        System.out.println(linkedList);
        System.out.println("==============");

        linkedList.push("JavaME2");
        linkedList.addFirst("JavaME");
        System.out.println(linkedList);
        System.out.println("============");

        System.out.println("访问第一个元素:" +linkedList.peekFirst());
        System.out.println("访问全部元素:"+linkedList);
        System.out.println("访问最后一个元素:" +linkedList.peekLast());
        System.out.println("访问全部元素:"+linkedList);
        //将第一个元素从链表中取出
        System.out.println(linkedList.pop());
        System.out.println("取出第一个元素之外的元素"+linkedList);
        //将最后一个元素从链表中取出
        System.out.println(linkedList.pollLast());
        System.out.println("取出最后一个元素之外的元素"+linkedList);
    }
}

运行结果

java中的集合(一)

 

1.4Queue接口

Queue是继承自Collection,它的底层实现了队列的数据结构。

在实际开发中,不能直接实例化Queue,需要实例化它的实现类,但是实现类AbstractQueue是一个抽象类,所以我们需要实例化它的子类PriorityQueue。

/**
 * @author EA_emran
 */
public class LearnQueue {
    public static void main(String[] args) {
        PriorityQueue priorityQueue = new PriorityQueue();
        priorityQueue.add(new A(2));
        priorityQueue.add(new A(1));
        System.out.println(priorityQueue);
    }

}
class A implements Comparable{

    private int num;
    public A(int num){
        this.num = num;
    }



    @Override
    public int compareTo(Object o) {
        A a =(A) o;
        if (this.num>a.num){
            return 1;
        }else if(this.num == a.num){
            return 0;
        }else {
            return -1;
        }
    }
    @Override
    public String toString() {
        return "A{" +
                "num=" + num +
                '}';
    }
}

运行结果

java中的集合(一)

 

相关面试题:

一、请问ArrayList/LinkedList/Vector的异同?谈谈你的理解?

ArrayList和LinkedList的异同二者都线程不安全,相对线程安全的Vector,执行效率高。 此外,ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。 对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。 对于新增和删除操作add(特指插入)和remove,LinkedList比较占优势,因为ArrayList要移动数据。
 

二、ArrayList和Vector的区别Vector和ArrayList几乎是完全相同的

唯一的区别在于Vector是同步类(synchronized),属于强同步类。因此开销就比ArrayList要大,访问要慢。正常情况下,大多数的Java程序员使用ArrayList而不是Vector,因为同步完全可以由程序员自己来控制。Vector每次扩容请求其大小的2倍空间, 而ArrayList是1.5倍。Vector还有一个子类Stack。
 

上一篇:20. 有效的括号


下一篇:第二章 链表 删除值最小节点