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 ...
随机推荐
- 搞个小项目吧,做一个ppt播放器
先来两个参考链接,接下来再进行实战 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1137 http://www.geek ...
- Go_认识golang
官方地址:https://golang.org/ 什么是Go? 支持并发.垃圾回收的编译型 系统编程语言 Go语言有哪些特点? 1. 类型安全 和 内存安全 2. 以非常直观和极低代价的方案实现高并发 ...
- js_1_变量类型
js中有哪些变量类型? 数字(包括int和float),字符串,数组(字典,js没有字典类型,把字典看成一个对象) 如何把字符转成数字呢? obj.parseInt() // 转化成 ...
- form表单action=""的作用
看项目时发现action="",可仍旧提交到后台相关页面了.查了一下,action=""相当于当前页面刷新,不过页面按照form表单提交参数到后台@参考文章
- Servlet--HttpServletRequest一些不常用的方法
我们在使用Servlet和表单进行交互的时候,不管是传参和接参经常要写一些路径.关于具体的Servlet的传参和接参我后面会有详细的整理,这里先整理一下不怎么常用的到一些HttpServletRequ ...
- struts2 type="redirectAction"重定向 与动态调用方法
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE struts PUBLIC "-/ ...
- 仿百度糯米TP5项目笔记
需求分析 系统三大模块 商家平台.主平台.前台模块 Thinkphp5.0实战 仿百度糯米开发多商家电商平台网盘下载 (2017-04-24 01:46:23) 转载▼ 第1章 课程简介 本章 ...
- RChain总体架构图
RChain是我研究区块链依赖发现的和我最契合的(主要是用scala写的),在架构上吞吐率和扩展性也是最好,未来是真正有可能实现在它官网上宣称的能够承载facebook一样的规模,具有和visa一样的 ...
- openvpn的搭建
openvpn搭建 原创不易,转载请注明 openvpn简介 1.1 openvpn原理 OpenVpn的技术核心是虚拟网卡,其次是SSL协议实现 虚拟网卡是使用网络底层编程技术实现的一个驱动软件,安 ...
- awk说明书(转)
ref:http://blog.chinaunix.net/uid-429659-id-122573.html awk使用手册 作者:awk使用手册什么是awk? 你可能对UNIX比较熟悉,但你可能对 ...