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异常。
Java集合框架(三)—— List、ArrayList、Vector、Stack的更多相关文章
- Java集合(3):Vector && Stack
一.Vector介绍 Vector可以实现可增长的动态对象数组.与数组一样,它包含可以使用整数索引进行访问的组件.不过,Vector的大小是可以增加或者减小的,以便适应创建Vector后进行添加或者删 ...
- java 集合框架(三)Collection
一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...
- Java集合框架Collection(1)ArrayList的三种遍历方法
ArrayList是java最重要的数据结构之一,日常工作中经常用到的就是ArrayList的遍历,经过总结,发现大致有三种,上代码: package com.company; import java ...
- Java容器解析系列(4) ArrayList Vector Stack 详解
ArrayList 这里关于ArrayList本来都读了一遍源码,并且写了一些了,突然在原来的笔记里面发现了收藏的有相关博客,大致看了一下,这些就是我要写的(╹▽╹),而且估计我还写不到博主的水平,这 ...
- Java集合框架(三)
Map Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性. Map |------HashTable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.J ...
- Java集合框架之一:ArrayList源码分析
版权声明:本文为博主原创文章,转载请注明出处,欢迎交流学习! ArrayList底层维护的是一个动态数组,每个ArrayList实例都有一个容量.该容量是指用来存储列表元素的数组的大小.它总是至少等于 ...
- java集合框架collection(2)ArrayList和LinkedList
ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...
- Java集合源代码剖析(一)【集合框架概述、ArrayList、LinkedList、Vector】
Java集合框架概述 Java集合工具包位于Java.util包下.包括了非常多经常使用的数据结构,如数组.链表.栈.队列.集合.哈希表等.学习Java集合框架下大致能够分为例如以下五个部分:List ...
- 【java集合框架源码剖析系列】java源码剖析之ArrayList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
随机推荐
- XML (一)
1 XML概述 XML是指可扩展的标记语言,很类似与HTML.它被设计的宗旨就是描述数据,而非显示数据. XML标签没有被预定义,需要用户自定定义标签. XML技术是W3C组织发布的.目前遵循的规范是 ...
- 常用API
1 System类 System类包含一些有用的类和字段.它不能被实例化. 属性和方法都是静态的. 1.1 常见方法 返回以毫秒为单位的当前时间 public static long currentT ...
- 【转】ArcGIS中File Geodatabase与Personal Geodatabase的区别
原文地址:ArcGIS中File Geodatabase与Personal Geodatabase的区别作者:最爱忆宝贝 一.平台支援: 1.Personal Geodatabase:仅可在Windo ...
- IDEA精髓快捷键
删除一行:Ctrl+X 快速查找:Ctrl+F 打开文件目录结构: Ctrl+F12 可以把代码包在一个块内:Ctrl+Alt+T 替换文本:Ctrl+R, Alt+Shift+Up/Down,上/下 ...
- excel中的数据导出为properties和map的方法
在做项目的过程中,经常需要处理excel数据,特别是和业务人员配合时,业务人员喜欢使用excel处理一些数据,然后交给我们技术人员进行程序处理.利用POI读取写入excel数据,是经常使用的一个情景. ...
- 使用hexo搭建个人博客
安装前提 node.js git 如果缺少以上条件,则前往相应的官网下载安装即可.. 安装hexo $ npm install hexo-cli -g 待安装完成后,执行相关命令查看hexo的信息. ...
- 解决mysql、vsftp远程连接速度慢的问题
以 centOS 6.3(其他操作系统类似,同样适用)说明: 当我们的服务都配置正常的情况下,有时会出现连接速度慢而导致连接失败的问题 问题分析:这些情况一般都是DNS解析惹的祸 mysql连接速度慢 ...
- spring jdbc踩坑日记,new JdbcTemplate 为null导致UserDao一直为null
private DataSource datasource; private JdbcTemplate jdbcTemplateObject; //设置注入 public void setdataso ...
- JMS基础篇(二)
简介 异构集成是消息发挥作用的一个领域,大型公司内部可能会遇到很多的平台,Java,.net或者公司自己的平台等. 传送消息还应该支持异步机制,以提高系统整体的性能.异步传输一条消息意味着,发送者不必 ...
- 济南清北学堂游记 Day 6.
还剩一天半我就该回去了. 说实话今天挺可惜的,有很多本来可以得到的分数评测时没有拿到.上午的第一题和第二题我都想出了正解,T3敲了一个暴力,虽然暴力写坏了.预计是可以拿210的但是实际上只有很少的分数 ...