java集合类(三)About Iterator & Vector(Stack)
- Talk about “Iterator”:
任何容器类,在插入元素后,还需要取回元素,因为这是容器的最基本工作。对于一般的容器,插入有add()相关方法(List,Set),put()相关方法(Map),取出元素也都有get()相关方法,但这有个缺点,就是使用容器必须对容器的确切类型编程,这导致代码重用性差,因为我们在获取元素时并不关心容器的类型,因此,为解决这个情况,迭代器应运而生。
所谓迭代器,也是一个对象,它的作用是遍历并选择序列中的对象,而程序员不需要知道该序列的底层结构。迭代器统一了容器的访问方式,并且被称为“轻量级对象”,因为创建它的代价很小。 下面举例说明:
public void iteratordemo(){
ArrayList<String> a = new ArrayList<String>(Arrays.asList("dog","cat","pig","fish"));
Iterator<String> i = a.iterator();
while(i.hasNext()){
System.out.print(i.next()+" ");
}
System.out.println("");
//foreach
for(String s:a){
System.out.print(s+" ");
}
}
ArrayList<String> a = new ArrayList<String>(Arrays.asList("a","b","c"));
LinkedList<Integer> l = new LinkedList<Integer>(Arrays.asList(1,2,3));
HashSet<Double> s = new HashSet<Double>();
public void iteratordisplay(Iterator<String> s){
while(s.hasNext()){
System.out.print(s.next()+" ");
}
System.out.println();
}
iteratordisplay(a.iterator());
iteratordisplay(l.iterator());
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
//Constructor methods
Vector<String> v = new Vector<String>();
Vector<String> v1 = new Vector<String>(Arrays.asList("q","w"));
Vector<Integer> v2 = new Vector<Integer>(9);
//Vector(initialcapacity,capacityincrement)
Vector<Double> v3 = new Vector<Double>(5,5); //new methods
v.addElement("a");
int i = v.capacity(); Object[] s = new String[100];
v.copyInto(s);
v.elementAt(1);
v.insertElementAt("b",2);
v.removeElement("a");
v.removeElementAt(2);
v.removeRange(2,4);
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》中的代码如下:
package net.mindview.util;
import java.util.LinkedList;
public class Stack<T>{
private LinkedList<T> storage = new LinkedList<T>();
public void push(T v){
storage.addFirst(v);
}
public T peek(){
return storage.getFirst();
}
public T pop(){
return storage.removeFirst();
}
public boolean empty(){
return storage.isEmpty();
}
public String toString(){
return storage.toString();
}
}
方法说明:push()进行元素入栈,peek()元素出栈,但不移除,pop()元素出栈,移除。使用上面自己实现的栈:
//import package mentioned above
import net.mindview.util.Stack;
public class Stacktest{
public static void main(String[] args){
Stack<String> stack = new Stack<String>();
for(String s: "I love you".split(" "))
stack.push(s);
while(!stack.empty())
System.out.println(stack.pop() + " ");
}
//output: you love I
}
至于在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)的更多相关文章
- JAVA提高十八:Vector&Stack深入分析
前面我们已经接触过几种数据结构了,有数组.链表.Hash表.红黑树(二叉查询树),今天再来看另外一种数据结构:栈. 什么是栈呢,我们先看一个例子:栈就相当于一个很窄的木桶,我们往木桶里放东西,往外拿东 ...
- Java集合类中的Iterator和ListIterator的区别
注意:内容来自网络他人文章! 最近看到集合类,知道凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合:(Iterato ...
- Java进阶(三十九)Java集合类的排序,查找,替换操作
Java进阶(三十九)Java集合类的排序,查找,替换操作 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对 ...
- [Java]ArrayList、LinkedList、Vector、Stack的比较
一.介绍 先回顾一下List的框架图 由图中的继承关系,可以知道,ArrayList.LinkedList.Vector.Stack都是List的四个实现类. AbstractList是一个抽象类,它 ...
- java集合类源码学习三——ArrayList
ArrayList无疑是java集合类中的一个巨头,而且或许是使用最多的集合类.ArrayList继承自AbstractList抽象类,实现了List<E>, RandomAccess, ...
- java集合类——Stack类
查看java的API文档,Stack继承Vector类. 栈的特点是后进先出. API中Stack自身的方法不多,基本跟栈的特点有关. import java.util.Stack; public c ...
- Java集合类源码解析:Vector
[学习笔记]转载 Java集合类源码解析:Vector 引言 之前的文章我们学习了一个集合类 ArrayList,今天讲它的一个兄弟 Vector.为什么说是它兄弟呢?因为从容器的构造来说,Vec ...
- java基础(三) 加强型for循环与Iterator
引言 从JDK1.5起,增加了加强型的for循环语法,也被称为 "for-Each 循环".加强型循环在操作数组与集合方面增加了很大的方便性.那么,加强型for循环是怎么解析的 ...
- 【转载】Java集合类Array、List、Map区别和联系
Java集合类主要分为以下三类: 第一类:Array.Arrays第二类:Collection :List.Set第三类:Map :HashMap.HashTable 一.Array , Arrays ...
随机推荐
- Redis中hash表中的field的value自增可以用hincrby
Redis HINCRBY命令用于增加存储在字段中存储由增量键哈希的数量.如果键不存在,新的key被哈希创建.如果字段不存在,值被设置为0之前进行操作. 回复整数,字段的增值操作后的值. redis ...
- Houdini FX 14 重磅推出!(附下载方式)
把之前发布在新浪的博客搬过来了,新浪广告太多,影响阅读和观感,博客园很清净~ SideFX于2015年1月在官网发布Houdini FX 14,喜爱尝鲜.充满好奇心的我迫不及待的装上Apprentic ...
- 物联网 WIFI 一键配置原理(smartconfig) ESP8266/QCA4004
自从物联网 问世以来,如何使得物 能够联网 有了很多的方式,目前运用非常广的WIFI,今天就总结下自这个方面,也对于有需要的盆友 也希望有抛砖引玉之效果. 物联网: 智能硬件+APP+云 APP ...
- hdu 1222 Wolf and Rabbit
Problem Description There is a hill with n holes around. The holes are signed from 0 to n-1. A rabbi ...
- JavaScript之简易计算器
<head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8&quo ...
- About Restful Web Api Something.
这种轻量级的服务架构目前来说还是比较流行的,比如微信的公众平台的接口开发就是一个很好的案例,提到restful那么他到底是一个什么样的东西? REST(Representational State T ...
- Android平台下OpenGL初步
Android OpenGL ES 开发教程 从入门到精通 http://blog.csdn.net/zhoudailiang/article/details/50176143 http://blog ...
- iOS使用keychain存储密码
iOS设备中的Keychain是一个安全的存储容器.通常情况下,可以用NSUserDefaults存储数据信息,但是对于一些私密信息,比如账号.密码等等,就需要使用更为安全的keychain了.苹果自 ...
- (转)RabbitMQ消息队列(五):Routing 消息路由
上篇文章中,我们构建了一个简单的日志系统.接下来,我们将丰富它:能够使用不同的severity来监听不同等级的log.比如我们希望只有error的log才保存到磁盘上. 1. Bindings绑定 上 ...
- Spring AOP整理
示例展示 AOP(Aspect Oriented Programming),是面向切面编程的技术.AOP基于IoC基础,是对OOP的有益补充.AOP之所以能得到广泛认可,主要是因为它将应用系统拆分分了 ...