• 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异常。

Java集合框架(三)—— List、ArrayList、Vector、Stack的更多相关文章

  1. Java集合(3):Vector && Stack

    一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...

  2. java 集合框架(三)Collection

    一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...

  3. Java集合框架Collection(1)ArrayList的三种遍历方法

    ArrayList是java最重要的数据结构之一,日常工作中经常用到的就是ArrayList的遍历,经过总结,发现大致有三种,上代码: package com.company; import java ...

  4. Java容器解析系列(4) ArrayList Vector Stack 详解

    ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...

  5. Java集合框架(三)

     Map Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性. Map |------HashTable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.J ...

  6. Java集合框架之一:ArrayList源码分析

    版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于 ...

  7. java集合框架collection(2)ArrayList和LinkedList

    ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...

  8. Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】

    Java集合框架概述 Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List ...

  9. 【java集合框架源码剖析系列】java源码剖析之ArrayList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...

随机推荐

  1. python3 第十章 - 如何进行进制转化

    在计算机的世界里,2进制是主流,而在人类的自然世界中,10进制是主流,那么在这之间必然就会存在进制转化的问题.本章我们就来谈谈进制转化,也希望通过本章加深您对前些章所学知识的理解. 原理:先说说关于位 ...

  2. scrapy_cookie禁用_延迟下载_自定义爬虫setting

    如何设置禁止cookie? 在setting中 添加字段: COOKIE_ENABLED = False                            # False关闭cookie,True ...

  3. 浏览器http的缓存机制

    原文出处-----分享从伯乐在线看到的一篇好文章  http://web.jobbole.com/85509/ 针对浏览器的http缓存的分析也算是老生常谈了,每隔一段时间就会冒出一篇不错的文章,其原 ...

  4. 绕过js验证

    我在火狐和谷歌下想删除对应js,由于是外部js引入的,没删掉.只好借用了工具. 这个工具也并不是多么的高大上,也许大家都用过,httprequester 步骤:打开火狐附加组件管理器——扩展——输入h ...

  5. junit4X系列--Assert与Hamcrest

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/12/377960.html.感谢作者无私分享 到目前,JUnit4所有的核心源码都已经讲解过了 ...

  6. 安装node.js和npm

    转载自https://www.liaoxuefeng.com/wiki/001434446689867b27157e896e74d51a89c25cc8b43bdb3000/0014345014184 ...

  7. SEO—Meta标签优化

    Meta标签之一"标题": 标题是网站中很重要的一个标签,他在搜索引擎中是直接显示出来的,一般情况下要网站的核心关键词和网站名称都写进去,这样更有利于网站的排名.但是要注意标题的长 ...

  8. Linux下查找大文件以及目录

    转自:http://www.cnblogs.com/kerrycode/p/4391859.html 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在 ...

  9. JAVA关键字Volatile的特性

    一.简述: 关键字Volatile是JAVA虚拟机提供的最轻量级的同步机制,但是它并不容易完全被正确.完整的理解,以致于许多程序员在遇到需要处理多线程数据竞争的时候一律使用synchronized来进 ...

  10. 使用guava变形数据结构

    在java日常开发中,经常需要使用各种数据结构,在涉及到数据结构之间如何优雅的转换时,我们可以借助google的guava提供的相关功能来优雅的实现.以下记录一些开发中经常需要使用数据结构的变形,以便 ...