文档章节

集合(四)Map

centrald
 centrald
发布于 2016/01/29 22:44
字数 2030
阅读 131
收藏 8

 Collection集合和Map集合的区别:

          a: Map集合属于双列集合 , Collection属于单列集合

          b: Map集合键是唯一性的, 而Collection集合中的Set集合可以保证元素的唯一性

          c: Map集合的数据结构只和键有关系 ,和值没有关系 , 而Collection集合的数据结构和元素有关系

  Map集合是一个接口 , 接口不能直接实例化 , 如果我们要对其进行实例化,那么就需要使用子类 , HashMap 和  TreeMap

 Map集合的功能概述:

a: 添加元素

  V put(K key, V value)         添加元素

  b: 删除元素

  void clear() 删除所有的元素

  V remove(Object key) 根据键删除元素

  c: 获取元素

  V get(Object key) 根据键获取值

  Set<K> keySet() 获取所有的键对应的Set集合

  int size() 获取集合的长度

  Collection<V> values() 获取所有的值对应Collection

  d: 判断该功能

  boolean containsKey(Object key) 判断是否包含某一个键

  boolean containsValue(Object value) 判断是否包含某一个值

  boolean isEmpty() 判断集合是否为空

  e: 遍历Map集合

                (1) 键找值

           分析:

       a: 获取所有的键对应的Set集合

       b: 遍历这个Set集合, 获取每一个元素 , 而每一个元素就是键 , 然后根据当前遍历的键获取对应的值

        

                (2)根据键值对象遍历集合

      Set<Map.Entry<K,V>> entrySet(): 获取的是所有的键值对对象对应的set集合

                  分析:

      a: 调用entrySet方法获取所有的键值对对象对应的Set集合

      b: 遍历这个Set集合, 获取每一个元素,而每一个元素应该是键值对对象 , 然后我们调用方法 ,从这个键值对对象中获取对应的键和值

    HashMap的两种遍历方式:

* 请编写程序,存储自定义对象到HashMap集合中,并采用两种方式遍历
 */
import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

public class HashMapDemo {
	public static void main(String[] args) {
		Student s1 = new Student("李时珍",50);
		Student s2 = new Student("蒲松龄",39);
		Student s3 = new Student("曹雪芹",41);
		
		//1.创建HashMap对象,键为String类型,值为Student类型
		HashMap<String, Student> hs = new HashMap<String,Student>();
		//将自定义对象加入集合
		hs.put("本草纲目", s1);
		hs.put("聊斋志异", s2);
		hs.put("红楼梦", s3);
		//遍历,根据键获取对象
		Set<String> keySet = hs.keySet();
		for(String k:keySet){
			Student st = hs.get(k);
			System.out.println(k+"---"+st.getName()+"---"+st.getAge());
		}
		
		System.out.println("----------------------------------------");
		//2.创建HashMap对象,key为Student类,value为String类型
		HashMap<Student,String> hs2 = new HashMap<Student,String>();
		
		//将自定义对象加入集合
		hs2.put(s3, "红楼梦");
		hs2.put(s2, "聊斋志异");
		hs2.put(s1, "本草纲目");
		
		//遍历,使用entrySet方法,将所有键值对的对象存入Set集合中,然后根据键值对象获取键与值
		Set<Entry<Student, String>> entrySet = hs2.entrySet();
		for(Entry<Student, String> en : entrySet){
			Student st = en.getKey();
			System.out.println(st.getName()+"---"+st.getAge()+"---"+en.getValue());
		}
	}
}

/*
 * 红楼梦---曹雪芹---41
聊斋志异---蒲松龄---39
本草纲目---李时珍---50
----------------------------------------
李时珍---50---本草纲目
曹雪芹---41---红楼梦
蒲松龄---39---聊斋志异

 */

TreeMap:

TreeMap集合的特点: 底层的数据结构是二叉树, 可以对元素进行排序

  而排序有两种方式

   第一种是自然排序 public TreeMap()

  对元素有要求 , 要求元素必须实现 Comparable 接口

  第二种是比较器排序 public TreeMap(Comparator comparator)

   我们到底使用的是自然排序还是比较器排序主要依赖于构造方法  

                Map集合的数据结构只和键有关系,和值没有关系

TreeMap的两种遍历方式

/*
 * 请编写程序,存储自定义对象到TreeMap集合中,并采用两种方式遍历.
 */

import java.util.Map.Entry;
import java.util.Comparator;
import java.util.Set;
import java.util.TreeMap;


public class TreeMapDemo {
	public static void main(String[] args) {
		//创建自定义对象
		Student s1 = new Student("曹雪芹",41);
		Student s2 = new Student("蒲松龄",39);
		Student s3 = new Student("李时珍",50);
		//使用TreeMap类中的比较器进行排序
		TreeMap<Student, String> tm = new TreeMap<Student,String>(new Comparator<Student>() {
			//重写Comparator的compare方法
			@Override
			public int compare(Student st1, Student st2) {
				// TODO Auto-generated method stub
				//比较年龄
				int num = st1.getAge()-st2.getAge();
				//比较姓名
				int num2 = (num==0)?st1.getName().compareTo(st2.getName()):num;
				return num2;
			}
				
		
		}		
				);
		//将键值对添加入TreeSet集合中
		tm.put(s3, "本草纲目");
		tm.put(s2, "聊斋志异");
		tm.put(s1, "红楼梦");
		//1.使用键值对对象遍历TreeMap集合
		//将TreeSet键值对对象存储到set集合中
		Set<Entry<Student, String>> entrySet = tm.entrySet();
		//用键值对对象获取key,value值
		for(Entry<Student, String> en :entrySet){
			Student key = en.getKey();
			String value = en.getValue();
			System.out.println(key.getName()+"---"+key.getAge()+"----"+value);
		}
		//2.根据获取到的key去获取value
		System.out.println("-----------------------------------------------------------");
		Set<Student> st = tm.keySet();
		//遍历
		for(Student sNum:st){
			System.out.println(sNum.getName()+"---"+sNum.getAge()+"---"+tm.get(sNum));
		}
			
	}
}
/*
 * 结果:
 蒲松龄---39----聊斋志异
曹雪芹---41----红楼梦
李时珍---50----本草纲目
-----------------------------------------------------------
蒲松龄---39---聊斋志异
曹雪芹---41---红楼梦
李时珍---50---本草纲目
 */

最后再举几个使用Map集合的例子

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*
 * 需求:统计字符串中每个字符出现的次数	"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
 * 
 * 要点:1.根据HashMap集合的特点去存储字符的出现次数
 * 2.对于HashMap的遍历方式进行学习与理解
 * 3.选用StringBuffer进行拼接,减少内存资源的消耗
 * 4.更优的方式是使用StringBuilder进行拼接,因为StringBuffer是线程安全的,拼接速度较慢。StringBuilder是线程不安全的,
 * 适用于单线程任务,速度更快
 */

public class HashMapTest {
	public static void main(String[] args) {
		//定义一个字符串
		String st = "aababcabcdabcde";
		//创建一个HashMap集合
		HashMap<Character,Integer> hs = new HashMap<Character,Integer>();
		//遍历字符串,将字符串添加到HashMap集合中去
		for(int i = 0;i<st.length();i++){
			char charAt = st.charAt(i);
			//將要查找的字符作為鍵,去HashMap中去查找
			Integer num = hs.get(charAt);
			//如果不存在,將其值num赋值为1
			if(num==null){
				hs.put(charAt, 1);
			}
			//如果已经存在该键,将该键的值+1,
			else{
				num++;
				hs.put(charAt, num);
			}
		}
		//测试HashMap中的结果
		//System.out.println(hs);
		//创建StringBuffer对象,按照要求进行拼接
		StringBuffer stb = new StringBuffer();
		//遍历HashMap集合,按照指定格式进行输出
		//将HashMap集合对对象存储到Set集合中
		Set<Entry<Character, Integer>> entrySet = hs.entrySet();
		//分别获取Set集合中的键值对对象的key,value值,然后进行拼接
		for( Entry<Character, Integer>  en:entrySet){
			stb.append(en.getKey()).append("(").append(en.getValue()).append(")");
		}
		//输出
		System.out.println(stb.toString());
	}
	
}
/*结果:
 * a(5)b(4)c(3)d(2)e(1)
 */

集合嵌套的使用

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/*集合嵌套实例:
 * HashMap的嵌套
 *明:
 *	李时珍 本草纲目   
 *清:
 *	曹雪芹 红楼梦
 *	蒲松龄 聊斋志异
 */
public class HashMapNest {
	public static void main(String[] args) {
		//创建嵌套HashMap集合对象
		HashMap<String,HashMap<String, String>> hm = new HashMap<String,HashMap<String,String>>();
		
		//创建明朝作者,书籍集合对象
		HashMap<String, String> hMing = new HashMap<String,String>();
		
		//添加明朝集合中的key,value值		
		hMing.put("李时珍", "本草纲目");		
		//创建清朝作者,书籍对象
		HashMap<String, String> hQing = new HashMap<String,String>();
		hQing.put("蒲松龄", "聊斋志异");
		hQing.put("曹雪芹", "红楼梦");
		//将小范围集合添加进大范围集合中
		hm.put("明", hMing);
		hm.put("清", hQing);
		//遍历集合
		//获取外集合键值对对象
		Set<Entry<String, HashMap<String, String>>> entrySet = hm.entrySet();
		for(Entry<String, HashMap<String, String>> en:entrySet){
			//获取键值
			String key1 = en.getKey();
			System.out.println(key1+":");
			//获取外集合value值(即内集合)
			HashMap<String,String> hm2 = en.getValue();
			//获取内集合键值对对象
			Set<Entry<String, String>> entrySet2 = hm2.entrySet();
			for(Entry<String, String> en2:entrySet2){
				//获取内集合键值
				String key2 = en2.getKey();
				System.out.println(key2+"---"+en2.getValue());
			}
			
		}
		
	}
}

/*
 清:
蒲松龄---聊斋志异
曹雪芹---红楼梦
明:
李时珍---本草纲目
 */



HashMap和HashSet的区别 

        HashMap 线程不安全 , 效率高 , 允许存在null值和null键

        Hashtable 线程安全, 效率低 , 不允许在null值和null键

Collections

                        集合工具类,该类中提供了很多操作集合的方法

public static <T> void sort(List<T> list): 排序,默认按照自然顺序

public static <T> int binarySearch(List<?> list,T key): 二分查找

public static <T> T max(Collection<?> coll): 获取最大值

public static void reverse(List<?> list): 反转

public static void shuffle(List<?> list): 随机置换

 


© 著作权归作者所有

共有 人打赏支持
centrald
粉丝 12
博文 112
码字总数 120823
作品 0
杭州
程序员
day18 java 语言中的Map集合

day18 java 语言中的Map集合 一、Map集合的概述: 学完了set集合与list集合以后,我们在学习Map集合,这个集合与前面的两种集合具有一定的区别,在存储值的方式就有区别了,他是以“键--->值...

孤独一夜
2017/10/22
0
0
写一个去重复的有效算法

有这样一个需求:一个List>的集合,map里存放users和telphones两个字段,内容如下: user1: user="张一,张二,张三,张四" telphone="11111,22222,33333,44444" user2: user="张一,张五...

hero00ok
2013/12/18
247
3
Android开发_Gson解析

//转换器 GsonBuilder builder = new GsonBuilder(); // 不转换没有 @Expose 注解的字段 builder.excludeFieldsWithoutExposeAnnotation(); Gson gson = builder.create(); //1、对象转strin......

zhangty0223
2013/08/31
0
0
更好的使用Java集合(四)

集合(List)可以快速地查找现有的元素。但是,要查看一个元素,需要有要查找元素的精确副本。这不是一种非常通用的查询方式。通常,如果知道某些键的信息,并想要查找与之对应的元素,则可以使...

杰克鹏仔
2016/03/17
122
0
Groovy(四)-布尔值,Lists,Arrays,Maps

译文:Groovy Language Documentation 布尔值 布尔值是一种用来表示真值:true和false的特殊数据类型。用这种数据类型可以设置简单的标志位来跟踪true/false情况。 布尔类型可以保存在变量中...

ZJ_Rocky
2017/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

docker多容器部署lnmp环境

环境:RHEL7.5 ip:192.168.10.102,主机名:lb02 一、创建web、数据库目录 web网站目录为:/wwwroot,属主属组:www [root@lb02 ~]# mkdir /wwwroot[root@lb02 ~]# useradd -s /sbin/nolo...

人在艹木中
19分钟前
0
0
eclipse运行springboot项目报错‘找不到或无法加载主类’

这是一个很烦躁的问题~,往往困住大家好长时间,然后各种百度。借此,咱将这个问题有可能产生的原因进行一下总结。若有不完善之处欢迎大家在下面留言指出~~ Duang!问题出现 然后开始尝试解决...

Code辉
40分钟前
0
0
springboot oauth2 跨域设置

@Overridepublic void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/security/**") .authentica......

昆虫大侠
42分钟前
0
0
08-利用思维导图梳理JavaSE-泛型

08-利用思维导图梳理JavaSE-泛型 主要内容 1.泛型的基本概念 1.1.定义 1.2.使用前提 1.3.使用泛型的好处 2.泛型的使用 2.1.泛型类定义 2.2.泛型对象定义 2.3.泛型中的构造方法 2.4.泛型方法的...

飞鱼说编程
44分钟前
0
0
Docker 部署 Spring Boot 项目指南

仅想在Docker里运行一个Spring Boot项目,捣鼓了许久。。。 本文主要适用于Windows环境下的Docker 一、运行环境 Windows 10 Maven 3.5 Docker 18.06.1-ce-win73 (19507) 二、创建Spring Boot...

AmosWang
49分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部