Map集合: 该集合存储键值对。一对一对往里存。而且要保证键的唯一性
1 添加:
put(K key, V value)
putAll(Map<? extends K, ? extends V> m)
2 删除:
clear()
remove(Object key)
3 判断:
containsValue(Object value)
containsKey(Object key)
isEmpty()
4 获取
get(Object key)
size()
values()
entrySet();
keySet()
Map
|-----HashTable:底层是哈希表数据结构,不可以存入null键null值。该集合是线程同步的。jdk1.0 效率低
|-----HashMap:底层是哈希表数据结构,允许存入null键null值。该集合是线程不同步的。 jdk1.2。 效率高
|-----TreeMap:底层是二叉树数据结构。线程不同步的。可以用于给map集合中的键进行排序
基本共性方法测试:
@Test
public void testMap(){
Map<String, String> map = new HashMap<String, String>();
//添加元素(添加元素时,如果出现相同的key值,则后者会覆盖欠着的value值,并put方法会返回被覆盖的值)
System.out.println("put:" + map.put("01", "zhangsan1"));
System.out.println("put:" + map.put("01", "wangwu1"));//返回zhangsan1
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
System.out.println("containsKey:" + map.containsKey("02"));
// System.out.println("remove:" + map.remove("02"));
System.out.println("get:" + map.get("002"));
map.put("04", null);
System.out.println("get:" + map.get("04"));
//可以通过get方法的返回值来判断一个键是否存在,通过返回null来判断
//获取map集合中所有的值
System.out.println(map);//由于key"01"重复存入,后者会覆盖前者的value
}
map集合的取出原理: 将map集合转成set集合,然后通过迭代器取出。
Set <K> keySet()
将map中所有的键存入到set集合。因为set具备迭代器,所以可以用迭代方式取出所有的键,然后根据get方法,获取每一个键对应的值。
代码测试:
@Test
public void testMapKeySet(){
Map<String, String> map = new HashMap<String, String>();
//添加元素
map.put("01", "zhangsan1");
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
map.put("04", "zhangsan4");
//先获取map集合的所有键的Set集合,keySet()
Set<String> keySet = map.keySet();
//有了Set集合可以获取迭代器
Iterator<String> iterator = keySet.iterator();
while(iterator.hasNext()){
String key = iterator.next();
String value = map.get(key);
System.out.println("key:" + key + "=" + value );
}
}
Set<Map.Entry<K, V>> entrySet()
将map集合中的映射关系存入到set集合中,而这个关系类型就是:Map.Entry
代码测试:
@Test
public void testMapEntrySet(){
Map<String, String> map = new HashMap<String, String>();
//添加元素
map.put("01", "zhangsan1");
map.put("02", "zhangsan2");
map.put("03", "zhangsan3");
map.put("04", "zhangsan4");
//将集合中的映射关系取出,存入到Set集合中
Set<Entry<String, String>> entrySet = map.entrySet();
Iterator<Entry<String, String>> iterator = entrySet.iterator();
while(iterator.hasNext()){
Entry<String, String> entry = iterator.next();
String key = entry.getKey();
String value = entry.getValue();
System.out.println("key:" + key + "=" + value );
}
}
Map.Entry 其实Entry也是一个接口,它是Map接口的一个内部接口。
--------------------------------------------------------------------------------------------------------------------
分别使用HashMap和TreeMap存储进行测试。
Studfent:
package cn.wangyu.map;
/**
* @author JiangMinyan
*
* @version 2016/02/17 14:34:34
*/
public class Student implements Comparable<Student>{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {<span style="color:#ff0000;">//hash表用到</span>
return this.name.hashCode() + this.age * 34;
}
@Override
public boolean equals(Object obj) {<span style="color:#ff0000;">//hash表用到</span>
if (!(obj instanceof Student))
throw new ClassCastException("类型不匹配");
Student student = (Student) obj;
return this.name.equals(student.name) && (this.age == student.age);
}
@Override
public int compareTo(Student o) {<span style="color:#ff0000;">//TreeMap用到</span>
int sum = this.name.compareTo(o.name);
if (sum == 0) {
sum = new Integer(this.age).compareTo(new Integer(o.age));
}
return sum;
}
// @Override
// public int compareTo(Student o) {
//
// int sum = new Integer(this.age).compareTo(new Integer(o.age));
// if (sum == 0) {
// sum = this.name.compareTo(o.name);
// }
// return sum;
// }
}
HashMap:
@Test
public void testStudentMap(){
Map<Student, String> map = new HashMap<Student, String>();
map.put(new Student("zhangsan1", 21), "shanghai");
map.put(new Student("zhangsan1", 21), "dalian");
map.put(new Student("zhangsan2", 22), "tianjin");
map.put(new Student("zhangsan3", 23), "wuhan");
map.put(new Student("zhangsan4", 24), "changchun");
Iterator<Entry<Student, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Entry<Student, String> entry = iterator.next();
Student student = entry.getKey();
String address = entry.getValue();
System.out.println("name:" + student.getName() + "," + address);
}
}
TreeMap:
@Test
public void testTreeMap(){
Map<Student, String> map = new TreeMap<Student, String>(new StuAgeComparator());
map.put(new Student("zhangsan20", 21), "shanghai");
map.put(new Student("zhangsan8", 50), "wuhan");
map.put(new Student("zhangsan5", 24), "changchun");
map.put(new Student("zhangsan2", 22), "tianjin");
Iterator<Entry<Student, String>> iterator = map.entrySet().iterator();
while(iterator.hasNext()){
Entry<Student, String> entry = iterator.next();
Student student = entry.getKey();
String address = entry.getValue();
System.out.println("name:" + student.getName() + "," + address);
}
}
-----------------------------------------------------------------------------------------------------------------------------------------------------------
练习:统计“ab123;dcbdbdsbc”字母出现的次数。
@Test
public void testCharCount(){
System.out.println(charCount("ab123;dcbdbdsbc"));
}
public String charCount(String str){
char[] charArray = str.toCharArray();
TreeMap<Character, Integer> treeMap = new TreeMap<Character, Integer>();
for (int i = 0; i < charArray.length; i++) {
char ch = charArray[i];
if (!((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')))
continue;
Integer value = treeMap.get(ch);
if (value != null) {
value = value + 1;
}else{
value = 1;
}
treeMap.put(ch, value);
}
System.out.println(treeMap);
StringBuilder sb = new StringBuilder();
Iterator<Entry<Character, Integer>> iterator = treeMap.entrySet().iterator();
while (iterator.hasNext()) {
Entry<Character, Integer> next = iterator.next();
Character ch = next.getKey();
Integer count = next.getValue();
sb.append(ch + "(" + count + ")");
}
return sb.toString();
}