Map
Map:一次添加一對元素。Collection 一次添加一個元素。
Map也稱為雙列集合,Collection集合稱為單列集合。
其實map集合中存儲的就是鍵值對。
map集合中必須保證鍵的唯一性
常用方法:
1,添加。
value put(key,value):返回前一個和key關聯(lián)的值,如果沒有返回null.
2,刪除。
void clear():清空map集合。
value remove(key):根據(jù)指定的key翻出這個鍵值對。
3,判斷。
boolean containsKey(key):
boolean containsValue(value):
boolean isEmpty();
4,獲取。
value get(key):通過鍵獲取值,如果沒有該鍵返回null。
當然可以通過返回null,來判斷是否包含指定鍵。
int size(): 獲取鍵值對的個數(shù)。
例:
public static void main(String[] args) {
Map<Integer,String> map = new HashMap<Integer,String>();
method(map);
method_2(map);
}
public static void method_2(Map<Integer,String> map){
map.put(8,"zhaoliu");
map.put(2,"zhaoliu");
map.put(7,"xiaoqiang");
map.put(6,"wangcai");
Collection<String> values = map.values();
Iterator<String> it2 = values.iterator();
while(it2.hasNext()){
System.out.println(it2.next());
}
/*
* 第一種遍歷Map集合
* 通過Map轉(zhuǎn)成set就可以迭代。
* 找到了另一個方法。entrySet。
* 該方法將鍵和值的映射關系作為對象存儲到了Set集合中,而這個映射關系的類型就是Map.Entry類型(結婚證)
*/
Set<Map.Entry<Integer, String>> entrySet = map.entrySet();
Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();
while(it.hasNext()){
Map.Entry<Integer, String> me = it.next();
Integer key = me.getKey();
String value = me.getValue();
System.out.println(key+"::::"+value);
}
//第二種遍歷Map集合的方法
//取出map中的所有元素。
//原理,通過keySet方法獲取map中所有的鍵所在的Set集合,在通過Set的迭代器獲取到每一個鍵,
//在對每一個鍵通過map集合的get方法獲取其對應的值即可。
Set<Integer> keySet = map.keySet();
Iterator<Integer> it = keySet.iterator();
while(it.hasNext()){
Integer key = it.next();
String value = map.get(key);
System.out.println(key+":"+value);
}
}
public static void method(Map<Integer,String> map){//學號和姓名
// 添加元素。
System.out.println(map.put(8, "wangcai"));//null
System.out.println(map.put(8, "xiaoqiang"));//wangcai 存相同鍵,值會覆蓋。
map.put(2,"zhangsan");
map.put(7,"zhaoliu");
//刪除。
System.out.println("remove:"+map.remove(2));
//判斷。
System.out.println("containskey:"+map.containsKey(7));
//獲取。
System.out.println("get:"+map.get(6));
System.out.println(map);
Outer.Inner.show();
}
Map常用的子類:
|--Hashtable :內(nèi)部結構是哈希表,是同步的。不允許null作為鍵,null作為值。
|--Properties:用來存儲鍵值對型的配置文件的信息,可以和IO技術相結合。
|--HashMap : 內(nèi)部結構是哈希表,不是同步的。允許null作為鍵,null作為值。
|--TreeMap : 內(nèi)部結構是二叉樹,不是同步的。可以對Map集合中的鍵進行排序。
例1、:HashMap應用舉例:
public class Person {
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
注:舉例中的Person對象有存在重復的,但是Person如果沒有實現(xiàn)hashCode()和equals(Object obj)這兩個方法,就無法比較出對象的hash值相等,所以會在結果中看到兩個相同的結果,如果實現(xiàn)這兩個方法就可以比較對象是否相等,如果相等則覆蓋原來的對象的值。實現(xiàn)這兩個對象的方法:Source->Generate hashCode() and equals() 然后在選擇要比較的屬性
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
private String name;
private int age;
public Person() {
super();
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
import java.util.HashMap;
import java.util.Iterator;
public class ThreadDemo {
public static void main(String[] args) {
HashMap<Person, String> hMap = new HashMap<Person, String>();
hMap.put(new Person("lisi", 23), "北京");
hMap.put(new Person("zhaolliu", 45), "上海");
hMap.put(new Person("xiaoqiang", 56), "北京");
hMap.put(new Person("wangcai", 21), "大連");
hMap.put(new Person("lisi", 23), "北京");
Iterator<Person> it = hMap.keySet().iterator();
while (it.hasNext()) {
Person key = it.next();
String value = hMap.get(key);
System.out.println(key.getName() + ":" + key.getAge() + "---"
+ value);
}
}
}
例2、TreeMap使用。
package aaa;
public class Person {
private String name;
private int age;
public Person() {
super();
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
package aaa;
public class Student extends Person {
public Student() {
super();
}
public Student(String name, int age) {
super(name, age);
}
}
package aaa;
import java.util.TreeMap;
import java.util.Iterator;
public class ThreadDemo {
public static void main(String[] args) {
TreeMap<Student, String> hMap = new TreeMap<Student, String>(new ComparetorByName());
hMap.put(new Student("lisi", 23), "北京");
hMap.put(new Student("zhaolliu", 45), "上海");
hMap.put(new Student("xiaoqiang", 56), "北京");
hMap.put(new Student("wangcai", 21), "大連");
hMap.put(new Student("lisi", 23), "東京");
Iterator<Student> it = hMap.keySet().iterator();
while (it.hasNext()) {
Person key = it.next();
String value = hMap.get(key);
System.out.println(key.getName() + ":" + key.getAge() + "---"
+ value);
輸出結果:
lisi:23---東京
wangcai:21---大連
xiaoqiang:56---北京
zhaolliu:45---上海
}
}
}
例3、LinkedHashMap使用舉例
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
public class ThreadDemo {
public static void main(String[] args) {
LinkedHashMap<Integer, String> linkedHashMap=new LinkedHashMap<>();
linkedHashMap.put(2, "sd");
linkedHashMap.put(3, "qwdsa");
linkedHashMap.put(1, "dfsd");
linkedHashMap.put(9, "sewq");
Iterator<Map.Entry<Integer, String>> iterator=linkedHashMap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, String> mEntry=iterator.next();
Integer keyInteger=mEntry.getKey();
String valueString=mEntry.getValue();
System.out.println(keyInteger+":"+valueString);
輸出結果:
2:sd
3:qwdsa
1:dfsd
9:sewq
結果是有序的
}
}
}
練習:"fdgavcbsacdfs" 獲取該字符串中,每一個字母出現(xiàn)的次數(shù)。
package aaa;
import java.util.Iterator;
import java.util.Map;
import java.util.TreeMap;
/*
* 練習:
* "fdgavcbsacdfs" 獲取該字符串中,每一個字母出現(xiàn)的次數(shù)。
* 要求打印結果是:a(2)b(1)...;
* 思路:
* 對于結果的分析發(fā)現(xiàn),字母和次數(shù)之間存在著映射的關系。而且這種關系很多。
* 很多就需要存儲,能存儲映射關系的容器有數(shù)組和Map集合。
* 關系一方式有序編號嗎?沒有!
* 那就是使用Map集合。 又發(fā)現(xiàn)可以保證唯一性的一方具備著順序如 a b c ...
* 所以可以使用TreeMap集合。
* 這個集合最終應該存儲的是字母和次數(shù)的對應關系。
* 1,因為操作的是字符串中的字母,所以先將字符串變成字符數(shù)組。
* 2,遍歷字符數(shù)組,用每一個字母作為鍵去查Map集合這個表。
* 如果該字母鍵不存在,就將該字母作為鍵 1作為值存儲到map集合中。
* 如果該字母鍵存在,就將該字母鍵對應值取出并+1,在將該字母和+1后的值存儲到map集合中,
* 鍵相同值會覆蓋。這樣就記錄住了該字母的次數(shù).
* 3,遍歷結束,map集合就記錄所有字母的出現(xiàn)的次數(shù)。oy.
*/
public class ThreadDemo {
/**
* @param args
*/
public static void main(String[] args) {
String str = "fdg+avAdc bs5dDa9c-dfs";
String s = getCharCount(str);
System.out.println(s);
}
public static String getCharCount(String str) {
//將字符串變成字符數(shù)組
char[] chs = str.toCharArray();
//定義map集合表。
Map<Character,Integer> map = new TreeMap<Character,Integer>();
for (int i = 0; i < chs.length; i++) {
if(!(chs[i]>='a' && chs[i]<='z' || chs[i]>='A' && chs[i]<='Z'))
continue;
//將數(shù)組中的字母作為鍵去查map表。
Integer value = map.get(chs[i]);
map.put(chs[i], value==null?1:value+1);
}
return mapToString(map);
}
private static String mapToString(Map<Character, Integer> map) {
StringBuilder sb = new StringBuilder();
Iterator<Character> it = map.keySet().iterator();
while(it.hasNext()){
Character key = it.next();
Integer value = map.get(key);
sb.append(key+"("+value+")");
}
return sb.toString();
}
}