JAVA笔记20-容器之四Map接口、自动打包、泛型(重要)
一、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接口、自动打包、泛型(重要)相关推荐
- Java笔记整理五(Iterator接口,泛型,常见数据结构(栈,队列,数组,链表,红黑树,集合),jdk新特性,异常,多线程,Lambda表达式)
Java笔记整理五 1.1Iterator接口 Collection接口与Map接口主要用于存储元素,而Iterator主要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象 ...
- 【Java笔记】集合(Collection接口)的使用
面向对象语言对事物的体现都是以对象的形式,为了方便对多个对象的操作,就要对对象进行存储.使用 Array 存储对象方面具有一些弊端,而 Java 集合就像一种容器,可以动态地把多个对象的引用放入容器中 ...
- Java集合(7)--Map接口的实现类HashMap、LinkHashMap、TreeMap和Properties
文章目录 HashMap类 LinkedHashMap类 TreeMap类 Hashtable类 Properties类 HashMap类 1.HashMap类概述 HashMap是 Map 接口使用 ...
- Java集合(6)--Map接口
文章目录 Map接口概述 Map结构的理解 Map接口常用方法 Map接口概述 Map与Collection并列存在,用于保存具有映射关系的数据:key-value Map中的 key 和 value ...
- Java基础学习——Java集合(九)Map接口、HashMap、LinkedHashMap实现类、TreeMap实现类
一.Map接口 二.HashMap实现类.LinkedHashMap实现类 1.HashMap的特点 1)无序,唯一(key唯一,因为底层key按照哈希表(数组+链表)的结构) 2)放入集合的数据的类 ...
- 手撕Java源码系列之Map接口
Map简介 #Map是以Key和Value进行存储的,这点就是与Collection做一个区别.Map的Key不可重复,但是value可以重复.而Collection最直观的感受就是其子接口Set,仅 ...
- [Leetcode][JAVA][第20题][Stack][Map]
[问题描述] 20. 有效的括号 给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效.有效字符串需满足:左括号必须用相同类型的右括号闭合. 左括号必须以正确的 ...
- Java笔记-09 容器 Collection
文章目录 泛型 Collection的常用方法 List ArrayList LinkedList Vector Map HashMap与HashTable的区别 HashMap底层 TreeMap ...
- 咸鱼Java笔记:容器
HashMap和HashTable的区别 线程是否安全:HashMap 是非线程安全的,HashTable 是线程安全的: 效率:因为线程安全的问题,HashMap 要比 HashTable 效率高一 ...
- Java基础09_ 容器(有待梳理)
容器的概念 容器 API Collection 接口 Iterator 接口 增强的 for 循环 Set 接口 List 接口 和 Comparable 接口 Collections 类 Map 接 ...
最新文章
- Kafka主题体系架构-复制、故障转移和并行处理
- BQ27510 电量计的校准 的 C语言实现
- android ImageSwitcher的使用
- 常用贴片三极管主要参数
- HTML,CSS,JaveScript
- 盲人编程_盲人如何编码
- Apt 命令解说(apt-get update、apt-cache search package、apt-get install package、apt-get remove )
- 前端开发 html常用标签 0229
- 支付宝五福开奖!几个亿的项目你分到几块?
- 95-280-035-源码-资源管理-计算资源管理-TaskSlot
- 36岁,还要不要去互联网公司
- HDU-2030-汉字统计
- 在Ubuntu下安装ros
- 第一阶段·Linux运维基础 第3章·文件属性、正则表达式、文件权限
- Oracle JDK 最新和旧版本下载地址
- 用SQL来校验证件号码是否合法
- mybatis获取map中的key和value
- 计算机库里怎样添加桌面,小编教你win7中如何在库中添加桌面
- Docker容器之间数据传输
- flash传值php乱码,Flash中出现中文乱码的解决办法,网页模板帮助中心
热门文章
- 【Django 2021年最新版教程13】Cookie是什么 如何使用
- 云南民大java期中考试_中南民族大学Java语言程序设计期末试卷A卷
- 基于springboot的高校档案系统
- java sql.setInt_java – PreparedStatement的setInt()无法在PostgreSQL上运行
- JDBC06 其他操作及批处理Batch
- SpringSecurity安全框架的笔记
- 学计算机的银行从业人员,银行从业人员继续教育
- gridview的sort_GRIDVIEW排序的方法
- Linux内存分配器SLOB,深入理解Linux内核之SLOB分配器
- 阶段5 3.微服务项目【学成在线】_day04 页面静态化_23-页面预览-页面预览开发