接上篇:java集合类学习(二)

  1. Talk about “Iterator”:

任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作。对于一般的容器,插入有add()相关方法(List,Set),put()相关方法(Map),取出元素也都有get()相关方法,但这有个缺点,就是使用容器必须对容器的确切类型编程,这导致代码重用性差,因为我们在获取元素时并不关心容器的类型,因此,为解决这个情况,迭代器应运而生。

所谓迭代器,也是一个对象,它的作用是遍历并选择序列中的对象,而程序员不需要知道该序列的底层结构。迭代器统一了容器的访问方式,并且被称为“轻量级对象”,因为创建它的代价很小。 下面举例说明:

  1. public void iteratordemo(){
  2. ArrayList<String> a = new ArrayList<String>(Arrays.asList("dog","cat","pig","fish"));
  3. Iterator<String> i = a.iterator();
  4. while(i.hasNext()){
  5. System.out.print(i.next()+" ");
  6. }
  7. System.out.println("");
  8.  
  9. //foreach
  10. for(String s:a){
  11. System.out.print(s+" ");
  12. }
  13. }
  1. ArrayList<String> a = new ArrayList<String>(Arrays.asList("a","b","c"));
  2. LinkedList<Integer> l = new LinkedList<Integer>(Arrays.asList(1,2,3));
  3. HashSet<Double> s = new HashSet<Double>();
  4. public void iteratordisplay(Iterator<String> s){
  5. while(s.hasNext()){
  6. System.out.print(s.next()+" ");
  7. }
  8. System.out.println();
  9. }
  10. iteratordisplay(a.iterator());
  11. iteratordisplay(l.iterator());
  12. iteratordisplay(s.iterator());

  另外,Iterator有个比它强大的子类型ListIterator,但ListIterator只能用于各List类的访问,而且Iterator只能通过hasNext()向前移动,ListIterator还能通过HasPrevious()向后移动,并且可以用set()替换元素,还可通过ListIterator(n)创建一个一开始就指向列表索引为n的元素的ListIterator,具体操作与Iterator类似

2.  About   Vector: ( 拿较常用的Stack做详细说明)

All Implemented Interfaces:Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess    extends  AbstractList<E>

Direct Known Subclasses: Stack
  1. //Constructor methods
  2. Vector<String> v = new Vector<String>();
  3. Vector<String> v1 = new Vector<String>(Arrays.asList("q","w"));
  4. Vector<Integer> v2 = new Vector<Integer>(9);
  5. //Vector(initialcapacity,capacityincrement)
  6. Vector<Double> v3 = new Vector<Double>(5,5);
  7.  
  8. //new methods
  9. v.addElement("a");
  10. int i = v.capacity();
  11.  
  12. Object[] s = new String[100];
  13. v.copyInto(s);
  14. v.elementAt(1);
  15. v.insertElementAt("b",2);
  16. v.removeElement("a");
  17. v.removeElementAt(2);
  18. v.removeRange(2,4);
  19. v.setElementAt("c",3);

  3.About  Stack:

  • 论java中,堆与栈的区别:

1)生长方向不同:堆从低地址到高地址存储,而栈则相反

2)作用不同:

a.堆主要用来存new创建的对象和数组,还有static变量,空间由JVM的GC自动回收

b.栈主要用来存方法中局部变量以及对象或数组的引用(提高访问速率)

  • Stack的实现:

java集合类(二)中介绍LinkedList是提到它有pop(),push(),peek()等方法,这些方法已足够实现一个Stack的基本功能,《Thinking in Java》中的代码如下:

  1. package net.mindview.util;
  2.  
  3. import java.util.LinkedList;
  4.  
  5. public class Stack<T>{
  6. private LinkedList<T> storage = new LinkedList<T>();
  7. public void push(T v){
  8. storage.addFirst(v);
  9. }
  10. public T peek(){
  11. return storage.getFirst();
  12. }
  13. public T pop(){
  14. return storage.removeFirst();
  15. }
  16. public boolean empty(){
  17. return storage.isEmpty();
  18. }
  19. public String toString(){
  20. return storage.toString();
  21. }
  22. }

  方法说明:push()进行元素入栈,peek()元素出栈,但不移除,pop()元素出栈,移除。使用上面自己实现的栈:

  1. //import package mentioned above
  2.  
  3. import net.mindview.util.Stack;
  4.  
  5. public class Stacktest{
  6. public static void main(String[] args){
  7. Stack<String> stack = new Stack<String>();
  8. for(String s: "I love you".split(" "))
  9. stack.push(s);
  10. while(!stack.empty())
  11. System.out.println(stack.pop() + " ");
  12. }
  13. //output: you love I
  14. }

 至于在java.util.*中的Stack,可能由于起初在java1.0时创建的没考虑全面,虽然也可以实现Stack的功能,但上面用LinkedList实现的Stack相对更好。另外,为防止与java.util.*中的Stack发生命名冲突,通常在导入java.util.*时,类名不能为Stack。最后,当想要同时使用这两种Stack时,我们可以通过全限定名称解决冲突,如定义java.util包中的Stack时,可以“java.util.Stack<String> s = new java.util.Stack<String>();”,其他同理。

PS:现在一般选用LinkedList实现的Stack!

  下一节学习“java集合类(四)About Set

###    学习从来都是一个过程,对对错错对对...若文中有错误,还望读者批评指出      ###

java集合类(三)About Iterator & Vector(Stack)的更多相关文章

  1. JAVA提高十八:Vector&Stack深入分析

    前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我们先看一个例子:栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东 ...

  2. Java集合类中的Iterator和ListIterator的区别

    注意:内容来自网络他人文章! 最近看到集合类,知道凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合:(Iterato ...

  3. Java进阶(三十九)Java集合类的排序,查找,替换操作

    Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...

  4. [Java]ArrayList、LinkedList、Vector、Stack的比较

    一.介绍 先回顾一下List的框架图 由图中的继承关系,可以知道,ArrayList.LinkedList.Vector.Stack都是List的四个实现类. AbstractList是一个抽象类,它 ...

  5. java集合类源码学习三——ArrayList

    ArrayList无疑是java集合类中的一个巨头,而且或许是使用最多的集合类.ArrayList继承自AbstractList抽象类,实现了List<E>, RandomAccess, ...

  6. java集合类——Stack类

    查看java的API文档,Stack继承Vector类. 栈的特点是后进先出. API中Stack自身的方法不多,基本跟栈的特点有关. import java.util.Stack; public c ...

  7. Java集合类源码解析:Vector

    [学习笔记]转载 Java集合类源码解析:Vector   引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...

  8. java基础(三) 加强型for循环与Iterator

    引言   从JDK1.5起,增加了加强型的for循环语法,也被称为 "for-Each 循环".加强型循环在操作数组与集合方面增加了很大的方便性.那么,加强型for循环是怎么解析的 ...

  9. 【转载】Java集合类Array、List、Map区别和联系

    Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...

随机推荐

  1. Java开发从零开始填坑

    开始学习Java,感觉较.NET知识更零碎一些,所以开个帖子把自己踩过的坑记录下来,都是边边角角网上不容易找到的东西. 1.java命令格式:>cd %parent-of-pakadgePath ...

  2. Memcached 使用

    using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI ...

  3. Objective-C 【@property 的参数问题】

    ------------------------------------------- @property参数 总的来说,这是一种编译器的特性(在生成@property的时候为@property添加相 ...

  4. IE6和IE8细节问题

    1.对于使用jQuery的ajax.IE6要求使用带有全部的属性:例如IE对下面代码中type:"POST",有严格的要求,如果没有该属性,则无法向后他发送请求 $.ajax({ ...

  5. codevs 3186 队列练习2

    3186 队列练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description (此题与队列练习1相比改了2处:1加 ...

  6. 内核 current宏解析

    Technorati 标签: current thread_info      在内核中,可以通过current宏来获得当前执行进程的task_struct指针.现在来简要分析以下:      最原始 ...

  7. 基础学习总结(五)---baseAdapter、ContentProvider

    小写转大写 : ctrl+shift+F <ScrollView></ScrollView>滚动条显示视图 ListView与BaseAdapter: public class ...

  8. Git客户端TortoiseGit(Windows系统)的使用方法

    本文环境: 操作系统:Windows XP SP3 Git客户端:TortoiseGit-1.8.8.0-32bit 一.安装Git客户端 全部安装均采用默认! 1. 安装支撑软件 msysgit: ...

  9. sql拆分查询

    有这样一个需求: 临时表sql: create table #AA ( ID int, Name nvarchar(20) ) insert #AA select 1,'苏州/上海/温州' union ...

  10. openerp模块收藏 auto_setup 自动帮你完成建新库时必做几个操作(转载)

    auto_setup 自动帮你完成建新库时必做几个操作 原文:http://shine-it.net/index.php/topic,6777.0.html 模块地址: https://github. ...