Java中 ArrayList、Vector和LinkedList 的使用和详解!

转自:【http://blog.csdn.net/kevon_sun/article/details/7936329】



  1 import java.util.*;
  2
  3 /**
  4  * (1)ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能含有“空隙”。
  5  * 当数组大小不满足时会增加存储能力,将已有数组数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行拷贝,移动,代价比较高。因此,它适合随即查找和遍历,不适合插入合删除。
  6  * (2)Vector与ArrayList一样,也是通过数组实现的。不同的是它支持线程的同步,
  7  * 即一时刻只有一个线程能够写Vector,避免多线程同时写引起的不一致性。但实现同步需要很高的花费, 因此,访问它比访问ArrayList慢。
  8  * (3)LinkedList是用链表结构存储数据的,很适合数据的动态插入和删除,随即访问和遍历速度比较慢。另外,它还提供了List没有定义的方法,专门用于操作表头和表尾元素,可以当作堆栈、队列和双向队列使用。
  9  * (4)因为ArrayList和Vector都是用数组实现的,所以,在添加和插入时,最好从表尾操作,而不要从中间或者表头开始,以避免数组移动引起的开销!
 10  * (5)可以为每个List生成ListIterator,支持双向遍历List,而且能够在ListIterator位置插入和删除元素。
 11  * (6)堆栈类继承Vector,它总是对列表的尾部数据进行操作,采用了先进后出的策略,自定义了插入、查看和弹出元素三个方法。 ArrayList 性能测试。
 12  *
 13  * @author sun
 14  */
 15 public class TestList {
 16
 17     /**
 18      * 初始化一个List
 19      *
 20      * @param list
 21      */
 22     public static void init(List list) {
 23         if (list != null) {
 24             list.add("aaa");
 25             list.add("ccc");
 26             list.add("bbb");
 27             list.add("eee");
 28             list.add("ddd");
 29         }
 30     }
 31
 32     /**
 33      * 输出List的内容
 34      *
 35      * @param list
 36      */
 37     public static void output(List list) {
 38         if (list != null) {
 39             // 根据列表下标遍历,使用list.size()获取列表中元素的个数
 40             for (int i = 0; i < list.size(); i++) {
 41                 System.out.print(list.get(i) + "  ");
 42             }
 43             System.out.println();
 44             // 或者用迭代器遍历
 45             Iterator it = list.iterator();
 46             Object value = null;
 47             while (it.hasNext()) {
 48                 value = it.next();
 49                 System.out.print(value + "  ");
 50             }
 51         }
 52         System.out.println();
 53     }
 54
 55     /**
 56      * 使用ArrayList
 57      */
 58     public static void testArrayList() {
 59         List list = new ArrayList();
 60         init(list);
 61         System.out.println("使用ArrayList: ");
 62         output(list);
 63     }
 64
 65     /**
 66      * 使用Vector
 67      */
 68     public static void testVector() {
 69         List list = new Vector();
 70         init(list);
 71         System.out.println("使用Vector: ");
 72         output(list);
 73     }
 74
 75     /**
 76      * 使用LinkedList
 77      */
 78     public static void testLinkedList() {
 79         List list = new LinkedList();
 80         init(list);
 81         System.out.println("使用LinkedList: ");
 82         output(list);
 83     }
 84
 85     public static void main(String[] args) {
 86         TestList.testArrayList();
 87         // TestList.testVector();
 88         // TestList.testLinkedList();
 89
 90         List list = new ArrayList();
 91         init(list);
 92         // 1:List支持元素重复
 93         list.add("aaa");
 94         list.add("bbb");
 95         System.out.println("插入元素aaa, bbb后:");
 96         output(list);
 97         // 2:指定元素插入的位置
 98         list.add(1, "fff");
 99         System.out.println("在下标为1处插入fff后:");
100         output(list);
101         List list2 = new ArrayList();
102         list2.add("ggg");
103         list2.add("hhh");
104         // 将另一列表中的元素插入到列表中
105         list.addAll(list2);
106         System.out.println("添加list2的元素后:");
107         output(list);
108
109         // 判断列表是否包含某一元素
110         // 通过元素的equals方法,判断元素是否相等
111         System.out.println("list包含aaa? " + list.contains("aaa"));
112         // 判断列表中是否包含了另外一个列表中的所有元素。
113         System.out.println("list包含list2中的所有元素? " + list.containsAll(list2));
114         // 定位一个元素在列表中最先出现的位置
115         System.out.println("aaa在list中第一次出现的位置: " + list.indexOf("aaa"));
116         // 定位一个元素在列表中最后出现的位置
117         System.out.println("aaa在list中最后一次出现的位置: " + list.lastIndexOf("aaa"));
118
119         // 更新列表中某个位置的元素值
120         list.set(2, "xxx");
121         System.out.println("更新位置为2的元素为xxx后:");
122         output(list);
123         // 删除列表中的某个元素,只删除第一次出现的那个
124         list.remove("aaa");
125         System.out.println("删除元素aaa后:");
126         output(list);
127         // 删除列表中指定位置的元素
128         list.remove(1);
129         System.out.println("删除下标为1的元素后:");
130         output(list);
131         // 删除列表中的其他元素,只保留另一个列表中包含的元素
132         list.retainAll(list2);
133         System.out.println("删除除list2包含的以外的元素后:");
134         output(list);
135         // 删除列表中在另一列表中也包含了的元素
136         list.removeAll(list2);
137         System.out.println("删除list2包含的元素后:");
138         output(list);
139         // 清空列表
140         list.clear();
141         // 判断列表中是否有数据
142         System.out.println("清空List后,list为空么?  " + list.isEmpty());
143         /*
144          * ---------------------
145          */
146         init(list);
147         // 用列表中的某些元素构造一个新的列表
148         list2 = list.subList(1, 3);
149         System.out.println("用list的第1个到第3个元素构造一个新的List:");
150         output(list2);
151
152         // 用List特有的遍历器ListIterator遍历列表
153         // 与普通的Iterator不用,它允许两个方向遍历列表
154         ListIterator listIt = list.listIterator();
155         System.out.println("正向遍历列表");
156         while (listIt.hasNext()) {
157             System.out.print(listIt.next() + "  ");
158         }
159         System.out.println();
160         System.out.println("反向遍历列表");
161         while (listIt.hasPrevious()) {
162             System.out.print(listIt.previous() + "  ");
163         }
164         System.out.println();
165         // 也可以使用ListIterator从List中间插入和删除元素,
166         // 只能在遍历器当前位置添加和删除。
167         listIt.add("newadd");
168         System.out.println("用ListIterator往列表中添加元素newadd后: ");
169         output(list);
170         listIt.next();
171         listIt.remove();
172         System.out.println("用ListIterator删除列表中元素后: ");
173         output(list);
174
175         // LinkedList自定义的方法
176         LinkedList linklist = new LinkedList();
177         init(linklist);
178         // 添加元素到列表头
179         linklist.addFirst("fff");
180         System.out.println("把fff放到列表头:");
181         output(linklist);
182         // 添加元素到列表尾
183         linklist.addLast("eee");
184         System.out.println("把eee放到列表尾:");
185         output(linklist);
186         // 获取表头元素
187         System.out.println("列表头元素:" + linklist.getFirst());
188         // 获取表尾元素
189         System.out.println("列表尾元素:" + linklist.getLast());
190         // 删除列表头的元素
191         linklist.removeFirst();
192         System.out.println("删除列表头元素:");
193         output(linklist);
194         // 删除列表尾的元素
195         linklist.removeLast();
196         System.out.println("删除列表尾元素:");
197         output(linklist);
198
199         // 堆栈Stack类,它继承自Stack类
200         Stack myStack = new Stack();
201         // 插入元素,是插入到尾部
202         myStack.push("aaa");
203         myStack.push("bbb");
204         myStack.push("ccc");
205         myStack.push("ddd");
206         myStack.push("eee");
207         myStack.push("fff");
208         myStack.push("ggg");
209         System.out.println("堆栈中的元素是: ");
210         output(myStack);
211         /* 查看堆栈顶部的对象,但不从堆栈中移除它。 */
212         System.out.println("堆栈尾部元素: " + myStack.peek());
213         /* 移除堆栈顶部的对象,并返回该对象作为此函数的值。 */
214         System.out.println("弹出堆栈尾部元素: " + myStack.pop());
215         System.out.println("再次弹出堆栈尾部元素: " + myStack.peek());
216         /* 把项压入堆栈顶部。 */
217         myStack.push("sun");
218         System.out.println("再一次弹出堆栈尾部元素: " + myStack.peek());
219         if (myStack.empty()) {
220             System.out.println("myStack为空!");
221         } else {
222             System.out.println("myStack不为空!");
223         }
224         /* 对象到堆栈顶部的位置,以 1 为基数;返回值 -1 表示此对象不在堆栈中。 */
225         System.out.println("返回对象在堆栈中的位置: " + myStack.search("fff"));
226
227     }
228 }
时间: 2024-10-12 20:26:29

Java中 ArrayList、Vector和LinkedList 的使用和详解!的相关文章

java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的.静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

【转】Java中print、printf、println的区别详解

Java中print.printf.println的区别详解 printf主要是继承了C语言的printf的一些特性,可以进行格式化输出 print就是一般的标准输出,但是不换行 println和print基本没什么差别,就是最后会换行 System.out.printf("the number is: d",t);参照JAVA API的定义如下:'d' 整数 结果被格式化为十进制整数'o' 整数 结果被格式化为八进制整数'x', 'X' 整数 结果被格式化为十六进制整数'e', 'E

java中静态代码块的用法—— static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就

[转载] java中静态代码块的用法 static用法详解

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就

java中四种访问修饰符区别及详解全过程

客户端程序员:即在其应用中使用数据类型的类消费者,他的目标是收集各种用来实现快速应用开发的类. 类创建者:即创建新数据类型的程序员,目标是构建类. 访问控制存在的原因:a.让客户端程序员无法触及他们不应该触及的部分  : b.允许库设计者可以改变类内部的工作方式而不用担心会影响到客户端程序员  java的四个关键字:public.protected.default.private(他们决定了紧跟其后被定义的东西可以被谁使用) 适用范围<访问权限范围越小,安全性越高>   访问权限   类  

java中静态代码块的用法 static用法详解和static静态导入

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就

(转)java中静态代码块的用法 static用法详解

一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就是

java中静态代码块的用法 static用法详解(转)

(一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口两者的区别就是:静态代码块是自动执行的;静态方法是被调用的时候才执行的. 静态方法(1)在Java里,可以定义一个不需要创建对象的方法,这种方法就

关于Java中的程序,进程和线程的详解...

程序:一段静态的代码,一组指令的有序集合,它本身没有任何运行的含义,它只是一个静态的实体,是应用软件执行的蓝本. 进程:是程序的一次动态执行,它对应着从代码加载,执行至执行完毕的一个完整的过程,是一个动态的实体,它有自己的生命 周期.它因创建而产生,因调度而运行,因等待资源或事件而被处于等待状态,因完成任务而被撤消.反映了一个程序在 一定的数据 集上运行的全部动态过程.通过进程控制块(PCB)唯一的标识某个进程.同时进程占据着相应的资源(例如包 括cpu的使用 ,轮转时间以及一些其它设备的权限)

【转】java中静态代码块的用法 static用法详解

原文网址:http://www.cnblogs.com/panjun-Donet/archive/2010/08/10/1796209.html (一)java 静态代码块 静态方法区别一般情况下,如果有些代码必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,这种代码是被动执行的. 静态方法在类加载的时候 就已经加载 可以用类名直接调用比如main方法就必须是静态的 这是程序入口