黑马程序员------毕老师视频笔记第13-17天------集合Map

 ---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

Map和Collection一样,是集合的顶层接口,和Collection没有直观上的联系,但是内在其实是有联系的。

public interface Map<K,V>

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

Collection叫单列集合,Map叫双列集合。

 

1.添加

V put(K key,V value)

 

2.删除

void clear()

V remove(Object key)

 

3.判断

boolean containsKey(Object key)

boolean containsValue(Object Value)

boolean isEmpty()

 

4.获取

Set<Map.Entry<K,V>> entrySet()

Set<K> keyset()

V get(Object key)

int size()

Collection<V> values()

 

Map

         |---HashMap,底层是哈希表数据结构,可以存入null键null值,不同步,效率高

         |---Hashtable,底层是哈希表数据结构,不可以存入null键null值,同步,效率低

         |---TreeMap,底层是二叉树数据结构,不同步,可以用于给Map集合中的键排序

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

 

Map集合的两种取出方式:

1.keySet:将Map中所有的键存入到Set集合,因为Set具备迭代器,所以可以用迭代方式取出所有的键,有了键就可以根据Map的get方法,获取每一个键对应的值,返回Set<K>

2.entrySet:返回Set<Map.Entry<K,V>>,取出的是Map集合中的映射关系,方法返回的是一个Set,Set中元素的类型是Map.Entry<K,V>,MapEntry是一个接口,它有getKey方法和getValue方法,取出方式很方便

 

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 abstract Object getKey(){};
		public abstract Object getValue(){};
}
}

Map演示:

import java.util.*;
class MapDemo
{
	public static void main (String [] args)
	{
		Map<String,String> m = new HashMap<String,String>();
		System.out.println(m.put("aaa","11"));
		System.out.println(m.put("aaa","12"));
		m.put("bbb","22");
		m.put("ccc","25");
		m.put("ddd","22");
		m.put("eee","23");
		System.out.println(m);
		
		System.out.println(m.remove("ddd"));
		System.out.println(m);

		System.out.println(m.containsKey("fff"));
		System.out.println(m.containsValue("22"));
		System.out.println(m.isEmpty());
		System.out.println(m);

		System.out.println(m.get("bbb"));
		System.out.println(m.size());
		System.out.println(m.values());
		System.out.println(m.keySet());
		System.out.println(m.entrySet());
	}
}


示例:“dfjoeinvglasdknfljasldho”获对每一个字母在该字符串中出现的次数

希望打印结果: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 Demo
{
	public static void main (String [] args)
	{
		String s = "asjhflasdhfha";
		System.out.println(s);
		func(s);
	}
	public static void func(String str)
	{
		char[] chs = str.toCharArray();
		TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();
		int count = 1;
		for (int i=0; i<chs.length; i++)
		{
			if (tm.get(chs[i])==null)
			{
				tm.put(chs[i],count);
				continue;
			}
			tm.put(chs[i],tm.get(chs[i])+1);
		}
		Iterator<Character> it = tm.keySet().iterator();
		while (it.hasNext())
		{
			char ch = it.next();
			System.out.print(ch+"("+tm.get(ch)+") ");
		}
	}
}

 

Collections工具类

sort

max

binarySearch

fill

reverseOrder

SynList

 

Arrays工具类

数组变集合

把数组变为集合的好处:可以使用集合的思想和方法来操作数组中的元素

注意:将集合变成数组,不可以使用集合的增删方法,因为数组的长度是固定的

集合变数组

1.指定类型的数组要定义多长呢?

当指定的数组长度小于集合的size,那么该方法内部会创建一个新的数组,长度为集合的size,当指定的数组长度大于集合的size,就不会创建新的数组,而是使用传递进来的数组,所以创建一个刚刚好的数组最优。

2.为什么要将集合转化为数组?

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

 

增强for循环,jdk1.5,简化书写

格式

for(数据类型 变量名 : 被遍历的集合Collection或者数组){}

底层原理还是迭代器

局限性:对集合进行遍历,只能取出,不能修改,迭代器除了遍历,还可以进行remove集合中元素的动作,如果是ListIterator,还可以在遍历过程中对集合进行增删改查的动作

传统for循环和高级for循环有什么区别呢?

高级for有一个局限性,必须有被遍历的目标。比如想打印100次”hello Word”

建议在遍历数组的时候,还是使用传统for,因为传统for可以定义角标

 

 

可变参数,jdk1.5以后出现的新特性

其实就是数组参数的简写形式,不用每一次手动的建立数组对象,只要将要操作的元素作为参数传递即可,隐式的将这些参数封装成了数组。

在使用可变参数新特性的时候,可变参数一定要定义在参数列表的最后面。

 

静态导入,jdk1.5之后的新特性

import static java.util.Array.*;//导入的是Arrays中的所有静态成员

当类名重名的时候,需要指定具体的包名,同理,当方法重名时,需要制定具备所属对象的类

 

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值