1. 程式人生 > >Java筆記--Map集合

Java筆記--Map集合

1.Map集合:該集合儲存鍵值對,一對一對往裡存,而且要保證

鍵的唯一性

1,新增

//當存入相同鍵的時候,新新增的值會覆蓋原有的值

//而且會返回該鍵對應的原來的值(被覆蓋的值)

V put(K key, V value);

void putAll(Map<? extends K,? extends V> m);

2,刪除

void clear();

V remove(Object key);

3,判斷

boolean containsKey(Object key);

boolean containsValue(Object value);

boolean isEmpty();

4,獲取

V get(Object key);

int size();

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

Set<K> keySet();

2.Map

|--Hashtable:底層是雜湊表的資料結構,不可以存入null鍵、

和null值,該集合是執行緒同步的 ,JDK1.0,效率低

|--HashMap:底層是雜湊表資料結構,可以存入null鍵和null值

該集合是執行緒不同步的,JDK1.2,效率高

|--TreeMap:底層是二叉樹資料結構,執行緒不同步,可以用於

Map集合中的鍵進行排序。

注意:Map和Set很像,其實Set底層就是呼叫Map集合

Map基本方法演示

import java.util.*;

class MapDemo

{

public static void main(String[] args)

{

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

map.put("01","張三01");

//當存入相同鍵的時候,新新增的值會覆蓋原有的值

//而且會返回該鍵對應的原來的值(被覆蓋的值)

System.out.println(map.put("01","新張三"));

map.put("02","張三02");

map.put("03","張三03");

//HashMap可以鍵入null值

map.put("04",null);

//HaspMap可以鍵入null鍵

map.put(null,"王五");

System.out.println(map.containsKey("02"));

System.out.println("原來" + map);

map.remove("02"); //刪除鍵為02的元素

System.out.println("現在" + map);

Collection<String> coll = map.values();

System.out.println(coll);

}

}

//執行效果

張三01

true

原來{null=王五, 01=新張三, 02=張三02, 03=張三03, 04=null}

現在{null=王五, 01=新張三, 03=張三03, 04=null}

[王五, 新張三, 張三03, null]

3.Map集合的取出方式

(1) Set<K> keySet();方法

Map集合的取出原理:

將Map集合轉成Set集合,再通過迭代器取出

/*

keyset()方法:將map中所有的鍵存入到Set集合中。

因為Set具備迭代器,可以通過迭代的方式獲取所有的鍵,

再根據map集合的get()方法獲取每一個鍵對應的值

*/

import java.util.*;

class MapDemo

{

public static void main(String[] args)

{

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

map.put("01","張三01");

map.put("02","張三02");

map.put("03","張三03");

//先獲取map集合中所有鍵的Set集合

Set<String> keyset = map.keySet();

//有了set集合就可以獲取其迭代器

Iterator<String> it = keyset.iterator();

while(it.hasNext())

{

String key = it.next();

//有了鍵就可以通過map集合的get方法來獲取其對應的值

String value = map.get(key);

System.out.println("key : " + key + " value : " + value);

}

}

}

(2)獲取方式二:使用Set <Map,Entry<k,v>> entrySet();

Set <Map,Entry<k,v>> entrySet();:將Map集合中的對映關係存入到了Set集合中,而這個關係的資料型別就是Map.Entry

關係物件Map.Entry獲取到後,就可以通過Map.Entry中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 Hash implements Map.Entry

{

public abstract Object getKey() {}

public abstract Object getValue() {}

}

}

例項:

import java.util.*;

class MapDemo

{

public static void main(String[] args)

{

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

map.put("01","張三01");

map.put("02","張三02");

map.put("03","張三03");

Set<Map.Entry<String,String>> entrySet = map.entrySet();

Iterator<Map.Entry<String,String>> it = entrySet.iterator();

while(it.hasNext())

{

Map.Entry<String,String> me= it.next();

String value = me.getKey();

String key = me.getValue();

System.out.println("key : " + key + " value : " + value);

}

}

}

例項練習:

/*

需求:

1,描述學生

2,定義Map容器,將學生作為鍵,將學生地址作為值存入Map容器中

3,從Map容器中取出值

*/

import java.util.*;

class Student implements Comparable<Student>

{

private String name;

private int age;

private String addr;

Student(String name,int age)

{

this.name = name;

this.age = age;

}

//通過hashCode()和equals()函式來保證元素在HashSet集合中元素的唯一性

public int hashCode()

{

return name.hashCode() + age * 34;

}

//姓名和年齡相同的視為同一個學生

public boolean equals(Object obj)

{

if(!(obj instanceof Student))

throw new ClassCastException();

Student stu = (Student)obj;

return this.name.equals(stu.name) && this.age == stu.age;

}

//讓元素本身具備可比較性,當資料結構為二叉樹時

public int compareTo(Student stu)

{

int num = this.name.compareTo(stu.name);

if(num == 0)

{

return new Integer(this.age).compareTo(new Integer(stu.age));

}

return num;

}

public String getName()

{

return name;

}

public int getAge()

{

return age;

}

public String toString()

{

return name + "--" + age;

}

}

class MapTest

{

public static void main(String[] args)

{

//取出元素的第一種方式

/*

Set<Student> keyset = hm.keySet();

Iterator<Student> it = keyset.iterator();

HashMap <Student,String> hm = new HashMap<Student,String>();

hm.put(new Student("f張三1",21),"北京");

hm.put(new Student("t張三1",21),"徐州");

hm.put(new Student("a張三2",22),"南京");

hm.put(new Student("c張三3",23),"上海");

hm.put(new Student("e張三4",24),"徐州"); while(it.hasNext())

{

Student stu = it.next();

String name = stu.getName();

int age = stu.getAge();

String addr = hm.get(stu);

System.out.println(name + "----" + age + "----" + addr);

}

*/

//取出元素的第二種方式

Set<Map.Entry<Student,String>> entrySet = hm.entrySet();

Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();

while(iter.hasNext())

{

Map.Entry<Student,String> me = iter.next();

Student stu = me.getKey();

String addr = me.getValue();

System.out.println(stu + "----" + addr);

}

}

}

例項練習二:

import java.util.*;

//比較器是先根據年齡排序,再根據姓名排序

class stuNameComparator implements Comparator<Student>

{

public int compare(Student s1,Student s2)

{

int num = new Integer(s1.getAge()).compareTo(new Integer(s2.getAge()));

if(num == 0)

{

return s1.getName().compareTo(s2.getName());

}

return num;

}

}

class MapTest2

{

public static void main(String[] args)

{

TreeMap <Student,String> tm = new TreeMap<Student,String>(new

stuNameComparator());

tm.put(new Student("張三1",21),"北京");

tm.put(new Student("張三1",21),"徐州");

tm.put(new Student("張三2",22),"南京");

tm.put(new Student("張三3",23),"上海");

tm.put(new Student("張三4",24),"徐州");

Set<Map.Entry<Student,String>> entrySet = tm.entrySet();

Iterator<Map.Entry<Student,String>> iter = entrySet.iterator();

while(iter.hasNext())

{

Map.Entry<Student,String> me = iter.next();

Student stu = me.getKey();

String addr = me.getValue();

System.out.println(stu + "----" + addr);

}

}

}

綜合練習

/*

練習:

“asdgjahgsasdasdasd”獲取該字串中字元出現的次數

希望列印結果:a(5)d(4)......

通過結果發現,每一個字母都有對應的次數

說明字母和次數之間都有對映關係

什麼時候使用Map集合?

當資料之間存在這種對映關係時,就要先想Map集合,Map集合中存放的就是對映關係

思路:

1,將字串轉化成字元陣列

2,定義一個TreeMap集合,因為列印結果的字母有順序

3,遍歷字元陣列

將每一個字母作為鍵去查Map集合

如果返回null,將字母和1存到map集合中

如果返回不是null,說明該字母在map集合中已經存在

那麼就獲取該次數並進行自增,然後將該字母和自增後的次數存入到map集合中,覆蓋原來鍵對應的值

4,將map集合中的資料變成指定的字串形式返回

*/

import java.util.*;

class MapTest3

{

public static void main(String[] args)

{

String str = MapTest3.charCount("asdfgaeretds");

System.out.println(str);

}

public static String charCount(String str)

{

TreeMap<Character,Integer> tm = new TreeMap<Character,Integer>();

char[] chs = str.toCharArray(); //將字串轉換成字元陣列

//將鍵值對寫入到了Map集合中

for(int x = 0; x < chs.length; x++) //遍歷字元陣列中的每一個元素

{

Integer value = tm.get(chs[x]);

if(value == null)

{

tm.put(chs[x],1);

}

else

{

value++;

tm.put(chs[x],value);

}

}

//定義一個字元緩衝區

StringBuilder sb = new StringBuilder();

//遍歷TreeMap集合,將集合中的資料按規定格式傳入到字元緩衝區中

Set<Map.Entry<Character,Integer>> entrySet = tm.entrySet();

Iterator<Map.Entry<Character,Integer>> it = entrySet.iterator();

while(it.hasNext())

{

Map.Entry<Character,Integer> me = it.next();

char ch = me.getKey();

int value = me.getValue();

sb.append(ch + "(" + value + ")");

}

return sb.toString();

}

}