黑马程序员_学习笔记框架(II)及工具类


------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!-------



Map集合

 

接口Map<K,V> 存入键值对。

Map集合特点:

该集合存储键值对,一对一对往里存,而且要保证键的唯一性。

Collection单列集合

Map双列集合

 

Map方法:

1,  添加

         put()

         putAll()

2,  删除

clear()

remove()

3,  判断

containsValue()

containsKey()

4,  获取

         get()

         size()

         values()

 

         entrySet()

         keyset()

 

Map集合的子类:

         |--Hashtable:底层是哈希表数据结构,不能存入nullnull值,该集合是线程同步jdk1.0

         |--HashMap:底层是哈希表数据结构,允许使用nullnull值,该集合是不同步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>();

		//添加元素,添加元素,如果出现添加时,相同的键。那么后添加的值会覆盖原有键对应值。
		//并put方法会返回被覆盖的值。
		System.out.println("put:"+map.put("01","zhangsan1"));
		System.out.println("put:"+map.put("01","wnagwu"));
		map.put("02","zhangsan2");
		map.put("03","zhangsan3");

		System.out.println("containsKey:"+map.containsKey("022"));
		//System.out.println("remove:"+map.remove("02"));

		System.out.println("get:"+map.get("023"));

		map.put("04",null);
		System.out.println("get:"+map.get("04"));
		//可以通过get方法的返回值来判断一个键是否存在。通过返回null来判断。


		
		//获取map集合中所有的值。
		Collection<String> coll = map.values();

		System.out.println(coll);
		System.out.println(map);


	}
}

Map集合的两种取出方式:

1、Set<k> keySet:将map中所有的键存入到Set集合,因为set集合具备迭代器,所以可以使用迭代取出所有键,获取每个键对应的值

 

Map集合的取出原理:将map集合转成set集合。在通过迭代器取出。

 

2、Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中,

                                     而这个关系的数据类型就是:Map.Entry

 

                                     Entry其实就是Map中的一个static内部接口。

                                     为什么要定义在内部呢?

                                     因为只有有了Map集合,有了键值对,才会有键值的映射关系。

                                     关系属于Map集合中的一个内部事物。

                                     而且该事物在直接访问Map集合中的元素。

 

*/

import java.util.*;


class MapDemo2 
{
	public static void main(String[] args) 
	{
		Map<String,String> map = new HashMap<String,String>();

		map.put("02","zhangsan2");
		map.put("03","zhangsan3");
		map.put("01","zhangsan1");
		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+":"+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);
		}

		*/

	}
}


/*


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

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

	}
}

class HashMap implements Map
{
	class Hahs implements Map.Entry
	{
		public  Object getKey(){}
		public  Object getValue(){}
	}
	
}
*/

TreeMap

对象类要覆写equals(),hashCode(),实现接口Comparable

什么使用map集合呢?

当数据之间存在这映射关系时,就要先想map集合。

 

 

/*

练习:

"sdfgzxcvasdfxcvdf"获取该字符串中的字母出现的次数。

 

希望打印结果:a(1)c(2).....

 

通过结果发现,每一个字母都有对应的次数。

说明字母和次数之间都有映射关系。

 

注意了,当发现有映射关系时,可以选择map集合。

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

 

 

什么使用map集合呢?

当数据之间存在这映射关系时,就要先想map集合。

 

思路:

1,将字符串转换成字符数组。因为要对每一个字母进行操作。

 

2,定义一个map集合,因为打印结果的字母有顺序,所以使用treemap集合。

 

3,遍历字符数组。

         将每一个字母作为键去查map集合。

         如果返回null,将该字母和1存入到map集合中。

         如果返回不是null,说明该字母在map集合已经存在并有对应次数。

         那么就获取该次数并进行自增。,然后将该字母和自增后的次数存入到map集合中。覆盖调用原理键所对应的值。

 

4,将map集合中的数据变成指定的字符串形式返回。


*/
import java.util.*;
class  MapTest3
{
	public static void main(String[] args) 
	{
		String s= charCount("ak+abAf1c,dCkaAbc-defa");
		System.out.println(s);
	}
	
	public static String charCount(String str)
	{
		char[] chs = str.toCharArray();

		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

		
		int count = 0;
		for(int x=0; x<chs.length; x++)
		{
			

			if(!(chs[x]>='a' && chs[x]<='z' || chs[x]>='A' && chs[x]<='Z'))
				continue;

			Integer value = tm.get(chs[x]);

			
			if(value!=null)
				count = value;
			count++;
			tm.put(chs[x],count);//直接往集合中存储字符和数字,为什么可以,因为自动装箱。

			count = 0;
			/*
			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>> entrySet = tm.entrySet();
		Iterator<Map.Entry<Character,Integer>>  it = entrySet.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();
	}

}

思考:上面程序有一个局限性,当向字符串中出现“\n,\r”等特殊字符时,程序并不能读取其个数。

可以先将字符串中的所有“\”字符去除。

 

HashMap嵌套,在Map中嵌套HashMap或Collection。

 

Collections:框架工具类

Collections.reverseOrder()逆转排序

swap():置换列表元素

shuffle():将集合中元素重新随机排放

 

1、数组变集合

Arrays:用于操作数组的工具类

asList():将数组变成list集合

 

把数组变成list集合的好处:可以使用集合的思想来操作数组中的元素。

注意:将数组变成集合,不可以使用集合的增删方法(contains、get、indexOf、subList)

 

如果数组中的元素都是对象。那么变成集合时,数组中的元素就直接转成集合中的元素。

如果数组中的元素都是基本数据类型,那么会将该数组作为集合中的元素存在。

 

2、集合变数组

Collection的方法toArray()

1,指定类型的数组到底要定义多长呢?

                   当指定类型的数组长度小于了集合的size,那么该方法内部会创建一个新的数组。长度为集合的size。

                   当指定类型的数组长度大于了集合的size,就不会新创建了数组。而是使用传递进来的数组。

                   所以创建一个刚刚好的数组最优。

                  

 

2,为什么要将集合变数组?

                   为了限定对元素的操作。不需要进行增删了。



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值