JavaSe基础XX17——常用对象API-集合框架_4

*01-常用对象API(集合框架-Map集合特点&常用方法)



Map集合使用率很高。


k1,v1 ------->k1,v2 新值替换旧值,返回v1

remove 会改变长度

Map:一次添加一对元素。Collection 一次添加一个元素。
Map也称为双列集合,Collection集合称为单列集合。
其实map集合中存储的就是键值对。 
map集合中必须保证键的唯一性。 


常用方法:
1,添加。
value put(key,value):返回前一个和key关联的值,如果没有返回null.


2,删除。
void  clear():清空map集合。
value remove(key):根据指定的key翻出这个键值对。 


3,判断。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();


4,获取。 
value get(key):通过键获取值,如果没有该键返回null。
当然可以通过返回null,来判断是否包含指定键。 
int size(): 获取键值对的个数。 

*02-常用对象API(集合框架-常用方法演示)




	public static void method(Map<Integer,String> map){//学号和姓名
		
		
		// 添加元素。
		System.out.println(map.put(8, "wangcai"));//null
		System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同键,值会覆盖。
		map.put(2,"zhangsan");
		map.put(7,"zhaoliu");
		
		
		//删除。
//		System.out.println("remove:"+map.remove(2));
		
		//判断。
//		System.out.println("containskey:"+map.containsKey(7));
		
		//获取。 
		System.out.println("get:"+map.get(6));
		
		
		System.out.println(map);
		
		Outer.Inner.show();
	}


*03-常用对象API(集合框架-重点方法keySet演示图解)

map没有迭代器




重点:



map集合就是双列集合。



*04-常用对象API(集合框架-重点方法entrySet演示图解)




	/*
		 * 通过Map转成set就可以迭代。
		 * 找到了另一个方法。entrySet。
		 * 该方法将键和值的映射关系作为对象存储到了Set集合中,而这个映射关系的类型就是Map.Entry类型(结婚证)
		 * 
		 * 
		 */
		Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
		
		Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
		
		while(it.hasNext()){
			Map.Entry<Integer, String> me = it.next();
			Integer key = me.getKey();
			String value = me.getValue();
			System.out.println(key+"::::"+value);
			
		}







*05-常用对象API(集合框架-方法values演示)

不要学号,只要姓名。




*06-常用对象API(集合框架-Map集合-常见子类对象)

Map常用的子类:
|--Hashtable :内部结构是哈希表,是同步的。不允许null作为键,null作为值。
|--Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合。
|--HashMap : 内部结构是哈希表,不是同步的。允许null作为键,null作为值。
|--TreeMap : 内部结构是二叉树,不是同步的。可以对Map集合中的键进行排序。 


*07-常用对象API(集合框架-Map集合-HashMap存储自定义对象)

一旦事务繁杂了,就要封装对象。

* 将学生对象和学生的归属地通过键与值存储到map集合中。

*/



Hashmap打印出来的是无序的。


Hash表要保证两个。hashcode和equals方法。

在Person类中,复写hashcode和equals方法之后,再运行,结果:



相同结果就会覆盖掉了。


// Set<Student> keySet = hm.keySet();
// Iterator<Student> it = keySet.iterator();

Iterator<Student> it = hm.keySet().iterator();


*08-常用对象API(集合框架-Map集合-TreeMap存储自定义对象)

对学生进行排序。

学生具备比较方法,

能排序的是Tree



如果想按姓名排序,就必须弄出一个比较器来。




*09-常用对象API(集合框架-Map集合-LinkedHashMap&关联源码)


注意输出结果,如果存的是数字的话,按照它的hashcode算法,算出来的是一样的,所以看起来的有序的。


有序:

排序:

hashset无序是指存和取的顺序不一致。

treeset无序也是指存和取的顺序不一致,只是输出结果是安装一定的排列顺序输出。


如果希望,存和取的顺序一样。

就用HashMap的子类,LinkedHashMap可以实现。



第三方API工具 + 源代码src.


*10-常用对象API(集合框架-Map集合练习-记录字母次数思路)

 

* 练习:
 * "fdgavcbsacdfs" 获取该字符串中,每一个字母出现的次数。
 * 要求打印结果是:a(2)b(1)...;

映射——数组也是,一方是按顺序排列的。

/*
 * 练习:
 * "fdgavcbsacdfs" 获取该字符串中,每一个字母出现的次数。
 * 要求打印结果是:a(2)b(1)...;
 * 思路:
 * 对于结果的分析发现,字母和次数之间存在着映射的关系。而且这种关系很多。
 * 很多就需要存储,能存储映射关系的容器有数组和Map集合。
 * 关系一方式有序编号吗?没有!
 * 那就是使用Map集合。 又发现可以保证唯一性的一方具备着顺序如 a b c ...
 * 所以可以使用TreeMap集合。
 * 
 * 这个集合最终应该存储的是字母和次数的对应关系。 
 * 
 * 1,因为操作的是字符串中的字母,所以先将字符串变成字符数组。
 * 2,遍历字符数组,用每一个字母作为键去查Map集合这个表。
 * 如果该字母键不存在,就将该字母作为键 1作为值存储到map集合中。
 * 如果该字母键存在,就将该字母键对应值取出并+1,在将该字母和+1后的值存储到map集合中,
 * 键相同值会覆盖。这样就记录住了该字母的次数.
 * 3,遍历结束,map集合就记录所有字母的出现的次数。oy.
 * 
 * 
 */

*11-常用对象API(集合框架-Map集合练习-记录字母次数代码)


public class MapTest {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		
		String str = "fdg+avAdc  bs5dDa9c-dfs";
		
		String s = getCharCount(str);
		
		System.out.println(s);
		
	}

	public static String getCharCount(String str) {
		
		
		//将字符串变成字符数组 
		char[] chs = str.toCharArray();
		
		//定义map集合表。
		Map<Character,Integer> map = new TreeMap<Character,Integer>();
		
		for (int i = 0; i < chs.length; i++) {
			
			if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))
//			if(!(Character.toLowerCase(chs[i])>='a' && Character.toLowerCase(chs[i])<='z'))
				continue;
			
			//将数组中的字母作为键去查map表。			
			Integer value = map.get(chs[i]);
			
			int count = 1;
			
			//判断值是否为null.
			if(value!=null){
				count = value+1;
			}
//			count++;
			map.put(chs[i], count);
			/*
			if(value==null){
				map.put(chs[i], 1);
			}else{
				map.put(chs[i], value+1);
			}
			*/
		}
		
		
		
		
		
		return mapToString(map);
	}

	private static String mapToString(Map<Character, Integer> map) {
		
		StringBuilder sb = new StringBuilder();
		
		Iterator<Character> it = map.keySet().iterator();
		
		while(it.hasNext()){
			Character key = it.next();
			Integer value = map.get(key);
			
			sb.append(key+"("+value+")");
		}
		
		return sb.toString();
	}

}

*12-常用对象API(集合框架-Map集合练习-Map查表法)


package cn.itcast.p1.map.test;

import java.util.HashMap;
import java.util.Map;

public class MapTest2 {

	/**
	 * @param args
	 */
	public static void main(String[] args) {

		/*
		 * Map在有映射关系时,可以优先考虑。
		 * 
		 * 在查表法中的应用较为多见。
		 */
		
		String week = getWeek(1);
		System.out.println(week);
		
		System.out.println(getWeekByMap(week));
	}
	public static String getWeekByMap(String week){
		
		Map<String,String> map = new HashMap<String,String>();
		
		map.put("星期一","Mon");
		map.put("星期二","Tus");
		map.put("星期三","Wes");
		map.put("星期日","Sun");
		map.put("星期天","Sun");
		
		return map.get(week);
	}
	
	
	public static String getWeek(int week){
		
		if(week<1 || week>7)
			throw new RuntimeException("没有对应的星期,请您重新输入");
		
		String[] weeks = {"","星期一","星期二"};
		
		return weeks[week];
	}

}




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值