JAVA学习第三十九课(常用对象API)- 集合框架(七)— Map集合及其子类对象

一、Map集合常见子类

HashTable:内部结构是哈希表,同步,此实现提供所有可选的映射操作,不允许使用 null 值和 null 键

(HashTable下有子类Properties,使用频率非常高,用来存储键值对型的配置文件信息和IO技术相结合)

HashMap:内部结构是哈希表,不同步,此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。

TreeMap:内部结构是二叉树,不同步,可以对Map集合中的键进行排序。

二、HashMap演示

import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
class Man
{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Man(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Man() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Man other = (Man) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
public class Main
{
	public static void main(String[] args) {
		HashMapDemo();
	}
	public static void HashMapDemo(){
		//人和籍贯 通过键值对存储在HashMap中
		HashMap<Man, String> hm = new HashMap<Man,String>();
		hm.put(new Man("周",1),"上海");
		hm.put(new Man("周",1),"东北");//要保证哈希表,所以Man中的HashCode和equals方法要复写
		hm.put(new Man("王",4),"北京");
		hm.put(new Man("孙",2),"广州");
		hm.put(new Man("赵",6),"山东");

		Iterator<Man> it =  hm.keySet().iterator();
		while(it.hasNext()){
			Man man = it.next();
			String bir = hm.get(man);
			System.out.println("man - bir :"+man.getName()+","+man.getAge()+" - "+bir);
		}
	}
}

三、TreeMap演示

import java.util.Collection;
import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
class Man extends Object
{
	private String name;
	private int age;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public Man(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	public Man() {
		super();
		// TODO Auto-generated constructor stub
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Man other = (Man) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
}
class Compararule implements Comparator<Object>
{
	 public int compare(Object arg0, Object arg1) {
		 if(!(arg0 instanceof Man))
	            throw new ClassCastException();  

	            Man man = (Man)arg0;
	            Man man2 = (Man)arg1;
	        int te = man.getAge() - man2.getAge();
	        return te==0?man.getName().compareTo(man2.getName()):te;
	    }
}
public class Main
{
	public static void main(String[] args) {
		TreeMapDemo();
	}
	public static void TreeMapDemo(){
		TreeMap<Man, String> tm = new TreeMap<Man,String>(new Compararule());
		tm.put(new Man("zhou",1),"上海");
		tm.put(new Man("zhou",1),"东北");//要保证哈希表,所以Man中的HashCode和equals方法要复写
		tm.put(new Man("wang",4),"北京");
		tm.put(new Man("sun",2),"广州");
		tm.put(new Man("zhao",6),"山东");

		Iterator<Map.Entry<Man,String>> it =  tm.entrySet().iterator();
		while(it.hasNext()){
			Map.Entry<Man, String> mEntry = it.next();
			Man man = mEntry.getKey();
			String bir = mEntry.getValue();
			System.out.println("man - bir :"+man.getName()+","+man.getAge()+" - "+bir);
		}
	}
}

集合框架的三大集合:List、Set、Map,到此就结束了

看到array,数组,有角标,查询速度快

看到link,链表,增删速度快,add、get、remove frist/last 方法

看到hash,哈希表,元素唯一性,覆盖HashCode方法和equals方法

看到tree,二叉树,排序,两大接口Comparator,Comparable

而Map自身没有迭代器,但是可以通过keySet,entry返回Set映射,再通过Set的迭代器,访问键值对

明天就是泛型的学习。要重点掌握,加油!!!

时间: 2024-08-07 00:16:07

JAVA学习第三十九课(常用对象API)- 集合框架(七)— Map集合及其子类对象的相关文章

JAVA学习第三十四课 (经常使用对象API)—List集合及其子类特点

整个集合框架中最经常使用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且能够反复    API文档解释:有序的 collection(也称为序列).此接口的用户能够对列表中每一个元素的插入位置进行精确地控制.用户能够依据元素的整数索引(在列表中的位置)訪问元素,并搜索列表中的元素. 2.Set:元素不能反复,无序,有可能会有序    API文档解释:一个不包括反复元素的 c

JAVA学习第三十六课(常用对象API)- 集合框架(四)— Set集合:HashSet集合演示

随着Java学习的深入,感觉大一时搞了一年的ACM,简直是明智之举,Java里很多数据结构.算法类的东西,理解起来就轻松多了 Set集合下有两大子类开发常用 HashSet集合 .TreeSet集合 Set集合的元素是不重复且无序 一.HashSet集合 API文档解释:此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持.它不保证 set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null 元素. 此类为基本操作提供了稳定性能,注意,此实现不是同步的. 由上可

JAVA学习第三十四课(常用对象API)- 集合框架(二)—List集合及其子类特点

整个集合框架中最常用的就是List(列表)和Set(集) 一.List集合 && Set的特点 Collection的子接口: 1.List:有序(存入和取出的顺序一致),元素都有索引且可以重复    API文档解释:有序的 collection(也称为序列).此接口的用户可以对列表中每个元素的插入位置进行精确地控制.用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素. 2.Set:元素不能重复,无序,有可能会有序    API文档解释:一个不包含重复元素的 coll

JAVA学习第三十五课(常用对象API)- 集合框架(三)—Vector、LinkedList、ArrayList集合演示

集合框架构成图 摘自百度图片 一.Vector集合 演示 虽然Vector已经不常用了,但是还是要了解一下其中的方法 import java.util.ArrayList; import java.util.Enumeration; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; import java.util.Vector

JAVA学习第三十八课(常用对象API)- 集合框架(六)— Map集合及其常用方法

一.Map集合特点 Map集合(双列集合)一次添加一对元素,Collection集合(单列集合)一次添加一个元素 接口 Map<K,V>,实际上存储的是键值对 特点: 将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值. 也就是说Map中必须保证键的唯一性 二.常用方法 1.添加:value = put(key,value);返回前一个和key相关联的值,如果没有返回null 2.删除:void clear();把Map中的所有映射关系清除 value remove(ke

JAVA学习第四十九课 — IO流(三):缓冲区2 &amp; 装饰设计模式

一.模拟BufferedReader 自定义MyBuffereaReader 对于缓冲区而言,里面其实就是封装一个数组,对外提供方法对数组的操作,这些方法最终操作的都是数组的角标 原理:从源中取出数据存入缓冲区,再从缓冲区不断的取出数据,取完后,继续从源中继续取数据,进缓冲区,直至源中的数据取完,用-1做为结束标记 import java.io.*; class MyBufferedReader { private FileReader fr; //定义数组作为缓冲区 private char[

JAVA学习第三十二课(常用对象API)- 基本数据类型对象包装类

将基本数据类型(8种:int..)封装成对象的好处就是可以在对象中封装更多的功能和方法来操控该数据 常见的操作就是:用于基本数据类型与字符串之间的转换 基本数据类型对象包装类一般用于基本类型和字符串之间的转换 基本类型----->字符串 1.基本类型数值+"" 2.用string类中的valueOf(基本类型数值) 3.用Integer.ValueOf(); 字符串-->基本类型数值 1.使用包装类中的静态方法XXX  parseXXX("XXXX")比

JAVA学习第五十九课 — 网络编程概述

网络模型 OSI(Open System Interconnection)开放系统互连:參考模型 TCP/IP 网络通讯要素 IP地址 port号 传输协议 网络參考模型 七层OSI模型的基本概念要了解 网际层协议:包含:IP协议.ICMP协议.ARP协议.RARP协议. 传输层协议:TCP协议.UDP协议. 应用层协议:FTP.Telnet.SMTP.HTTP.RIP.NFS.DNS. 要真正实现网络通讯,首先要找到IP地址,IP地址是网络通讯的一大要素 IP地址:InetAddress 网络

JAVA学习笔记(三十九)- 线程优先级

线程优先级 /* * 线程优先级,范围[1,10] * 不同优先级的线程获取执行的机会不同,优先级越高,执行机会越大 * * 对比不同优先级的线程被执行的机率 */ public class Test05 { public static void main(String[] args) { System.out.println("最大优先级:" + Thread.MAX_PRIORITY); System.out.println("最小优先级:" + Thread.