Java集合(八) 迭代器Iterator、泛型、Map映射
一、 迭代器
- 迭代器的增删作用于原集合
- 用迭代器遍历集合 , 用指针的挪动来获取对应的元素,通过标记这个元素是否可以用来操作 去操作原集合。
- 在迭代过程中不允许直接操作原集合。
- forEach --- 本质上也是做迭代遍历 ,如果一个对象能使用增强for循环,那么这个类必须实现 Iterable。
- JDK1.5的新特性之一。
/** 迭代器练习*/ public class IteratorTest_01 {public static void main(String[] args) {List<String> list = new ArrayList<String>();list.add("张三");list.add("李四");//获取迭代器对象Iterator<String> iterator = list.iterator();//通过迭代器遍历集合//判断是否有下一个元素while(iterator.hasNext()){//挪动指针,获取元素String s = iterator.next();System.out.println(s);//移除当前元素 ---- 作用于原集合 // iterator.remove();//在迭代过程中 ,不允许直接操作原集合 爆java.util.ConcurrentModificationException异常list.remove(s);list.add("王五");}System.out.println(list);} }
二、 泛型
- 学名: 参数化类型 --- 顶级泛型接口 ParameterizedType --- JDK1.5新特性之一。
- 起强制限定的作用。 提高运行和编译的效率。
- 用具体类型来替换泛型的操作 --- 泛型的擦除
- 使用泛型之后效率略低 ,多了泛型的推导和擦除过程。
/** 泛型的定义* 泛型在定义时只要符合标识符的命名规则即可 ,但习惯上是使用一个大写字母表示泛型* T type* E Elements* K key* V value* R result* 当定多个泛型的时候,泛型之间用","隔开* */ public class GenericTest_01 {public static void main(String[] args) {} } class Demo<T> {private T t;public Demo() { // t = new T(); //错误 , 因为不知道具体的类型 ,所以JVM无法分配具体的内存空间。}//泛型可以用作返回值类型public T getT() {return t;}//泛型可以用作参数public void setT(T t) {this.t = t;}//参数类型不确定 ,希望传入任意类型的参数之后 ,转换为T类型//不能定义正在一个类上 ,为当前方法定义一个属于当前方法的泛型private <E> T change(E e) {return (T)e;}//参数类型确定 ,但返回值类型不确定private <R>R change2 (T t){return (R)t;}//参返都不确定private <A,B>B change3(A a){return (B)a;} }
- 泛型的继承 -- ?:表示泛型的通配符 , 表示此时需要泛型 ,但是不能确定类型
/** 泛型类的继承* */ public class GenericTest_02 {public static void main(String[] args) {List<Integer> list1 = Arrays.asList(1,3,5,7,4,3,2);List<Double> list2 = Arrays.asList(1.0,34.0,55.0,7.0,5.0,4.0,3.0);it(list1);it(list2);}//泛型不向下兼容 泛型Number不能接受数值类型的值// ? extends Number 表示传入的这个类或接口 是Number 的子类// 无论是类还是接口 ,这里一律用extends // Number规定了 泛型的上限public static void it(List<? extends Number> list) {//由于不确定子类的类型 ,所以不能向集合中添加元素 ,只能添加null // list.add(4); // list.add(null);for(Number n : list ){System.out.println(n);}}//可以传入String及其父类// ? super 类\接口 表示 可以传入 这个类的子类\接口 元素// 规定了泛型的下限//规定了下限之久能够添加元素//同一个泛型不能既规定上限 , 有规定下限public static void it1(List<? super String> list){} }
- 是JDK1.5的新特性之一
三、 Map<K , V>映射
- 映射 。 一个键对应一个值 --- map中的元素是以键值对的形式存在的。
- 键唯一 , 值唯一 。
- Map本身不是集合 , 但是集合框架中的一员。
- 集合框架中包含了集合 、映射以及操作集合和映射的工具 。
- Entry --- 代表键值对的接口 --- Map中的内部接口
- 一个Map对象实际上是由多个Entry对象组成的。
- HashMap ** 重点 **
- 允许值为null , 允许键为null。
- 默认初始容量为16 , 加载因子为0.75f , 每次扩容一倍 。 本身是一个异步式线程不安全的映射。
- HashTable ** 记住 **
- 任何非null值都可以作为键和值 --- 键值都不允许为null。
- 默认初始容量为11 , 加载因子为0.75f , 容量超过75% 时 开始扩容 , 本身是一个同步式线程安全的映射。
- 效率低
- 是 java中最早的映射。
- ComcurrenHashMap
- 异步式线程安全的映射
- Dictionary是所有映射的父类。
/** Map * */ public class MapTest_01 {public static void main(String[] args) {//表示 键为String类型 , 值为 Integer类型Map<String ,Integer> map = new HashMap<String , Integer>();//添加元素map.put("a", 1);map.put("b", 2);map.put("c", 3);map.put("d", 4);//覆盖元素map.put("a", 5);//将所有的值放入一个Collection集合System.out.println("map中所有值:"+map.values());//获取键值对的个数System.out.println("map中键值对的个数:"+map.size());//判断映射是否为空System.out.println("map是否为空:"+map.isEmpty());//根据键获取对应的值System.out.println("c对应的值是:"+map.get("c"));//判断映射中是否包含指定的键System.out.println("map中是否有d:"+map.containsKey("d"));//删除元素map.remove("b");//清空映射map.clear();//映射中的toString方法做过重写System.out.println(map.toString());} }
package com.tj.tedu;import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; import java.util.Set;/** map遍历的三种方式* */ public class MapTest_02 {public static void main(String[] args) {//表示 键为String类型 , 值为 Integer类型Map<String ,Integer> map = new HashMap<String , Integer>();//添加元素map.put("a", 1);map.put("b", 2);map.put("c", 3);map.put("d", 4);//方式一Set<String> keySet = map.keySet();for( String key : keySet){System.out.println(key+"="+map.get(key));}System.out.println("-----------------------------------");//方式二Set<Entry<String, Integer>> entrySet = map.entrySet();for(Entry e : entrySet){System.out.println(e.getKey()+"="+e.getValue());}System.out.println("-----------------------------------");//方式三Set<Entry<String, Integer>> entrySet2 = map.entrySet();Iterator<Entry<String, Integer>> iterator = entrySet2.iterator();while(iterator.hasNext()){Entry<String, Integer> next = iterator.next();System.out.println(next.getKey()+"="+next.getValue());}} }
练习:输入一个数以及对应个数的Integer键值对 ,输出要求:键从小到大排序 , 如果出现了重复的键 , 则要求对应的值求和 。
// 输入一个数以及对应个数的Integer键值对 ,输出要求:键从小到大排序 , 如果出现了重复的键 , 则要求对应的值求和 。 public class Test_03 {public static void main(String[] args) {//在Scanner类中 , 除了nextLine()方法以外 , 其余的方法是以空格作为 结束符Scanner in = new Scanner(System.in);System.out.println("请输入数据的个数 :");int count = in.nextInt();System.out.println("请依次输入数据,中间以,隔开:");in.nextLine();List<String> l = new ArrayList<String>();for(int i = 0 ; i<count ;i++){l.add(in.nextLine());}//排序l.sort(new Comparator<String>() {@Overridepublic int compare(String o1, String o2) {return new Integer(o1.split(",")[0])-new Integer(o2.split(",")[0]);}});//放入Map如果键相同 , 则值求和Map<Integer , Integer> map = new HashMap<Integer, Integer>();for(int i = 0 ; i<count ; i++){Integer key = new Integer(l.get(i).split(",")[0]);Integer value = new Integer(l.get(i).split(",")[1]);if(map.containsKey(key)){map.put(key, map.get(key)+value);}else{map.put(key, value);}}System.out.println(map);}}
Java集合(八) 迭代器Iterator、泛型、Map映射相关推荐
- java基础—Map集合的常见方法操作(java集合八)
Map集合的常见方法操作 Map集合中的元素取出并打印的三种方式 import java.util.Collection; import java.util.HashMap; import java. ...
- java 迭代器的原理_Java集合框架迭代器Iterator实现原理解析
使用循环遍历集合 普通for循环 for(int i=0;i<10;i++){} 增强for循环 for(String str:list){} 什么是迭代器Iterator Iterator是J ...
- 史上最全的集合框架讲解 ----- Java 集合框架(3)---- Map 相关类最全解析
引言 好了,步入正题,上篇文章Java 集合框架(2)---- List 相关类解析中我们一起看了一下 List 接口的相关具体类(ArrayList.LinkedList-.),这篇开始我们开始探索 ...
- Java 集合框架(5)---- Map 相关类解析(中)
本文标题大纲: 文章目录 前言 HashMap TreeMap 指定 TreeMap 的元素排序方式 前言 还是先上那张图吧,我又偷懒了,还是只关注 Map 接口下的类就行了: 在上上篇文章中我们一起 ...
- java集合map_JAVA中的集合类Map、Set、List
*精炼的总结: Collection 是对象集合, Collection 有两个子接口 List 和 Set List 可以通过下标 (1,2..) 来取得值,值可以重复 而 Set 只能通过游标来取 ...
- Java 集合 Collection、Iterator
Java集合分为Set(无序.不可重复).List(有序.重复).Queue(队列)和Map(映射关系) Java集合概述 数组元素既可以是基本类型的值,也可以是对象(实际保存对象的引用变量) 集合只 ...
- java集合 — — lterator迭代器
二.lterator迭代器 2.1.Iterator接口 在程序开发中,经常需要遍历集合中的所有元素.针对这种需求,JDK专门提供了一个接口.java.util.Iterator.Iterator 接 ...
- Java集合List,Set,Map,Queue,Deque
集合是Java基础中非常重要的一部分,Java提供了非常丰富的集合API,了解各个集合的特点,怎么样在各种各样的场景中使用正确的集合,非常重要,也是一个Java程序员最基本的素养. 整体了解 Java ...
- Java集合List、Set、Map
集合是 java 基础中非常重要的一部分,同样也是 Java 面试中很重要的一个知识点.所以,给王小整理了这篇关于集合的文章. 1.接口继承关系以及实现 集合类存放于 Java.util 包中,主要有 ...
- Java集合详解--什么是Map
引言 在很久很久以前,讲过Set的实现原理,讲到Set就是Map的马甲,那么今天我们就来看看Map是如何实现的(本文都基于JDK1.8的版本) 什么是Map Map和Collection有关的几个ma ...
最新文章
- Mybatis 中$与#的区别
- Linux IO模型漫谈(6)- 信号驱动IO模型
- 大名鼎鼎的Requests库用了什么编码风格?
- 每日一皮:你不知道你的骑手为了给你送餐要经历什么...
- 那些年一起学习的PHP(三)
- go protobuf tcp 粘包处理 demo
- java util包类_java.util包下的类及常用方法
- 针对Spring的Spring Retry 我发现了这样一个大家都不知道的技巧!
- Spring Boot中的缓存支持(二)使用Redis做集中式缓存
- Appimage版wine乱码解决
- MPLS virtual private network 本地互访实验(华为设备)
- 如何删除git本地分支
- STM32F1--FreeRTOS系统移植运行报错:L6218E:Undefined symbol xTaskGetSchedulerState (referred from delay.o)
- Quartus18.0新建工程
- 详解MATLAB之MAX函数
- linux命令man ls,linux 命令ls man手册的详解
- CASS方格网法土石方量计算
- ArcGIS入门教程(矢量编辑工作流程)
- 吉林教育杂志吉林教育杂志社吉林教育编辑部2022年第28期目录
- 如何使用PS将一小块图片填充为一个大背景
热门文章
- C语言中的nan和inf使用
- Windows Azure 安全最佳实践 - 第 1 部分:深度解析挑战防御对策
- linux 开机自动启动服务
- Spartan-II 应用指南 转载
- java gsp_GSP序列模式分析算法
- Java黑皮书课后题第4章:*4.26(金融应用:货币单位)重写程序清单2-10,解决将float型值转换为int型值时可能会造成精度损失的问题。读取的输入值是一个字符串,比如“11.56“
- ios审核被拒3.2.1问题总结
- 2013 ACM/ICPC 亚洲区 杭州站
- Codevs 1049 棋盘染色
- 一种监控全部账户登陆及操作命令的方法