您的位置:首页 > 职场人生

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

2015-08-27 00:25 447 查看
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流!
-------


一.Map集合



1.Map集合存储的是键值对元素。键是唯一的,值可以重复。

2.Map和Collection的区别?

A:Map是双列集合,存储的元素键值对,键唯一,值可以重复。

B:Collection是单列集合,存储的元素是单一的,

List集合可以重复,Set集合元素唯一。

3.Map集合的功能

A:添加功能

V put(K key,V value)

B:删除功能

remove(K key)

C:判断功能

判断键 containsKey(K key)

判断值 containsValue(V value)

D:获取功能

通过键获取值

V get(K key)

获取键的Set集合

Set<K> keySet()

获取所有值的集合

Collection<V> values()

获取键值对对象集合

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

通过键值对对象获取键,获取值

Map.Entry:

getKey

getValue

E:长度功能

int size()

4.Map集合的数据结构

Map集合的数据结构对键有效,跟值无关。

它的底层数据结构和Set相同。

情况一:

底层数据结构是哈希表,哈希表依赖于哈希值。

最终通过重写两个方法hashCode(),equals()保证元素的唯一性。

比较顺序:

先比较hashCode()值:

结果为true:

后使用equals()方法判断:

true:说明元素重复。不添加。

false:说明元素不重复,添加。

结果为false:

就直接添加到集合。

情况二:

如果是二叉树结构,就有两种方式:Comparable,Comparator

根据返回值是否是0保证元素的唯一性.

元素的排序:

A:自然排序(元素具备比较性)

让元素所属的类实现Comparable接口

在类中重写compareTo(T t)方法

B:比较器排序(集合具备比较性)

在创建集合对象的时候,传递Comparator接口的子类对象

Comparator接口的子类重写compare(T t1,T t2)方法

5.Map的遍历方式

有一个HashMap集合hm,存储的键和值都是String类型.

方式一:根据键找值

a:获取所有键的集合

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

c:根据键找值

代码:

Set<String> set = hm.keySet();
for(String key : set) {
String value = hm.get(key);
System.out.println(key+"---"+value);
}


方式二:根据键值对对象找键和值

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

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

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

代码:

Set<Map.Entry<String,String>> set = hm.entrySet();
for(Map.Entry<String,String> me : set) {
String key  = me.getKey();
String value = me.getValue();
System.out.println(key+"---"+value);
}


6.案例

A:统计一个字符串中每个字符出现的次数

package cn.itcast2;

import java.util.Set;
import java.util.TreeMap;

/**
* "aabcbdeeeeedbddcc"获取字符串中每一个字母出现的次数。要求结果:a(2)b(3)c(3)d(4)e(5)
*/
public class Test5 {

public static void main(String[] args) {

// 看到题目最后的排序有顺序,并且一一对应,使用TreeMap集合
// 定义字符串
String s = "aabcbdeeeeedbddcc";
// 创建集合对象
TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

// 首先将字符串转化为字符数组
char[] charArray = s.toCharArray();

// 遍历字符数组,字符为键
for (char charKey : charArray) {

// 获取键所对应的值
Integer intValue = tm.get(charKey);

if (intValue == null) {
tm.put(charKey, 1);

} else {
tm.put(charKey, intValue + 1);
}
}
// 定义字符串缓冲区
StringBuilder sb = new StringBuilder();
// 遍历集合
// 获取键的集合
Set<Character> keySet = tm.keySet();
// 遍历键的集合,获取键与键所对应的值
for (Character characterKey : keySet) {
Integer value = tm.get(characterKey);
sb.append(characterKey).append("(").append(value).append(")");
}

// 输出结果

String string = sb.toString();

System.out.println(string);

}

}


B:Map集合的嵌套存储和遍历



package cn.itcast2;

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

public class Test4 {

/**
* 使用集合进行以下分类:
北京总部
-JAVAEE班:5个
-JAVASE班:8个
上海分校
-JAVAEE:4个
-JAVASE:7个

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

//使用Map集合嵌套Map集合创建集合对象
Map<String, Map<String,Integer>>  mm = new HashMap<String, Map<String,Integer>>();

//创建外层Map集合的元素对象1

String s1="北京总部";

// 创建内层Map集合对象

Map<String,Integer>  map = new HashMap<String,Integer>();

//创建内层Map集合的元素对象并添加进集合
map.put("JAVAEE班", 5);
map.put("JAVASE班", 8);

//创建外层Map集合的元素对象2

String s2="上海分校";

// 创建内层Map集合对象

Map<String,Integer>  map2 = new HashMap<String,Integer>();

//创建内层Map集合的元素对象并添加进集合
map2.put("JAVAEE班", 4);
map2.put("JAVASE班", 7);

//将外层Map集合的元素对象添加进集合
mm.put(s1, map);
mm.put(s2, map2);

//查看集合
System.out.println(mm);

//遍历集合
//首先遍历外层Map,获取外层集合的键的集合
Set<String> outKeySet = mm.keySet();

//遍历外层键的集合
for (String outKey : outKeySet) {
//通过外层键获取到其对应的值
Map<String, Integer> map3 = mm.get(outKey);
//输出外层键的名称
System.out.println(outKey);

//遍历内层map集合,首先获取键的集合
Set<String> inkeySet = map3.keySet();
//遍历内层键的集合
for (String inKey : inkeySet) {
//通过内层键获取到其对应的值
Integer value = map3.get(inKey);
//输出内层键的名称和它对应的值
System.out.println("班级名称:"+inKey+"   个数:"+value);
}
System.out.println();
}
}

}




7.Map集合的体系

Map

|--HashMap

|--LinkedHashMap

|--Hashtable

|--TreeMap

A:HashMap和Hashtable的区别?

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

HashMap:底层是哈希表数据结构,是线程不同步的。可以存储null键,null值。替代了Hashtable.

B:LinkedHashMap的键的特点?

LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: