Java学习--map的用法

1、map中的常用方法:

void clear():删除该Map对象中的所有key-value对。 
boolean containsKey(Object key):查询Map中是否包含指定的key,如果包含则返回true。 
boolean containsValue(Object value):查询Map中是否包含一个或多个value,如果包含则返回true。 
Set entrySet():返回map中包含的key-value对所组成的Set集合,每个集合元素都是map.Entry对象 
Object get(Object key):返回指定key所对应的value;如果此map中不包含该key,则返回null。 
boolean isEmpty():查询该map是否为空,如果为空,则返回true。 
Set keySet():返回该map中所有key组成的set集合 
Object put(Object key,Object value):添加一个key-value对,如果当前map中已有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。 
void putAll(Map m):将指定map中的key-value对复制到本map中 
Object remove(Object key):删除指定key所对应的key-value对,返回被删除key所关联的value,如果该key不存在,则返回null。 
boolean remove(Object key,Object value):这是java8新增的方法,删除指定key,value所对应的key-value对,如果从该map中成功地删除该key-value对,该方法返回true,否则返回false。 
int size():返回该map里的key-value对的个数。 
collection values():返回该map里所有value组成的collection。 
Map中包括了一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法。 
Object getKey():返回该Entry里包含的key值 
Object getValue():返回该Entry里包含的value值。 

Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值

import java.util.*;

public class MapTest {

	public static void main(String[] args) {
		Map map=new HashMap();
		map.put("疯狂Java讲义", 100);
		map.put("疯狂IOS讲义", 10);
		map.put("疯狂Ajax讲义", 79);
		map.put("轻量级java ee企业应用实战", 99);
		System.out.println(map.put("疯狂IOS讲义", 99));
		
		System.out.println(map);
		System.out.println("是否包含值为疯狂IOS讲义的Key:"+map.containsKey("疯狂IOS讲义"));
		System.out.println("是否包含值为99的Value:"+map.containsValue(99));
		for(Object key:map.keySet()) {
			System.out.println(key+"-->"+map.get(key));
		}
		map.remove("疯狂Ajax讲义");
		System.out.println(map);
	}

}

执行结果:

10
{疯狂Ajax讲义=79, 疯狂IOS讲义=99, 轻量级java ee企业应用实战=99, 疯狂Java讲义=100}
是否包含值为疯狂IOS讲义的Key:true
是否包含值为99的Value:true
疯狂Ajax讲义-->79
疯狂IOS讲义-->99
轻量级java ee企业应用实战-->99
疯狂Java讲义-->100

{疯狂IOS讲义=99, 轻量级java ee企业应用实战=99, 疯狂Java讲义=100}

2、Java8 为Map新增的方法

1) Object compute(Object key,BiFunction remappingFunction); 
2) Object computeIfAbsent(Object key,Function mappingFunction); 
3) Object computeIfPresent(Object key,BiFunction remappingFunction); 
4) void forEach(BiConsumer action); 
5) Object getOrDefault(Object key,V defaultValue); 
6) Object merge(Object key,Object value,Bifunction remappingFunction); 
7) Object putIfAbsent(Object key,Object value); 
8) Object replace(Object key,Object value); 
9) boolean replace(K key,V oldValue,V newValue); 
10) replaceAll(BiFunction function);


import java.util.*;

public class MapTest2 {
	

	public static void main(String[] args) {
		Map map=new HashMap();
		map.put("疯狂Java讲义", 100);
		map.put("疯狂IOS讲义", 10);
		map.put("疯狂Ajax讲义", 79);
		// 尝试替换key为"疯狂XML讲义"的value,由于原Map中没有对应的key,
        // 因此对Map没有改变,不会添加新的key-value对
		map.replace("疯狂XML讲义", 66);
		System.out.println(map);
		// 使用原value与参数计算出来的结果覆盖原有的value
		map.merge("疯狂IOS讲义", 10,(oldVal,param)->(Integer)oldVal+(Integer)param);
		System.out.println(map);// "疯狂iOS讲义"的value增大了10
		// 当key为"Java"对应的value为null(或不存在时),使用计算的结果作为新value
		map.computeIfAbsent("Java", (key)->((String)key).length());
		System.out.println(map);// map中添加了 Java=4 这组key-value对
		// 当key为"Java"对应的value存在时,使用计算的结果作为新value
		map.computeIfPresent("java", (key,value)->(Integer)value*(Integer)value);
		System.out.println(map); // map中 Java=4 变成 Java=16
	}

}

执行结果:

{疯狂Ajax讲义=79, 疯狂IOS讲义=10, 疯狂Java讲义=100}
{疯狂Ajax讲义=79, 疯狂IOS讲义=20, 疯狂Java讲义=100}
{Java=4, 疯狂Ajax讲义=79, 疯狂IOS讲义=20, 疯狂Java讲义=100}

{Java=4, 疯狂Ajax讲义=79, 疯狂IOS讲义=20, 疯狂Java讲义=100}

3、Java 8改进的HashMap和Hashtable实现类

HashMap和Hashtable存在两点典型区别 
  1.Hashtable是一个线程安全的Map实现,但HashMap是线程不安全的实现,所以HashMap比Hashtable的性能高一点。 
  2.Hashtable不允许使用null作为key和value,如果试图把null值放Hashtable中,将会引发NullPointerException异常;但HashMap可以使用null作为key或value。 

  为了成功地在HashMap、Hashtable中存储、获取对象,用作key的对象必须实现hashCode()方法和equals()方法。

LinkedHashMap实现类

LinkedHashMap使用双向链表来维护key-value对的次序。

import java.util.LinkedHashMap;

public class LinKedHashMap {

	public static void main(String[] args) {
		LinkedHashMap scores=new LinkedHashMap();
		scores.put("语言", 80);
		scores.put("英语",82);
		scores.put("数学",76);
		scores.forEach((key,value)->System.out.println(key+"-->"+value)); // 调用forEach方法遍历scores里的所有key-value对
	}

}
执行结果 :
语言-->80
英语-->82

数学-->76

TreeMap

  TreeMap就是一个红黑树数据结构,每个key-value对即作为红黑树的一个节点。TreeMap也有两种排序方法。 
   自然排序:TreeMap的所有key必须实现Comparable接口,而且所有的key应该是同一个类的对象,否则将会抛出ClassCastException异常。 
   定制排序:创建TreeMap时,传入一个Comparator对象,该对象负责对TreeMap中的所有key进行排序。采用定制排序时,不要求Map的key实现Comparable接口。 
   如果使用自定义类作为TreeMap的key,则重写该类的equals()方法和comparaTo()方法时应保持一致的返回结果。

以后再写:


WeakHashMap和IdentityHashMap

   WeakHashMap与HashMap的用法基本相似,与HashMap的区别在于,HashMap的key保留了对实际对象的强引用,这意味着只要该HashMap对象不被销毁,该HashMap的所有key所引用的对象就不会被垃圾回收,HashMap也不会自动删除这些key所对应的key-value对;但WeakHashMap的key只保留了对实际对象的弱引用,这意味着如果WeakHashMap对象的key所引用的对象没有被其他强引用变量所引用,则这些key所引用的对象可能被垃圾回收,WeakHashMap也可能自动删除这些key所对应的key-value对。 
   在IdentityHashMap中,当且仅当两个key严格相等(key1==key2)时,IdentityHashMap才认为两个key相等;对于普通的HashMap而言,只要key1和key2通过equals()方法比较返回true,且它们的hashCode值相等即可。


猜你喜欢

转载自blog.csdn.net/weixin_39430584/article/details/79992425