今天开始更新Java集合类相关博客,暂时打算分为List,Set,Map三个部分讲解,先出一个原型博客然后迭代更新(PS:依稀记得某些算法博客我也是这么说的然后原型写完就没后续了.......)。在讲最简单的List之前,先介绍下Collection接口的所有相关类的层次结构。

1. 集合类的层次关系

Java类的集合关系如图:

具体而言,Collection相关的类关系如下:

  • Collection<--List<--Vector
  • Collection<--List<--ArrayList
  • Collection<--List<--LinkedList
  • Collection<--Set<--HashSet
  • Collection<--Set<--HashSet<--LinkedHashSet
  • Collection<--Set<--SortedSet<--TreeSet
  • Collection<--Queue
  • Map<--SortedMap<--TreeMap
  • Map<--HashMap

2. List接口简介

List是有序的Collection,有以下几个特性:

  • 元素可以使用索引去访问,类似于Java的数组。
  • 具有列表的功能,元素的顺序是按照添加的先后排序的。
  • 允许重复元素和null元素。

3. List的常用方法

// C增:初始化,以ArrayList()为例
List list = new ArrayList();
// C增:向列表的尾部追加指定的元素
list.add("lwc");
// C增:在列表的指定位置插入指定元素
list.add(1, "nxj");
// C增:追加指定 collection 中的所有元素到此列表的结尾
list.addAll(new ArrayList());
// U更:用指定元素替换列表中指定位置的元素
list.set(0, "lp");
// R查:如果列表包含指定的元素,则返回true
list.contains("nxj");
// R查:如果列表包含指定 collection 的所有元素,则返回 true
list.containsAll(new ArrayList());
// R查:比较指定的对象与列表是否相等
list.equals(new ArrayList());
// R查:返回列表中指定位置的元素
list.get(0);
// R查:返回列表的哈希码值
list.hashCode();
// R查:返回列表中首次出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.indexOf("lwc");
// R查:返回列表中最后出现指定元素的索引,如果列表不包含此元素,则返回 -1
list.lastIndexOf("lwc");
// R查:如果列表不包含元素,则返回 true
list.isEmpty();
// R查:返回包含列表中的所有元素的Object[]数组
list.toArray();
// R查:返回包含列表中所有元素的数组,可以用参数指定对象类型
list.toArray(new String[] { "a", "b" });
// R查:返回列表中的元素数
list.size();
// R查:返回列表中指定的fromIndex(包括)和toIndex(不包括)之间的视图,即其中内容仍为原List对象中内容,若更改会影响原List对象。
list.subList(1, 2);
// D删:移除列表中指定位置的元素
list.remove(0);
// D删:移除列表中出现的首个指定元素
list.remove("lwc");
// D删:从列表中移除指定 collection 中包含的所有元素
list.removeAll(new ArrayList());
// D删:从列表中移除所有元素
list.clear();

4. List实例

4.1. Vector

Vector是基于数组的List,相当于给数组添加了一些方便调用的功能。因此,它难以避免一些数组的限制,且性能也不会超过数组。Vector和ArrayList的区别是Vector中各方法是synchronized修饰的方法。而ArrayList中各方法没有synchronized修饰。因而,Vector是线程安全的而ArrayList不是,这也是它们最大的区别。

4.2. ArrayList

和Vector一样是基于数组的一种List结构,和Vector相比,由于其方法没有被synchronized修饰,因此有着更好的性能,但是在多线程环境下需要十分小心。

4.3. Vector和ArrayList的扩容

由于Vector和ArrayList是基于数组的,当数组的容量不够时(默认的初始容量是10,可以通过构造器自己设置),将会发生1.5倍扩容。易知如果扩容长度为2倍,那么新的数组无法利用扩容时释放的旧数组内存。当然,选择2倍在时间上要优于1.5倍。

4.4. LinkedList

不同于ArrayList和Vector,LinkedList如其名是不基于数组而是基于链接表的。因此,LinkedList的性能是不受数组限制的。LinkedList的节点构成如下:

    private static class Node<E> {
E item;
Node<E> next;
Node<E> prev; Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}

我们可以看到,LinkedList基于一个双向链接表,因此,当进行List中间位置的删除/添加工作时,LinkedList不会像ArrayList一样需要改动整个数组,仅仅对相关节点进行改动即可。但同时,在进行查询任务时,LinkedList的性能将劣于ArrayList。

5. 参考文章

JAVA集合类汇总

Java Collection

Java容器:List的更多相关文章

  1. 【Java心得总结七】Java容器下——Map

    我将容器类库自己平时编程及看书的感受总结成了三篇博文,前两篇分别是:[Java心得总结五]Java容器上——容器初探和[Java心得总结六]Java容器中——Collection,第一篇从宏观整体的角 ...

  2. 【Java心得总结六】Java容器中——Collection

    在[Java心得总结五]Java容器上——容器初探这篇博文中,我对Java容器类库从一个整体的偏向于宏观的角度初步认识了Java容器类库.而在这篇博文中,我想着重对容器类库中的Collection容器 ...

  3. 【Java心得总结五】Java容器上——容器初探

    在数学中我们有集合的概念,所谓的一个集合,就是将数个对象归类而分成为一个或数个形态各异的大小整体. 一般来讲,集合是具有某种特性的事物的整体,或是一些确认对象的汇集.构成集合的事物或对象称作元素或是成 ...

  4. Java 容器(list, set, map)

    java容器类库的简化图: (虚线框表示接口, 实线框表示普通的类, 空心箭头表示特定的类实现了接口, 实心箭头表示某个类可以生成箭头所指的类对象) 继承Collection的主要有Set 和 Lis ...

  5. Java - 容器详解

    一.ArrayList 长度可变数组,类似于c++ STL中的vector. 元素以线性方式连续存储,内部允许存放重复元素. 允许对元素进行随机的快速访问,但是向ArrayList中插入和删除元素的速 ...

  6. Java 容器:Collection 初探之 List

    1 ///: JavaBasic//com.cnblogs.pattywgm.day1//CollectionTest.java 2 3 package com.cnblogs.pattywgm.da ...

  7. java容器---集合总结

    思考为什么要引入容器这个概念? Java有多种方式保存对象(应该是对象的引用),例如使用数组时保存一组对象中的最有效的方式,如果你想保存一组基本类型的数据,也推荐使用这种方式,但大家知道数组是具有固定 ...

  8. 3)Java容器

    3)Java容器   Java的集合框架核心主要有三种:List.Set和Map.这里的 Collection.List.Set和Map都是接口(Interface). List lst = new ...

  9. JAVA容器

    JAVA容器 一.容器体系结构 java.util 二.迭代器Iterator<E> 迭代器是一种设计模式,可以遍历并选择序列中的对象,而开发人员并不需要了解该序列的底层结构.迭代器通常被 ...

  10. Java 容器相关知识全面总结

    Java实用类库提供了一套相当完整的容器来帮助我们解决很多具体问题.因为我本身是一名Android开发者,包括我在内很多安卓开发,最拿手的就是ListView(RecycleView)+BaseAda ...

随机推荐

  1. Linux IPC实践(12) --System V信号量(2)

    实践1:信号量实现进程互斥 父子进程执行流程如下: 父进程 子进程 P P O(print) X(print) sleep sleep O(print) X(print) V V sleep slee ...

  2. leetcode之word ladder

    对于之前没有接触过该类型题目的人来说,此题无疑是个难题,本人提交了10次才正确通过,期间遇到了非常多的问题,感觉几乎把OJ的所有错误遍历了一遍,下面详细说说自己做该题的经验. 首先承认,我一开始并没有 ...

  3. MSRDS机器人仿真软件学习资源汇总

    这款机器人仿真软件支持winxp,7,8,10操作系统. 最简洁快速的学习资源主要在helloapps上, 使用spl可以获得丰富的支持,如C#, Java, Python, MATLAB, LabV ...

  4. 3、使用Gradle创建Libgdx项目

    (原文链接:http://www.libgdx.cn/topic/20/3-%E4%BD%BF%E7%94%A8gradle%E5%88%9B%E5%BB%BAlibgdx%E9%A1%B9%E7%9 ...

  5. MySQL学习笔记_10_MySQL高级操作(下)

    MySQL高级操作(下) 五.MySQL预处理语句 1.设置预处理stmt,传递一个数据作为where的判断条件 prepare stmt from "select * from table ...

  6. Cocos2d中update与fixedUpdate的区别(五)

    在真实情况中update:和fixedUpdate方法如何去调用? 由上所述,所以update方法在每帧被调用1次,从而给你一个机会去更新你的游戏对象的状态在其绘制之前.而fixedUpdate:方法 ...

  7. Django应用部署 - 上线指南

    http://blog.csdn.net/pipisorry/article/details/46957613 python manage.py runserver已经很接近于服务器的形式,但是并不能 ...

  8. Android下NDK开发环境搭建

    Android下NDK开发环境搭建 1.     AndroidNDK安装与配置 1.1  NDK简介 Android NDK是一套允许开发人员使用本地代码(如C/C++)进行Android APP部 ...

  9. Linux 内核配置机制(make menuconfig、Kconfig、makefile)讲解

    前面我们介绍模块编程的时候介绍了驱动进入内核有两种方式:模块和直接编译进内核,并介绍了模块的一种编译方式--在一个独立的文件夹通过makefile配合内核源码路径完成 那么如何将驱动直接编译进内核呢? ...

  10. ExtJS:GridPanel之renderer:function()和itemdblclick : function()方法参数详解

    要使用GridPanel,首先要定义Store,而在创建Store的时候必须要有Model,因此我们首先来定义Model: Ext.define("Gpsdata", { exte ...