1.在变成过程中我们通常会用到遍历Map,具体代码如下所示:
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
Iterator<Entry<Integer, String>> iter = map.entrySet().iterator();
int key;
String value = null;
while(iter.hasNext()){
key = iter.next().getKey();
value = iter.next().getValue();
// do something
}
我们知道Map和Iterator都是接口,接口是不能实例化的。但是这里的Map<Integer,String> map = new HashMap<Integer, String>();是什么意思?难道不是实例化了一个Map对象?如果对此有疑问,说明是对引用的概念不明了。这里在堆中创建的是HashMap的一个对象,而map只是存在于栈空间中,引用了堆中的HashMap对象。
2.为什么不使用HashMap<Integer, String> map = new HashMap<Integer, String>()
在程序实现中,我们希望隐藏具体的实现过程。代码如下:
public class Test{
public static void main(String[] args){
Map<Integer, String> map = getMap();
}
public static Map<Integer, String> getMap(){
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(1, "a");
map.put(2, "b");
Iterator<Entry<Integer, String>> iter = map.entrySet().iterator();
int key;
String value = null;
Entry<Integer, Strng> entry = null;
while(iter.hasNext()){
entry = iter.next();
key = entry.getKey();
value = entry.getValue();
// do something
}
return map;
}
// public static Map<Integer, String> getMap(){
// Map<Integer, String> map = new LinkedHashMap<Integer, String>();
// map.put(1, "a");
// map.put(2, "b");
// Iterator<Entry<Integer, String>> iter = map.entrySet().iterator();
// while(iter.hasNext()){
// // do something
// }
// return map;
// }
}
这样不管是getMap方法返回的是HashMap还是LinkedHashMap,在main函数中都只需要定义Map<Integer, String> map = getMap();即可,而不需要知道getMap具体返回的类型
分享到:
相关推荐
map 概念 map 是引用类型,可以使用如下方式声明: var mapname map[keytype]valuetype 在声明的时候不需要知道 map 的长度,因为 map 是可以动态增长的,未初始化的 map 的值是 nil,使用函数 len() 可以获取 map ...
10. ES6新增特性:新增模板字符串、箭头函数、for-of遍历数据、Promise对象纳入规范、let和const命令、module模块的概念。 11. attribute和property的区别:attribute是dom元素在文档中的html标签拥有的属性,...
GC Roots 是 Java 中的垃圾回收机制中的一个概念,它指的是垃圾回收器搜索到的对象引用。GC Roots 有三种: 1. 虚拟机栈中的引用的对象 2. 方法区中静态属性引用的对象,常量引用的对象 3. 本地方法栈中 JNI(即...
5.1.1 JVM对字符串的处理 5.1.2 不可变的字符串 5.1.3 字符串比较 5.2 表达式类型的陷阱 5.2.1 表达式类型的自动提升 5.2.2 复合赋值运算符的陷阱 5.3 输入法导致的陷阱 5.4 注释的字符必须合法 5.5 转义...
传统集合的多步遍历代码几乎所有的集合(如Collection接口或Map接口等)都支持直接或间接的遍历操作。而当我们需要对集合中的元素进行操作的时候,除了必需的添加、删除、获取外,最典型的就是集合遍历。例如: ...
概念不同 * GO没有带构建器和析构器的类. 取而代之的是继承阶级和虚函数, GO提供接口,下文会详细说明. C++用模板实现 * Go使用内存回收机制.没有必要也不可能明确地回收内存. 现代处理器中内存回收是为了更...
11_c的学习重理解到位_对初学者_传智扫地僧 12_直接通过内存标号操作内存空间_课堂答疑 13_中午课程回顾 14_内存四区基本原理_全局区案例理解 15_内存四区_堆栈案例理解 16_课堂答疑_理解指针的关键关键在内存 17_vs...
AIC的学费很贵,半年18000元,大家看看他们教些什么内容吧 <br>他们学校的网址http://www.aicsws-sjtu.com/<br><br>此内容是Java第1到第六章的PPT,希望大家喜欢 <br>如果大家觉得好我继续发 <br>课程定位...
对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使本书成为C++初学者的最佳指南;对于中高级程序员,本书也是不可或缺的参考书。本书的前言阐述了 第4版和前一版的不同之处。 【目录信息】 第1...
一、Java基础知识 1.Java有那些基本数据类型,String是不是基本...这个方法是由垃圾收集器在确定这个对象没有被引用时对这个对象调用的。它是在 Object 类中定义的,因此所有的类都继承了它。子类覆盖 finalize() ...
* Java与指针引用、指针和句柄的区别 * 堆和栈的概念 面向对象 * 面向对象编程基础 * 单例设计模式 * 封装、继承、多态 * 抽象类与接口 * 接口回调、闭包、内部类 * 异常处理 多线程 * 多线程基础 * 线程池 * ...
5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例程序 5.7 小结 5.8 思考题 第6章 映射对象标识符 6.1 关系数据库按主键区分不同的记录 6.1.1 ...
5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例程序 5.7 小结 5.8 思考题 第6章 映射对象标识符 6.1 关系数据库按主键区分不同的记录 6.1.1 ...
5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例程序 5.7 小结 5.8 思考题 第6章 映射对象标识符 6.1 关系数据库按主键区分不同的记录 6.1.1 ...
5.2 处理SQL引用标识符 5.3 创建命名策略 5.4 设置数据库Schema 5.5 设置类的包名 5.6 运行本章的范例程序 5.7 小结 5.8 思考题 第6章 映射对象标识符 6.1 关系数据库按主键区分不同的记录 6.1.1 ...
从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...
从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 12、...
从内存方面来看, Stateful Session Bean 与 Stateless Session Bean 比较, Stateful Session Bean 会消耗 J2EE Server 较多的内存,然而 Stateful Session Bean 的优势却在于他可以维持使用者的状态。 9、...