Java集合框架(三)—— List、ArrayList、Vector、Stack

  • List接口

List集合代表一个有序集合,集合中每一个元素都有其对应的顺序索引。List集合容许使用重复元素可以通过索引来访问指定位置的集合对象。

  • ArrayList和Vector实现类

ArrayList和Vector做为List的类的两个典型实现,完全支持list集合的全部功能。

ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态再分配的Object[]数组。每个ArrayList或Vector对象有一个capacity属性,这个capacity表示它们所封装的Object[]数组的长度。当向ArrayList或Vector中添加元素时,它们的capacity会自动增加。

  对于通常编程场景,程序员无须关心ArrayList或Vector的capacity属性。但如果向ArrayList集合或Vector集合中添加大量元素时,可使用ensureCapacity方法一次性地增加capacity。这可以减少增加重分配的次数,从而提高性能。

  如果开始就知道ArrayList或Vector需要保存多少个元素,则可以在创建该它们时就指定它们的capacity大小。如果创建空的ArrayList和Vector时不指定capacity属性,该属性默认为10

  除此之外,ArrayList和Vector还提供了如下两个方法来操作capacity属性:

void ensureCapacity(int minCapacity);  将ArrayList或Vector集合的capacity增加minCapacity。

void trimToSize();   调整ArrayList或Vector集合的capacity为列表当前大小。程序可调用该方法来减少ArrayList或Vector集合对象存储空间。

ArrayList和Vector在用法上几乎完全相同,但由于Vector是一个古老的集合(从JDK1.0就有了),最开始的时候,Java没有提供系统的集合框架,所以Vector里面提供一些方法名很长的方法:例如addElement(Object obj);实际上这个方法与add(Object obj)没有任何区别。从JDK1.2之后,Java提供了系统的集合框架,就将Vector改为实现List接口,做为List的实现之一,从而导致Vector里面有一些功能重复的方法。

  除此之外,ArrayList和Vector的显著区别是ArrayList是线程不安全的,当多条线程访问同一个ArrayList集合时,如果有超过一条线程修改了ArrayList集合,则程序必须受到保证该集合的同步性。但Vector是线程安全的,无须程序保证该集合的同步性。因为Vector是线程安全的,所以Vector的性能要比ArrayList的效率要低。实际上即使需要保证list集合线程安全,同样不推荐使用Vector实现类,而是使用Collections工具类,它可以将一个ArrayList变的线程安全。

  Vector还提供了一个Stack子类,它用于模拟了“”这种数据结构,“栈”通常是指“后进先出”的容器。最后“push”进栈的元素,将最先被“pop”出栈。与Java中其他集合一样,进栈出栈的都是Object。

Object peek();   //返回“栈”的第一个元素,但并不将该元素“pop”出栈。

Object pop();    //返回“栈”的第一个元素,并将该元素“pop”出栈。

void push(Object obj);    //将一个元素“push”进栈,最后一个进“栈”的元素总是位于“栈”顶。

public class Test {
    public static void main(String[] args){
        Stack<Integer> s = new Stack<Integer>();
        s.push(6);
        s.push(5);
        s.push(4);
        //输出:[6, 5, 4]
        System.out.println(s);
        //访问第一个元素,但并不将其pop出栈,输出:4
        System.out.println(s.peek());
        //pop出第一个元素,输出:4
        System.out.println(s.pop());
        //输出: [6, 5]
        System.out.println(s);
    }
}
  • 固定长度的List

  我们知道有一个操作数组的工具类Arrays,该工具类里提供了asList(Object...  a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例

Arrays.ArrayList是一个固定长度的List集合程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。如下:

 public class Test {
    public static void main(String[] args){
        String str[] = {"北京", "上海", "深圳"};
        List<String> list = Arrays.asList(str);
        for(String s : list){
            System.out.println(s);
        }
        //以下两句都将引起错误java.lang.UnsupportedOperationException
        list.add("南京");
        list.remove(0);
    }
}

   上面最后两行代码对于普通List集合完全正常,但如果试图通过这两个方法来增加、删除Arrays.ArrayList集合里的元素,将会引发异常。所以上面代码在编译时完全正常,但在运行时抛出java.lang.UnsupportedOperationException异常。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏java初学

13.2 具体的集合

2769
来自专栏LanceToBigData

JavaSE(八)之集合概述

前几天其实一直在学习关于linux的内容和kvm虚拟化的知识。今天有时间来回顾一下集合相关的知识,接下来我将带大家一起来回顾一起集合关联的知识。 不要辜负自己花...

1875
来自专栏尾尾部落

[算法总结] 一文搞懂面试链表题

链表是面试过程中经常被问到的,这里把剑指offer 和 LeetCode 中的相关题目做一个汇总,方便复习。

1251
来自专栏用户画像

剑指offer 栈的压入,弹出序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序...

883
来自专栏desperate633

LintCode 堆化代码

481
来自专栏编程心路

在ArrayList的循环中删除元素,会不会出现问题?

在 ArrayList 的循环中删除元素,会不会出现问题?我开始觉得应该会有什么问题吧,但是不知道问题会在哪里。在经历了一番测试和查阅之后,发现这个“小”问题并...

4982
来自专栏WD学习记录

Leetcode Reverse Integer

Given a 32-bit signed integer, reverse digits of an integer.

1122
来自专栏desperate633

LintCode 用递归打印数字题目分析代码

recursion(i) { if i > largest number: return results.add(i) recursion(i + 1)...

671
来自专栏用户2442861的专栏

Java 集合系列02之 Collection架构

本文,我们将对Collection进行概括。下面先看看Collection的一些框架类的关系图:

671
来自专栏积累沉淀

必须掌握的八种排序(3-4)--简单选择排序,堆排序

3、简单选择排序 (1)基本思想:在要排序的一组数中,选出最小的一个数与第一个位置的数交换; 然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第...

2169

扫码关注云+社区

领取腾讯云代金券