黑马程序员——Java集合之Map

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

一、Map

1:特点

将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 

2:Map

|—Hashtable:底层是哈希表数据结构,是线程同步的。不可以存储null键,null值。

|—Properties:用来存储键值对型的配置文件的信息,可以和IO技术相结合.

|—HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值

替代了Hashtable。

|—TreeMap:底层是二叉树结构,可以对map集合中的键进行指定顺序的排序。

3:Map集合和Collection集合的区别?

a: Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。

可以把这个理解为:夫妻对。也称为双列集合

b: Collection集合存储元素是单独出现的,Collection的子Set是唯一的,List是可重复的。

可以把这个理解为:光棍(11.11)。也称为单列集合

注意事项:Map集合的数据结构值针对键有效,跟值无关。Collection集合的数据结构是针对元素有效。

4:功能

A:添加功能

V put(K key,V value):添加元素。如果键是第一次存储,就直接存储元素,返回null;

如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

B:删除功能

void clear():移除所有的键值对元素

V remove(Object key):根据键删除键值对元素,并把值返回

C:判断功能

boolean containsKey(Object key):判断集合是否包含指定的键

boolean containsValue(Object value):判断集合是否包含指定的值

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

D:获取功能

Set<Map.Entry<K,V>> entrySet():返回Map所包含的键值对对象所组成的Set集合,

每个集合都是Map.Entry对象(Entry是Map内部类)。

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

Set<K> keySet():获取集合中所有键的集合

Collection<V> values():获取集合中所有值的集合

E:长度功能

int size():返回集合中的键值对的对数

5:Map集合的遍历

A:键找值

a:获取所有键的集合

b:遍历键的集合,得到每一个键

c:根据键到集合中去找值

B:键值对对象找键和值

a:获取所有的键值对对象的集合

b:遍历键值对对象的集合,获取每一个键值对对象

c:根据键值对对象去获取键和值

Map<String,String> hm = new HashMap<String,String>();
			
hm.put("it002","hello");
hm.put("it003","world");
hm.put("it001","java");
			
//方式1 键找值
Set<String> set = hm.keySet();
for(String key : set) {
	String value = hm.get(key);
	System.out.println(key+"---"+value);
}
			
//方式2 键值对对象找键和值
Set<Map.Entry<String,String>> set2 = hm.entrySet();
for(Map.Entry<String,String> me : set2) {
	String key = me.getKey();
	String value = me.getValue();
	System.out.println(key+"---"+value);
}


二、HashMap & TreeMap

1:HashMap是基于哈希表的Map接口实现。 哈希表的作用是用来保证键的唯一性的。

// 创建集合对象
HashMap<Integer, String> hm = new HashMap<Integer, String>();

hm.put(27, "Donald");
hm.put(30, "Joy");
hm.put(28, "Lukas");
hm.put(29, "Joy");
hm.put(27, "Donald");

// 遍历
Set<Integer> set = hm.keySet();
for (Integer key : set) {
	String value = hm.get(key);//根据键获取值
	System.out.println(key + "---" + value);//27---Donald 28---Lukas 29---Donald 30---Joy                                                        //<span style="font-family: Arial, Helvetica, sans-serif;">无序无重复</span>
}
2: LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。

由哈希表保证键的唯一性;由链表保证键盘的有序(存储和取出的顺序一致)。

// 创建集合对象
LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();

// 创建并添加元素
hm.put("2345", "hello");
hm.put("1234", "world");
hm.put("3456", "java");
hm.put("1234", "javaee");
hm.put("3456", "android");

// 遍历
Set<String> set = hm.keySet();
for (String key : set) {
	String value = hm.get(key);
	System.out.println(key + "---" + value);//有序输出
3:TreeMap 是基于红黑树的Map接口的实现。

获取字符串中每一个字母出现的次数

public static void main(String[] args) {
	// 定义一个字符串(可以改进为键盘录入)
	Scanner sc = new Scanner(System.in);
	System.out.println("请输入一个字符串:");
	String line = sc.nextLine();

	// 定义一个TreeMap集合
	TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();
	
	//把字符串转换为字符数组
	char[] chs = line.toCharArray();
	
	//遍历字符数组,得到每一个字符
	for(char ch : chs){
		//拿刚才得到的字符作为键到集合中去找值,看返回值
		Integer i =  tm.get(ch);
		
		//是null:说明该键不存在,就把该字符作为键,1作为值存储
		if(i == null){
			tm.put(ch, 1);
		}else {
			//不是null:说明该键存在,就把值加1,然后重写存储该键和值
			i++;
			tm.put(ch,i);
		}
	}
	
	//定义字符串缓冲区变量
	StringBuilder sb=  new StringBuilder();
	
	//遍历集合,得到键和值,进行按照要求拼接
	Set<Character> set = tm.keySet();
	for(Character key : set){
		Integer value = tm.get(key);
		sb.append(key).append("(").append(value).append(")");
	}
	
	//把字符串缓冲区转换为字符串输出
	String result = sb.toString();
	System.out.println("result:"+result);
}

录入:aababcabcdabcde

结果:a(5)b(4)c(3)d(2)e(1)


三、Collections

是针对集合进行操作的工具类,都是静态方法。

1:常见方法

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):随机置换

2:Collection和Collections的区别?

A: Collections是个java.util下的类,是针对集合类的一个工具类,提供一系列静态方法,实现对集合的查找、排序、替换、线程安全化(将非同步的集合转换成同步的)等操作。

B: Collection是个java.util下的接口,它是各种集合结构的父接口,继承于它的接口主要有Set和List,提供了关于集合的一些操作,如插入、删除、判断一个元素是否其成员、遍历等。

3:模拟发牌

思路:

A:创建一个HashMap集合

B:创建一个ArrayList集合

C:创建花色数组和点数数组

D:从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可。

E:洗牌(洗的是编号)

F:发牌(发的也是编号,为了保证编号是排序的,就创建TreeSet集合接收)

G:看牌(遍历TreeSet集合,获取编号,到HashMap集合找对应的牌)

//创建一个HashMap集合
HashMap<Integer, String> hm = new HashMap<Integer, String>();
//创建一个ArrayList集合
ArrayList<Integer> array = new ArrayList<Integer>();

//创建花色数组和点数数组
//定义一个花色数组
String[] colors = {"♠","♣","♡","♢"};
//定义一个点数数组
String[] numbers = {"3","4","5","6","7","8","9",
		"10","J","Q","K","A","2"};

//从0开始往HashMap里面存储编号,并存储对应的牌,同时往ArrayList里面存储编号即可
int index = 0;
for(String number : numbers){
	for(String color : colors){
		String poker = color.concat(number);
		hm.put(index, poker);
		array.add(index);
		index++;
	}
}
hm.put(index,"小王");
array.add(index);
index++;
hm.put(index, "大王");
array.add(index);

//洗牌
Collections.shuffle(array);
//发牌
TreeSet<Integer> firstPerson = new TreeSet<Integer>();
TreeSet<Integer> secondPerson = new TreeSet<Integer>();
TreeSet<Integer> thirdPerson = new TreeSet<Integer>();
TreeSet<Integer> diPai = new TreeSet<Integer>();

for(int x=0; x<array.size(); x++){
	if(x >= array.size() - 3){
		diPai.add(array.get(x));
	}else if(x%3 == 0){
		firstPerson.add(array.get(x));
	}else if(x%3 == 1){
		secondPerson.add(array.get(x));
	}else if(x%3 == 2){
		thirdPerson.add(array.get(x));
	}
}


//看牌
lookPoker("Donald",firstPerson,hm);
lookPoker("Joy",secondPerson,hm);
lookPoker("Lucy",thirdPerson,hm);
lookPoker("底牌",diPai,hm);


}
//看牌的功能
public static void lookPoker(String name,TreeSet<Integer> ts, 
	HashMap<Integer, String> hm){
System.out.print(name + "的牌是:");
for(Integer key : ts){
	String value = hm.get(key);
	System.out.print(value + " ");
}
System.out.println();

四、使用集合的技巧

1:看到Array就是数组结构,有角标,查询速度很快。

2:看到link就是链表结构:增删速度快,而且有特有方法。addFirst; addLast;removeFirst(); removeLast();getFirst();getLast();

3:看到hash就是哈希表,就要想要哈希值,就要想到唯一性,就要想到存入到该结构的中的元素必须覆盖hashCode,equals方法。

4:看到tree就是二叉树,就要想到排序,就想要用到比较。

比较的两种方式:

一个是Comparable:覆盖compareTo方法;

一个是Comparator:覆盖compare方法。

5:LinkedHashSet,LinkedHashMap:这两个集合可以保证哈希表有存入顺序和取出顺序一致,保证哈希表有序。

6:当存储的是一个元素时,就用Collection。当存储对象之间存在着映射关系时,就使用Map集合。

7:保证唯一,就用Set。不保证唯一,就用List。

8:用Collection接口中的方法:toArray()可以将集合变数组。好处:限定了对集合中的元素进行增删操作,只要获取这些元素即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值