`
guoshaobin
  • 浏览: 15125 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论

Java集合框架总结--List接口的使用

    博客分类:
  • java
阅读更多
  List集合代表一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素,可以通过索引来访问指定位置的集合元素。1、List接口和ListIterator接口

    List作为Collection接口的子接口,可以使用Collection接口里的全部方法。List是有序集合,所以List集合里增加了一些根据索引来操作集合元素的方法:

    void add(int index, Object element):将元素element插入在List集合的index处。

    boolean addAll(int index, Collection c):将集合c所包含的所有元素都插入在List集合的index处。

    Object get(int index):返回集合index索引处的元素。

    int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引。

    Object remove(int index):删除并返回index索引处的元素。

    Object set(int index, Object element):将index索引处的元素替换成element对象,返回新元素。

    List subList(int fromIndex, int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合。

    List集合可以根据索引来插入、替换和删除集合元素。

示例程序:

public class TestList
{
    public static void main(String[] args)
    {
        List books = new ArrayList();
        //向books集合中添加三个元素
        books.add(new String("轻量级J2EE企业应用实战"));
        books.add(new String("Struts2权威指南"));
        books.add(new String("基于J2EE的Ajax宝典"));
        System.out.println(books);
        //将新字符串对象插入在第二个位置
        books.add(1 , new String("ROR敏捷开发最佳实践")); //已添加的对象,和下面语句做对比
        for (int i = 0 ; i < books.size() ; i++ )
        {
            System.out.println(books.get(i));
        }
        //删除第三个元素
        books.remove(2);
        System.out.println(books);
        //判断指定元素在List集合中位置:输出1,表明位于第二位
        System.out.println(books.indexOf(new String("ROR敏捷开发最佳实践"))); //新创建的对象
        //将第二个元素替换成新的字符串对象
        books.set(1, new String("Struts2权威指南"));
        System.out.println(books);
        //将books集合的第二个元素(包括)到第三个元素(不包括)截取称子集合
        System.out.println(books.subList(1 , 2));

    }
}

程序运行结果:

[轻量级J2EE企业应用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
轻量级J2EE企业应用实战
ROR敏捷开发最佳实践
Struts2权威指南
基于J2EE的Ajax宝典
[轻量级J2EE企业应用实战, ROR敏捷开发最佳实践, 基于J2EE的Ajax宝典]
1
[轻量级J2EE企业应用实战, Struts2权威指南, 基于J2EE的Ajax宝典]
[Struts2权威指南]


程序说明:List集合可以使用普通for循环来遍历集合元素。List判断两个对象相等只要通过equals方法比较返回true即可。如在判断“ROR 敏捷开发最佳实践”字符串的位置是,新创建了一个新字符串对象,但是程序仍返回第一次创建字符串对象的位置。当调用List的set(int  index, Object element)方法来改变List集合指定索引处元素时,指定的索引必须是List集合的有效索引。

     与set只提供了一个iterator()方法不同,List还额外提供了一个listIteratro()方法,该方法返回一个ListIterator对象,ListIterator接口继承了Iterator接口,提供了专门操作List的方法。

ListIterator接口在Iterator接口基础上增加了如下方法:

    boolean hasPrevious():返回该迭代器关联集合是否还有上一个元素。

    Object previous():返回该迭代器上一个元素。

    void add():在指定位置插入一个元素。

程序示例:

public static void main(String[] args)
    {
        String[] books = {
            "Struts2权威指南",
            "轻量级J2EE企业应用实战"
        };
        List bookList = new ArrayList();
        for (int i = 0; i < books.length ; i++ )
        {
            bookList.add(books[i]);
        }
        ListIterator lit = bookList.listIterator();
        while (lit.hasNext())
        {
            System.out.println(lit.next());
            lit.add("-------分隔符-------");
        }
        System.out.println("==========下面开始反向迭代===========");
        while(lit.hasPrevious())
        {
            System.out.println(lit.previous());
        }
    }
}

Struts2权威指南
轻量级J2EE企业应用实战
==========下面开始反向迭代===========
-------分隔符-------
轻量级J2EE企业应用实战
-------分隔符-------
Struts2权威指南

程序说明:List通过ListTterator迭代集合时,即可采用next()方法进行正向迭代,迭代过程中可以使用add()方法向上一次迭代元素的后面添加一个新元素。同时程序演示了向前迭代。

2、ArrayList和Vector实现类

    ArrayList和Vector作为List类的两个典型实现,完全支持前面介绍的List接口全部功能。

   ArrayList和Vector类都是基于数组实现的List类,他们封装了一个动态再分配的Object[]数组。每个ArrayList或 Vector对象有一个capacity属性,表示它们所封装的Object[]数组的长度。capacity会添加元素的个数而自动增加。当向集合中添 加大量元素时,可以使用ensureCapacity方法一次性地增加capacity。这可以减少增加重分配次数,从而提供性能。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()方法。从JDK1.2以后,Java提供了系统的集合框架,就将Vector改为实习List接口,作为List的实习之一,从而导致 Vector里有一些功能重复的方法。Vector具有很多缺点,通常尽量少用Vector实现类。



   ArrayList和Vector的区别:ArrayList是线程不安全的,多个线程访问同一个ArrayList集合时,如果有超过一条线程修改了ArrayList集合,则程序必须手动保证该集合的同步性。Vector集合则是线程安全的,无线程序保证该集合的同步性。因为Vector是线程安全的,所以Vector的性能比ArrayList的性能要低。实际上,即使保证List集合线程安全,同样不推荐使用Vector实现类。Collections工具类,可以将一个ArrayList变成线程安全的。



   Vector还提供了一个Stack子类,它用于模拟了”栈“这种数据结构,”栈“通常是指”后进先出“(LIFO)的容器。最后”push“进栈的元素,将最先被”pop“出栈。与Java中其他集合一样,进栈出栈的都是Object,因此从栈中取出元素后必须做类型转换,除非你只是使用Object具有的操作。所以stack类提供了如下几个方法:

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

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

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

程序示例:

public class TestVector
{
    public static void main(String[] args)
    {
        Stack v = new Stack();
        //依次将三个元素push入"栈"
        v.push("Struts2权威指南");
        v.push("轻量级J2EE企业应用实战");
        v.push("ROR敏捷开发最佳实践");
        //输出:[Struts2权威指南, 轻量级J2EE企业应用实战, ROR敏捷开发最佳实践]
        System.out.println(v);
        //访问第一个元素,但并不将其pop出"栈",输出:ROR敏捷开发最佳实践
        System.out.println(v.peek());
        //依然输出:[Struts2权威指南, 轻量级J2EE企业应用实战, ROR敏捷开发最佳实践]
        System.out.println(v);
        //pop出第一个元素,输出:ROR敏捷开发最佳实践
        System.out.println(v.pop());
        //依然输出:[Struts2权威指南, 轻量级J2EE企业应用实战]
        System.out.println(v);
    }
}

[Struts2权威指南, 轻量级J2EE企业应用实战, ROR敏捷开发最佳实践]
ROR敏捷开发最佳实践
[Struts2权威指南, 轻量级J2EE企业应用实战, ROR敏捷开发最佳实践]
ROR敏捷开发最佳实践
[Struts2权威指南, 轻量级J2EE企业应用实战]

3、LinkedList实现类

    List还有一个LinkedList的实现,它是一个基于链表实现的List类,对于顺序访问集合中的元素进行了优化,特别是当插入、删除元素时速度非常快。因为LinkedList即实现了List接口,也实现了Deque接口(双向队列),Deque接口是Queue接口的子接口,它代表一个双向列表,Deque接口里定义了一些可以双向操作队列的方法:

    void addFirst(Object e):将制定元素插入该双向队列的开头。

    void addLast(Object e):将制定元素插入该双向队列的末尾。

    Iterator descendingIterator():返回以该双向队列对应的迭代器,该迭代器将以逆向顺序来迭代队列中的元素。

    Object getFirst():获取、但不删除双向队列的第一个元素。

    Object getLast(): 获取、但不删除双向队列的最后一个元素。

    boolean offerFirst(Object e): 将指定的元素插入该双向队列的开头。

    boolean offerLast(Object e): 将指定的元素插入该双向队列的末尾。

    Object peekFirst(): 获取、但不删除该双向队列的第一个元素:如果此双端队列为空,则返回null。

    Object peekLast():获取、但不删除该双向队列的最后一个元素:如果此双端队列为空,则返回null。

    Object pollFirst():获取、并删除该双向队列的第一个元素:如果此双端队列为空,则返回null。

    Object pollLast():获取、并删除该双向队列的最后一个元素:如果此双端队列为空,则返回null。

    Object pop():pop出该双向队列所表示的栈中第一个元素。

    void push(Object e):将一个元素push进该双向队列所表示的栈中(即该双向队列的头部)。

    Object removerFirst():获取、并删除该双向队列的最后一个元素。

    Object removeFirstOccurrence(Object o):删除该双向队列的第一次的出现元素o。

    Object removeLast():获取、并删除该双向队列的最后一个元素。

    Object removeLastOccurrence(Object o):删除该双向队列的最后一次出现的元素o。

从上面方法中可以看出,LinkedList不仅可以当成双向队列使用,也可以当成“栈”使用。同时,LinkedList实现了List接口,所以还被当成List使用。

程序示例:

public class TestLinkedList
{
    public static void main(String[] args)
    {
        LinkedList books = new LinkedList();
        //将字符串元素加入队列的尾部
        books.offer("Struts2权威指南");
        //将一个字符串元素入栈
        books.push("轻量级J2EE企业应用实战");
        //将字符串元素添加到队列的头部
        books.offerFirst("ROR敏捷开发最佳实践");
        for (int i = 0; i < books.size() ; i++ )
        {
            System.out.println(books.get(i));
        }
        //访问、并不删除队列的第一个元素
        System.out.println(books.peekFirst());
        //访问、并不删除队列的最后一个元素
        System.out.println(books.peekLast());
        //采用出栈的方式将第一个元素pop出队列
        System.out.println(books.pop());
        //下面输出将看到队列中第一个元素被删除
        System.out.println(books);
        //访问、并删除队列的最后一个元素
        System.out.println(books.pollLast());
        //下面输出将看到队列中只剩下中间一个元素:轻量级J2EE企业应用实战
        System.out.println(books);

    }
}

程序运行结果:

ROR敏捷开发最佳实践
轻量级J2EE企业应用实战
Struts2权威指南
ROR敏捷开发最佳实践
Struts2权威指南
ROR敏捷开发最佳实践
[轻量级J2EE企业应用实战, Struts2权威指南]
Struts2权威指南
[轻量级J2EE企业应用实战]

说明:程序中示范了LinkedList作为双向队列、栈和List集合的用法。LinkedList与ArrayList、Vector的实现机制完全不同,ArrayList、Vector内部以数组的形式来保存集合中的元素,因此随机访问集合元素上有较好的性能;而LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合时性能较差,但在插入、删除元素时性能非常出色(只需改变指针所指的地址即可)。Vector因实现了线程同步功能,所以各方面性能有所下降。



关于使用List集合的几点建议:

    如果需要遍历List集合元素,对应ArrayList、Vector集合,则应该使用随机访问方法(get)来遍历集合元素,这样性能更好。对应LinkedList集合,则应采用迭代器(Iterator)来遍历集合元素。

    如果需要经常执行插入、删除操作来改变Lst集合大小,则应该使用LinkedList集合,而不是ArrayList。

    如果多条线程需要同时访问List集合中的元素,可以考虑使用Vector这个同步实现。
分享到:
评论

相关推荐

    精通java集合框架--List,Set..

    ### 精通Java集合框架——List, Set, Map #### 概述 Java集合框架是一种高度抽象且灵活的数据组织工具,它通过一系列接口来定义不同类型的数据容器,并提供了丰富的操作这些容器的方法。本文将深入探讨Java集合...

    Java集合框架总结

    ### Java集合框架总结 #### 一、Java集合框架概述 Java集合框架是Java标准库的一部分,它提供了一系列的接口和类来存储和操作各种类型的对象集合。这些接口和类遵循一致的设计模式,使得开发人员可以方便地管理和...

    Java集合框架pdf--培训中心资料

    ### Java集合框架知识点详解 #### 一、Java集合框架概览 Java集合框架是一组用于存储和操作数据的API,提供了多种数据结构和算法来帮助开发者高效地管理和处理数据。集合框架主要包括`Collection`和`Map`两个顶层...

    集合框架介绍----各种接口的方法

    Java集合框架是Java编程语言中一个非常重要的组成部分,它提供了一组用来操作和管理对象的接口和类。这个框架使得开发者能够以统一的方式处理各种数据结构,如列表、集合并和映射。以下是对集合框架及其接口的详细...

    java集合框架专题-java面试经典

    ### Java集合框架专题详解 #### 一、Java集合框架概览 Java集合框架是一个用于存储和操作对象集合的标准API。该框架提供了多种容器类型,包括`Collection`和`Map`两大类。 - **Collection**:这是一个接口,表示...

    Java集合框架使用总结

    ### Java集合框架使用总结 #### 前言 本文旨在为读者提供关于Java集合框架的概览性介绍,帮助理解其整体架构与设计理念。对于希望深入掌握特定接口或类使用方法的学习者,建议查阅官方提供的Java API文档。 #### ...

    11.集合框架001-Collection接口1-3

    接下来,我们转向“2-集合框架002-List接口-1080P 高清-AVC.mp4”。List接口是Collection的一个子接口,它增加了索引访问的能力,使得元素可以根据其位置被引用。ArrayList是List接口的一个具体实现,基于动态数组。...

    11.集合框架001-Collection接口13-16

    它是Java集合框架的顶级接口,位于`java.util`包下。所有的集合类,无论是List、Set还是Queue,都直接或间接地继承自Collection接口。Collection接口定义了基本的集合操作,如添加元素(add),删除元素(remove),检查...

    11.集合框架001-Collection接口6-9

    首先,`Collection`接口是Java集合框架的根接口,它定义了所有集合的基本操作,如添加、删除和检查元素。这个接口提供了`add()`、`remove()`、`clear()`等方法,使得开发者能够对一组对象进行基本操作。`Collection`...

    java集合框架图

    在Java集合框架中,主要有六种核心接口:`Collection`, `Set`, `List`, `Queue`, `Deque`, 和 `Map`。此外,还有五个抽象类以及多个实现类,它们共同构成了Java集合框架的基础。 #### 二、核心接口介绍 1. **`...

    集合框架List、Map、Set接口及其子类综合对比

    Java基础知识汇总之集合框架List、Map、Set接口及其子类综合对比

    11.集合框架001-Collection接口4-5

    8. **线程安全与并发**:Java集合框架中,有的类(如Vector、ConcurrentHashMap)是线程安全的,可以在多线程环境中直接使用,而其他类(如ArrayList、HashMap)则不是线程安全的,需要在多线程环境下通过同步机制...

    Java集合框架详解

    总结来说,Java集合框架为开发者提供了丰富的数据结构选择,能够适应各种场景下的数据处理需求。理解并熟练使用这些接口和类,对于提高代码的效率和可维护性至关重要。在实际开发中,根据具体需求选择合适的容器类型...

    Java集合框架常见面试题.pdf

    根据提供的文档内容,文件是关于Java集合框架的面试题知识点总结。以下是Java集合框架的知识点详述: Java集合框架主要包括Collection接口和Map接口两大分支。Collection接口主要包括List、Set以及Queue三个子接口...

    java集合框架总结

    ### Java集合框架总结 在Java编程中,集合框架(Collections Framework)是处理数据的重要工具集,它提供了一系列接口和类来存储、操作和检索不同类型的元素。本文将深入解析Java集合框架的关键知识点,涵盖其核心...

    11.集合框架001-Collection接口10-12

    Collection是Java集合框架中最基础的接口,它是所有单值容器类的父接口。Collection接口定义了一些基本的操作方法,如add()(添加元素)、remove()(移除元素)和size()(获取元素数量)。它还有其他子接口,如List...

Global site tag (gtag.js) - Google Analytics