黑马程序员 java集合笔记(一)

-------android培训 、java培训、期待与您交流! ----------

Map接口 也是一个集合  集合的特点,该集合存储键值对,一对一对往里存,而且要保证键的唯一性。


1 添加
 put(K key, V value) 
putAll(Map<? extends K,? extends V> m) 
2 删除
clear
3 判断
containsKey(Object key) 
containsValue(Object value) 
isEmpty() 
4 获取
get(Object key) 
size() 
values() 
Map
|-- Hashtable 底层是哈希表数据结构,不可以存入null键null值 该集合是线程同步的。效率低 JDK1.0
|-- HashMap 底层是哈希表数据结构, 允许使用null值和null键, 该集合是不同步的。效率高 JDK1.2
|--TreeMap 底层是二叉树数据结构, 线程不同步,可以用于给Map集合中的键进行排序

和Set很像 其实Set集合底层就是使用了Map集合。

import java.util.*;
class MapDemo 
{
	public static void main(String[] args) 
	{	
		Map<String,String> map = new HashMap<String,String>();
		//add
		//map.put("01","zhangsan1");
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");
		// 当存入相同键的时候,新的键值会替换老的键值,put方法返回老的那个值。
		System.out.println("put : "+map.put("01","zhangsan1"));
		System.out.println("put : "+map.put("01","王五"));
	
		System.out.println("containsKey : "+map.containsKey("02"));
		System.out.println("remove : "+map.remove("02"));//删
		System.out.println("get : "+map.get("01"));
		// 可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断。
		map.put(null,"hash");
		System.out.println("get : "+map.get(null));
		System.out.println(map);//打印map集合
		//获取map集合的所有值
		Collection<String> coll = map.values();
		System.out.println(coll);
	}
}
map 集合的两种取出方式
1. keySet: 将MAP中的所有键值存入到SET集合,因为set具备迭代器,所有可
以迭代方式取出的所有键,在根据get方法,获取每一个键对象的值。


Map集合的取出原理, 将map集合转成set集合,再通过迭代器取出
2.Set<Map.Entry<k,v>> entrySet: 将map集合中的映射关系存入到set集合中,
而这个关系的数据类型就是Map.Entry。


Map.Entry 其实Entry也是一个借口,它是Map借口中的一个内部借口

import java.util.*;

interface Map
{
	public static interface Entry
	{
		public abstract Object getKey();
		public abstract Object getValue();

	}
}
class HashMap implements Map.Entry
{	
	class Hah implements Map.Entry
	{
		public Object getKey(){};
	    public Object getValue(){};
	}
	
}



class MapDemo2 
{
	public static void main(String[] args) 
	{
		Map<String,String> map = new HashMap<String,String>();
		map.put("01","zhangsan1");
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");
		map.put("04","zhangsan4");
		
		//将Map集合中的映射关系取出,存入到Set集合中
		Set<Map.Entry<String,String>> entrySet = map.entrySet();

		Iterator<Map.Entry<String,String>> it = entrySet.iterator();
		while (it.hasNext())
		{
			Map.Entry<String,String> me = it.next();
			String key = me.getKey();
			String value = me.getValue();
			System.out.println("key: "+key+",value"+value);

		}

/*

		//先后去map集合的所有键的set集合,KeySet();
		Set<String>  keySet = map.keySet();
		//有了Set集合,就可以获取其迭代器
		Iterator<String> it = keySet.iterator();
		while (it.hasNext())
		{
			String key = it.next();
			//有了键就可以通过map集合的get方法获取其对应的值
			String value = map.get(key);
			System.out.println("key: "+key+",value"+value);
		}

		*/
	}
}

一个例子

每一个学生都有对应的归属地。
学生Student 地址String 
学生属性 姓名 年龄
注意 姓名和年龄相同的视为同一个学生,保证学生的唯一性
1 描述学生,
2 定义Map容器,将学生作为键,地址作为值 存入
3 获取map集合中的元素。

import java.util.*;
class Student implements Comparable<Student>
{
	private String name;
	private int age;
	Student(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public int getAge()
	{
		return age;
	}
	public String toString()
	{
		return name+":"+age;
	}
	public int compareTo(Student s)
	{
		int  num = new Integer(this.age).compareTo(new Integer(s.age));

		if(num==0)
			return this.name.compareTo(s.name);
		return num;
	}
	public int hashCode()
	{
		return name.hashCode()+age*34;
	}
	public boolean equals(Object obj)
	{
		if(!(obj instanceof Student))
			throw new ClassCastException("类型不匹配");
		Student s = (Student)obj;

		return this.name.equals(s.name)&& this.age == s.age;
	}

}
class  MapTest
{
	public static void main(String[] args) 
	{
		HashMap<Student,String> hm = new HashMap<Student,String>();
		hm.put(new Student("lisi",21),"beijing");
		hm.put(new Student("lisi2",22),"shanghai");
		hm.put(new Student("lisi3",23),"nanjing");
		hm.put(new Student("lisi4",24),"wuahn");
		//第一种取出方式 keySet
		Set<Student> keySet = hm.keySet();
		Iterator<Student> it = keySet.iterator();

		while (it.hasNext())
		{
			Student stu = it.next();
			String addr = hm.get(stu);
			System.out.println(stu+"....."+addr);
		}
		//第二种取出方式 entrySet
		Set<Map.Entry<Student,String>> entrySet = hm.entrySet();

		Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();
		while (iter.hasNext())
		{
			Map.Entry<Student,String> me = iter.next();
			Student stu = me.getKey();
			String addr = me.getValue();
			System.out.println(stu+"...+-+-.."+addr);
		}
	}
}
需求,对学生对象的年龄进行升序排序
因为数据时以键值对形式存在的,所以,要使用可以排序的
Map集合,TreeMap。

import java.util.*;
class MapTest2 
{
	public static void main(String[] args) 
	{
		TreeMap<Student,String> tm = new TreeMap<Student,String>();
		tm.put(new Student("lisi",23),"beijing");
		tm.put(new Student("lisi2",21),"shanghai");
		tm.put(new Student("lisi3",22),"nanjing");
		tm.put(new Student("lisi4",24),"wuahn");
		Set<Map.Entry<Student,String>> entrySet = tm.entrySet();
		Iterator<Map.Entry<Student,String>> it = entrySet.iterator();
		while (it.hasNext())
		{
			Map.Entry<Student,String> me = it.next();
			Student stu = me.getKey();
			String addr = me.getValue();

			System.out.println(stu+"......"+addr);
		}


		
	}
}

练习
“asdfghjkloiuytrdasdresadf”获取该字符串中的字母出现的次数

希望打印 a(3)s(3)...


通过结果发现,每一个字母都有对应的次数。说明字母和次数之间有映射关系。
注意了,当发现有映射关系时,可以选择map集合

因为map集合中存放的就是映射关系。


什么时候使用map集合呢?
当数据之间存在着映射关系时,就要先想到map集合。
大致过程, 第一次用字母a作为键去找集合,那么集合没有a这个键,所以也没有对应的次数
返回null 如果为null 就将a字母和1存入集合。如果指定的键已经存在,说明有对应的次数

就将对应的次数取出,并自增后再重新存入集合。


思路 
第一步 将字符串转换成字符数组,因为要对每一个字母进行操作
第二步 定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。
第三步 遍历字符数组,将每一个字母作为键去查map集合,如果返回空就将该字母和1
存入到map集合中 如果返回不是空,表示该字母在map集合中已经存在并有对
应的次数,那么就获取该次数进行自增,然后将该字母和子增厚的次数存入到
map集合中,覆盖掉原来键所对应的值。
第四步 将map集合中的数据,变成指定的字符串形式返回。

import java.util.*;
class MapTest3 
{
	public static void main(String[] args) 
	{	
	     String s =	charCount("sdasdfsdfweasd");

		System.out.println(s);
	}
	public static String charCount(String str)
	{
		char[] chs = str.toCharArray();
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
		for (int x=0;x<chs.length ;x++ )
		{
			Integer value = tm.get(chs[x]);
			if (value==null)
			{
				tm.put(chs[x],1);
			}
			else
			{
				value = value + 1;
				tm.put(chs[x],value);
			}
		}
		//System.out.println(tm);
		StringBuilder sb = new StringBuilder();
		Set<Map.Entry<Character,Integer>> entry = tm.entrySet();
		Iterator <Map.Entry<Character,Integer>> it = entry.iterator();
		while (it.hasNext())
		{
			Map.Entry<Character,Integer> me = it.next();
			Character ch = me.getKey();
			Integer value = me.getValue();
			sb.append(ch+"("+value+")");
		}



		return sb.toString();
	}
}
Map扩展知识
map集合被使用时因为具备映射关系
一个学校有多个教室,每一个教室都有名称。
就如 黑马是一个学校, 学校里面有预热班和就业班
每个班里面有不一样的学生
比如
预热班 01 号 张三
预热班 02 号 李四 
就业班 01 号 王五
就业班 02 号 赵六
把这样的信息存到map里面 分析映射关系 预热班跟张三对应 学生信息里面学号01跟张三对应
那么这种对应关系 可以表示为 班级 ----<学生>  学生里面是学号对应姓名
首先创建两个班级 里面存学生
然后再创建一个学校 里面放两个班级。

再将班级和学生获取出来

import java.util.*;
class Student
{
	private String id;
	private String name;
	Student(String id,String name)
	{
		this.id=id;
		this.name = name;
	}
	public String toString()
	{
		return id+":"+name;
	}
}
class  kuozhan
{
	public static void demo()
	{
		HashMap<String,List<Student>> hm = new HashMap<String,List<Student>>(); //存一个班级名 对应一个学生集合
		List<Student> yure = new ArrayList<Student>();//创建一个预热班集合创建一个就业班集合
		List<Student> jiuye = new ArrayList<Student>();
		//把班级放到学校集合里面
		hm.put("预热班",yure);
		hm.put("就业班",jiuye);
		//把学生添加的班级里面
		yure.add(new Student("01","zhangsan"));
		yure.add(new Student("02","lisi"));
		jiuye.add(new Student("01","wangwu"));
		jiuye.add(new Student("02","zhaosi"));

		//把班级名字和里面的学生遍历出来
		Iterator<String> it = hm.keySet().iterator();
		while (it.hasNext())
		{
			String roomName = it.next();
			List<Student> room = hm.get(roomName);
			System.out.println(roomName);
			getInfos(room);//遍历出班级名字后提出里面的学生
		}

	}
	public static void getInfos(List<Student> list)
	{
		Iterator<Student> it =list.iterator();
		while (it.hasNext())
		{
			Student s = it.next();
			System.out.println(s);
		}
	}
	public static void main(String[] args) 
	{
		/*
		下面是基础的方法就出来了   我们现在讲学生提炼出来,
		因为 学生的内容有很多 而且学生之间还没有映射关系,所以可以不用map集合 用collection集合
		collection集合里面有俩一个是list集合一个是set集合 要是没有实际需求保证唯一的话 所以可以选择list集合
		 所以准备下面制作一个demo方法来重新设置。		
		*/
		demo(); //上面方法写完了 调用一下  这就成了
		/*
		HashMap<String,String> jiuye = new HashMap<String,String>(); //创建就业班
		HashMap<String,String> yure = new HashMap<String,String>();//预热班
		//创建学校
		HashMap<String,HashMap<String,String>> hm = new HashMap<String,HashMap<String,String>>();
		//创建完学校存班级
		hm.put("yureban",yure);
		hm.put("jiuyeban",jiuye);
		//每个班里面放学生
		yure.put("01","zhangsan");
		yure.put("02","lisi");

		jiuye.put("01","wangwu");
		jiuye.put("02","naliu");
		//遍历czbk集合,获取所有的教室
		Iterator<String> it = hm.keySet().iterator();
		while (it.hasNext())
		{
			String roomName = it.next();//roomName存的是第一个键值
			HashMap<String,String> room = hm.get(roomName);//根据第一个键值找映射
			System.out.println(roomName);//
			getStudentInfo(room);//映射值就是教室名字,通过这个方法调用教室中的学生。
		}


		//获取班级的学生

		//getStudentInfo(jiuye);
		//getStudentInfo(yure);
		//System.out.println("Hello World!");
		*/	
	}
	//获取学生的方法
	public static void getStudentInfo(HashMap<String,String> roomMap)
	{
		Iterator<String> it = roomMap.keySet().iterator();
		while (it.hasNext())
		{
			String id = it.next();
			String name = roomMap.get(id);
			System.out.println(id+":"+name);
		}
	}
}


------- android培训  、 java培训 、期待与您交流! ----------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值