一、Map接口

  Map提供的是key到value的映射。key不能重复,每个key只能映射一个value。

注:重复是指equals,但用equals()方法效率低,所以此处用hashCode()方法比较

  key还决定了存储对象在映射中的存储位置,不是由key本身决定,而是通过一种散列技术处理产生的散列码,该散列码作为偏移量,对应分配给映射的内存区域的起始位置。Map集合包括Map接口和Map接口的所有实现类。

  Map接口中提供了集合的常用方法:

举例1:Map接口中方法的使用

import java.util.*;  //导入java.util包
public class Test{public static void main(String args[]){Map m1 = new HashMap();Map m2 = new TreeMap();m1.put("one",new Integer(1));m1.put("two",new Integer(2));m1.put("three",new Integer(3));m2.put("one",new Integer(2));m2.put("B",new Integer(2));System.out.println(m1.size());System.out.println(m1.containsKey("one"));System.out.println(m2.containsValue(new Integer(1)));if(m1.containsKey("two")){int i = ((Integer)m1.get("two")).intValue();System.out.println(i);}Map m3 = new HashMap(m1);m3.putAll(m2);System.out.println(m3);}
}

输出:

3
true
false
2
{two=2, B=2, one=2, three=3}

举例2:

import java.util.*;  //导入java.util包
public class Test{public static void main(String args[]){Map m1 = new HashMap();Map m2 = new TreeMap();m1.put("one",new Integer(1));m1.put("two",new Integer(2));m1.put("three",new Integer(3));m1.put("four",null);Set s = m1.keySet();Iterator t = s.iterator();System.out.println("key集合中的元素");while(t.hasNext()){System.out.println(t.next());}Collection c = m1.values();t = c.iterator();System.out.println("value集合中的元素");while(t.hasNext()){System.out.println(t.next());}}
}

输出:

key集合中的元素
two
one
three
four
value集合中的元素
2
1
3
null

  Map接口的实现类有HashMap(哈希表)和TreeMap(二叉树)等。建议使用HashMap实现类实现Map集合,因为由HashMap类实现的Map集合对于添加和删除映射关系效率更高。如果希望Map集合中的对象存在一定的顺序,应使用TreeMap。

1、HashMap类:基于哈希表的Map接口的实现。提供所有可选的映射操作,并允许使用null值和null键,但必须保证键的唯一性。不保证映射顺序,特别是不保证映射顺序恒久不变。

2、TreeMap类:不仅实现了Map接口,还实现了java.util.SortedMap接口。集合中的映射关系存在一定的顺序。在添加、删除和定位映射关系上,比HashMap类性能差一些。不允许键对象为null。

补充:可以通过HashMap类创建Map集合,当需要顺序输出时,再创建一个完成相同映射关系的TreeMap类实例。

举例:

二、自动打包、解包(Auto-boxing/unboxing)(JDK1.5之后支持)

  在合适的时机自动打包、解包:自动将基础类型转换为对象,自动将对象转换为基础类型。

举例1:

import java.util.*;  //导入java.util包
public class Test{public static void main(String args[]){Map m1 = new HashMap();Map m2 = new TreeMap();//m1.put("one",new Integer(1));//m1.put("two",new Integer(2));//m1.put("three",new Integer(3));m1.put("one",1);m1.put("two",2);m1.put("three",3);//m2.put("one",new Integer(1));//m2.put("B",new Integer(2));m2.put("one",2);m2.put("B",2);System.out.println(m1.size());System.out.println(m1.containsKey("one"));//System.out.println(m2.containsValue(new Integer(1)));System.out.println(m2.containsValue(1));if(m1.containsKey("two")){//int i = ((Integer)m1.get("two")).intValue();int i = (Integer)m1.get("two");System.out.println(i);}Map m3 = new HashMap(m1);m3.putAll(m2);System.out.println(m3);}
}

输出:

3
true
false
2
{two=2, B=2, one=2, three=3}

举例2:

自动打包的写法:

三、JDK1.5泛型(Generic)

1、起因:JDK1.4以前的类型不明确:装入集合的类型都被当做Object对待,从而失去自己的实际类型;从集合中取出时往往需要转型,效率低,容易出错。

2、解决办法:在定义集合的时候同时定义集合中对象的类型(凡是遇到集合的时候尽量使用泛型)。可以在定义Collection的时候指定,也可以在循环时用Iterator指定。

3、好处:增强程序的可读性和稳定性。

举例:第5行指定只能存String。什么时候能在类后指定<>中的类型呢?查看API文档中如果类定义为如下形式则可以:Class ArrayList<E>,Interface Comparable<T> 它的方法 int compareTo(T o)。

4、List<? extends T>和List<? super T>的区别:前者T和T的子类;后者T和T的父类;

自动打包与泛型结合,修改前面的:

1、Interface Map<K,V>

import java.util.*;  //导入java.util包
public class Test{public static void main(String args[]){//Map m1 = new HashMap();//Map m2 = new TreeMap();Map<String,Integer> m1 = new HashMap<String,Integer>();Map<String,Integer> m2 = new TreeMap<String,Integer>();//m1.put("one",new Integer(1));//m1.put("two",new Integer(2));//m1.put("three",new Integer(3));m1.put("one",1);m1.put("two",2);m1.put("three",3);//m2.put("one",new Integer(1));//m2.put("B",new Integer(2));m2.put("one",2);m2.put("B",2);System.out.println(m1.size());System.out.println(m1.containsKey("one"));//System.out.println(m2.containsValue(new Integer(1)));System.out.println(m2.containsValue(1));if(m1.containsKey("two")){//int i = ((Integer)m1.get("two")).intValue();//int i = (Integer)m1.get("two");int i = m1.get("two");//使用泛型后不需要强制转型了!
            System.out.println(i);}Map m3 = new HashMap(m1);m3.putAll(m2);System.out.println(m3);}
}

2、

转载于:https://www.cnblogs.com/seven7seven/p/3672712.html

JAVA笔记20-容器之四Map接口、自动打包、泛型(重要)相关推荐

  1. Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)

    Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...

  2. 【Java笔记】集合(Collection接口)的使用

    面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中 ...

  3. Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties

    文章目录 HashMap类 LinkedHashMap类 TreeMap类 Hashtable类 Properties类 HashMap类 1.HashMap类概述 HashMap是 Map 接口使用 ...

  4. Java集合(6)--Map接口

    文章目录 Map接口概述 Map结构的理解 Map接口常用方法 Map接口概述 Map与Collection并列存在,用于保存具有映射关系的数据:key-value Map中的 key 和 value ...

  5. Java基础学习——Java集合(九)Map接口、HashMap、LinkedHashMap实现类、TreeMap实现类

    一.Map接口 二.HashMap实现类.LinkedHashMap实现类 1.HashMap的特点 1)无序,唯一(key唯一,因为底层key按照哈希表(数组+链表)的结构) 2)放入集合的数据的类 ...

  6. 手撕Java源码系列之Map接口

    Map简介 #Map是以Key和Value进行存储的,这点就是与Collection做一个区别.Map的Key不可重复,但是value可以重复.而Collection最直观的感受就是其子接口Set,仅 ...

  7. [Leetcode][JAVA][第20题][Stack][Map]

    [问题描述] 20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足:左括号必须用相同类型的右括号闭合. 左括号必须以正确的 ...

  8. Java笔记-09 容器 Collection

    文章目录 泛型 Collection的常用方法 List ArrayList LinkedList Vector Map HashMap与HashTable的区别 HashMap底层 TreeMap ...

  9. 咸鱼Java笔记:容器

    HashMap和HashTable的区别 线程是否安全:HashMap 是非线程安全的,HashTable 是线程安全的: 效率:因为线程安全的问题,HashMap 要比 HashTable 效率高一 ...

  10. Java基础09_ 容器(有待梳理)

    容器的概念 容器 API Collection 接口 Iterator 接口 增强的 for 循环 Set 接口 List 接口 和 Comparable 接口 Collections 类 Map 接 ...

最新文章

  1. Kafka主题体系架构-复制、故障转移和并行处理
  2. BQ27510 电量计的校准 的 C语言实现
  3. android ImageSwitcher的使用
  4. 常用贴片三极管主要参数
  5. HTML,CSS,JaveScript
  6. 盲人编程_盲人如何编码
  7. Apt 命令解说(apt-get update、apt-cache search package、apt-get install package、apt-get remove )
  8. 前端开发 html常用标签 0229
  9. 支付宝五福开奖!几个亿的项目你分到几块?
  10. 95-280-035-源码-资源管理-计算资源管理-TaskSlot
  11. 36岁,还要不要去互联网公司
  12. HDU-2030-汉字统计
  13. 在Ubuntu下安装ros
  14. 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
  15. Oracle JDK 最新和旧版本下载地址
  16. 用SQL来校验证件号码是否合法
  17. mybatis获取map中的key和value
  18. 计算机库里怎样添加桌面,小编教你win7中如何在库中添加桌面
  19. Docker容器之间数据传输
  20. flash传值php乱码,Flash中出现中文乱码的解决办法,网页模板帮助中心

热门文章

  1. 【Django 2021年最新版教程13】Cookie是什么 如何使用
  2. 云南民大java期中考试_中南民族大学Java语言程序设计期末试卷A卷
  3. 基于springboot的高校档案系统
  4. java sql.setInt_java – PreparedStatement的setInt()无法在PostgreSQL上运行
  5. JDBC06 其他操作及批处理Batch
  6. SpringSecurity安全框架的笔记
  7. 学计算机的银行从业人员,银行从业人员继续教育
  8. gridview的sort_GRIDVIEW排序的方法
  9. Linux内存分配器SLOB,深入理解Linux内核之SLOB分配器
  10. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发