iterator

Java连载91-Map常用方法、Hashtable、SortedMap

你。 提交于 2020-03-02 02:06:07
一、Map常用方法简介 package com.bjpowernode.java_learning; ​ import java.util.HashMap; import java.util.*; ​ public class D91_1_MapCommonMethod { public static void main(String[] args) { Map persons = new HashMap();//HashMap的默认初始化容量为16,默认加载因子时0.75 persons.put("10000","JACK"); persons.put("10001","ZHANGXINLEI"); persons.put("10002","YAOKUN"); persons.put("10003","ZHAOZEKUN"); persons.put("10004","LIDUO"); persons.put("10005","DIAOBI"); //1.判断集合中是否包含这样的value //注意:如果Map中的key重复了,value采用的是“覆盖” System.out.println(persons.containsValue("LUCK")); //2.通过key来获取value String k = "10001"; Object v = persons.get(k)

Reactor模型的Java NIO实现

一曲冷凌霜 提交于 2020-03-01 12:02:24
实现Reactor模型可分为以下三种: 单线程模型 单Reactor多线程模型 主从Reactor多线程模型。 单线程模型 Reactor单线程模型,指的是所有的IO操作都在同一个线程上面完成,线程的职责如下: 作为NIO服务端,接收客户端的TCP连接; 作为NIO客户端,向服务端发起TCP连接; 读取通信对端的请求或者应答消息; 向通信对端发送消息请求或者应答消息。 由于Reactor模式使用的是异步非阻塞IO,所有的IO操作都不会导致阻塞,理论上一个线程可以独立处理所有IO相关的操作。从架构层面看,一个NIO线程确实可以完成其承担的职责。例如,通过Acceptor接收客户端的TCP连接请求消息,链路建立成功之后,通过Dispatch将对应的ByteBuffer派发到指定的Handler上进行消息解码。用户线程可以通过消息编码通过NIO线程将消息发送给客户端。 Server端 public class Reactor1 { public static void main(String[] args) throws IOException { Selector selector = Selector.open(); ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

Java 集合系列16之 HashSet详细介绍(源码解析)和使用示例

巧了我就是萌 提交于 2020-03-01 09:52:21
概要 这一章,我们对HashSet进行学习。 我们先对HashSet有个整体认识,然后再学习它的源码,最后再通过实例来学会使用HashSet。内容包括: 第1部分 HashSet介绍 第2部分 HashSet数据结构 第3部分 HashSet源码解析(基于JDK1.6.0_45) 第4部分 HashSet遍历方式 第5部分 HashSet示例 转载请注明出处: http://www.cnblogs.com/skywang12345/p/3311252.html 第1部分 HashSet介绍 HashSet 简介 HashSet 是一个 没有重复元素的集合 。 它是由HashMap实现的, 不保证元素的顺序 ,而且 HashSet允许使用 null 元素 。 HashSet是 非同步的 。如果多个线程同时访问一个哈希 set,而其中至少一个线程修改了该 set,那么它必须 保持外部同步。这通常是通过对自然封装该 set 的对象执行同步操作来完成的。如果不存在这样的对象,则应该使用 Collections.synchronizedSet 方法来“包装” set。最好在创建时完成这一操作,以防止对该 set 进行意外的不同步访问: Set s = Collections.synchronizedSet(new HashSet(...)); HashSet通过iterator()返回的

php的迭代器

笑着哭i 提交于 2020-03-01 03:26:50
PHP5开始支持了接口, 并且内置了Iterator接口, 所以如果你定义了一个类,并实现了Iterator接口,那么你的这个类对象就是ZEND_ITER_OBJECT ,否则就是ZEND_ITER_PLAIN_OBJECT. 对于ZEND_ITER_PLAIN_OBJECT的类,foreach会通过HASH_OF获取该对象的默认属性数组,然后对该数组进行foreach. 而对于ZEND_ITER_OBJECT的类对象, 则会通过调用对象实现的Iterator接口相关函数来进行foreach。 /** * @author 简明现代魔法 http://www.nowamagic.net */ class MyIterator implements Iterator { private $var = array(); public function __construct($array) { if (is_array($array)) { $this->var = $array; } } public function rewind() { echo "倒回第一个元素\n"; reset($this->var); } public function current() { $var = current($this->var); echo "当前元素: $var\n"; return

Java集合框架之Iterator和ListIterator

Deadly 提交于 2020-03-01 02:48:00
一、 前言 迭代器是一个对象,它可以让你遍历一个容器并且有选择性的删除 容器 中的元素,而我们不需要知道 容器 的内部结构.Java有两种原生的迭代器:Iterator和ListIterator, 其中 ListIterator继承自 Iterator. 二、 Iterator接口 Iterator 通常被称为轻量级对象,因为创建它的开销比较小.可以通过调用 容器 的 iterator ()方法来获取它的Iterator. 下面是 Iterator 接口定义: 代码清单-1 public interface Iterator<E> { boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer<? super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } } Java的 Iterator只能单向移动,它只能用来: (1)使用容器的 iterator ()方法返回它的Iterator.Iterator将返回容器的第一个元素. (2

正确使用stl map的erase方法

自古美人都是妖i 提交于 2020-02-29 13:22:26
先声明:下面的文章是针对windows的用法,因为std::map的erase函数的windows的实现版本是返回一个std::map的迭代器,但是STL标准里面的该函数的返回值确是: map.erase有3个重载: void erase ( iterator position ); size_type erase ( const key_type& x ); void erase ( iterator first, iterator last ); 所以下面的代码中的最后一个例子仅仅可以在windows下的map下运行。 STL的map表里有一个erase方法用来从一个map中删除掉指令的节点 eg1: map<string,string> mapTest; typedef map<string,string>::iterator ITER; ITER iter=mapTest.find(key); mapTest.erase(iter); 像上面这样只是删除单个节点,map的形为不会出现任务问题, 但是当在一个循环里用的时候,往往会被误用,那是因为使用者没有正确理解iterator的概念. 像下面这样的一个例子就是错误的写法, eg2: for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter) { cout<<iter-

迭代器模式

泪湿孤枕 提交于 2020-02-28 11:32:31
迭代器模式 我们在日常的开发中,特别是在使用集合的过程中都或多或少使用了迭代器来对集合进行遍历。这时候我们就会思考一个问题,明明简单的For循环就能解决的集合遍历问题,我们非得创造一个迭代器来进行集合的遍历,使用迭代器来遍历到底有什么不一样的地方吗?本着‘存在即合理’的原则,我们通过手写迭代器的方式来深入了解一下迭代器模式的实现和带来的编码好处。 实现案例 有一个书架,我们想要知道这个书架里面堆了哪些书籍,这时候我们就需要对书架里面的书一本一本的遍历,直到没有书本,我们就能清楚的知道数据上堆满了哪些书籍。 可以被遍历的标记(生成迭代器的接口) 首先提供一个接口,来标明这个类是可以被遍历的集合。实现这个接口的类可以生成对应的迭代器。 123 public interface { public abstract Iterator iterator();} 迭代器接口 迭代器的抽象接口,定义了两个方法 (1)是否还有下一个元素 (2)返回下一个元素 1234 public interface Iterator{ public abstract boolean hasNext(); public abstract Object next();} 集合存储的元素(书本) 123 public class book{ private String name;} 迭代器实现类

Map遍历之Entry

让人想犯罪 __ 提交于 2020-02-27 02:26:19
Entry是Map接口的一个内部接口,作用是当Map集合一创建,就会在Map集合中创建一个Entry对象,用来记录键和值(键值和对象,键和值的映射关系) Map集合遍历的第二中方式:使用Entry进行遍历 Map集合中的方法: Set<Map.Entry<K,V>> entrySet() 返回此映射中包含的映射关系的set视图 1、使用Map集合中的方法entrySet(),把Map集合中多个Entry对象取出来,存储到一个set集合中 2、遍历set集合,获取每一个Entry对象 3、使用Entry对象中的getKey()和getValue()获取键和值 import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class demo3Entry { public static void main(String[] args){ //创建map集合对象 Map<String,Integer> map = new HashMap<>(); map.put("诸葛亮",1); map.put("刘伯温",2); map.put("张良",3); map.put("东方朔",4); //1、使用Map集合中的方法entrySet()

java.util.ConcurrentModificationException 异常问题详解

我的梦境 提交于 2020-02-26 23:44:33
环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常,本文就以ArrayList为例去理解和解决这种异常。 一、单线程情况下问题分析及解决方案 1.1 问题复现 先上一段抛异常的代码。 1 public void test1() { 2 ArrayList<Integer> arrayList = new ArrayList<>(); 3 for (int i = 0; i < 20; i++) { 4 arrayList.add(Integer.valueOf(i)); 5 } 6 7 // 复现方法一 8 Iterator<Integer> iterator = arrayList.iterator(); 9 while (iterator.hasNext()) { 10 Integer integer = iterator.next(); 11 if (integer.intValue() == 5) { 12 arrayList.remove(integer); 13 } 14 } 15 16 // 复现方法二 17 iterator = arrayList.iterator(); 18 for (Integer value :

Convert iterator to pointer?

孤街醉人 提交于 2020-02-26 06:46:49
问题 I have a std::vector with n elements. Now I need to pass a pointer to a vector that has the last n-1 elements to a function. For example, my vector<int> foo contains (5,2,6,87,251) . A function takes vector<int>* and I want to pass it a pointer to (2,6,87,251) . Can I just (safely) take the iterator ++foo.begin() , convert it to a pointer and pass that to the function? Or use &foo[1] ? UPDATE: People suggest that I change my function to take an iterator rather than a pointer. That seems not