有关Map集合

Map集合中重要的几个接口和类如下:
①SortedMap接口:进一步提供关于键的总体排序 的 Map。该映射是根据其键的自然顺序进行排序的,或者根据通常在创建有序映射时提供的 Comparator 进行排序。
②NavigableMap接口:(SortedMap的子接口)扩展的 SortedMap,具有了针对给定搜索目标返回最接近匹配项的导航方法。
③AbstractMap抽象类:此类提供 Map 接口的骨干实现,以最大限度地减少实现此接口所需的工作。
④WeakHashMap类:(AbstractMap的子类)以弱键实现的基于哈希表的Map,即在WeakHashMap中,当某个键不再正藏使用的时,将自动移除其条目的键,其映射的存在并不阻止垃圾回收器对该键的丢弃。这就使得该键成为可终止的,被终止,然后被回收。
⑤ConcurrentMap类:(AbstractMap的子类)支持获取的完全并发和所期望可调整的并发的哈希表,是线程安全的。
⑥HashMap类:(AbstractMap的子类)提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是不保证该顺序恒久不变。
⑦TreeMap类:(AbstractMap的子类)基于红黑树(Red——Black Tree)的NavigableMap实现。该映射根据其键的自然顺序进行排序,或者根据创建映射时提供的ComparaTo进行排序,具体取决于使用的构造方法。
有关Map集合
1、有关HashMap、TreeMap键值是否可以为null的举例

public class Demo03 {

	public void a() {

		Map<Integer, Object> map1 = new HashMap<>();
		
		String a1= "A2";
		map1.put(559, "A1");
		map1.put(471, a1);
		map1.put(342, "A3");
		map1.put(768, "A4");
		map1.put(229, "A5");
		map1.put(878, "A6");
		
		System.out.println(map1);
		System.out.println("----------------------------------");
		map1.remove(342);
		a1 = "AAA";
		map1.put(648, null);
		map1.put(null, null);
		map1.put(null, "zhensghuang");
		System.out.println(map1);
	}

    public static void main(String [] args){
          new Demo01().a();
    }
}

运行结果:
{768=A4, 229=A5, 342=A3, 471=A2, 878=A6, 559=A1}
---------------------------------------------------------------
{768=A4, null=zhensghuang, 229=A5, 471=A2, 648=null, 878=A6, 559=A1}
根据运行结果知:
HashMap的键为null和值为null都可以
但是注意:TreeMap的j值可以为null,键能否为null分情况而言;
                   当没有实现Comparator接口时,TreeMap的键是不能为null的,会抛出java.lang.NullPointerException异常;
                   当实现Comparator接口时,并重写里面的compare()方法未对键为null进行判断,则抛出java.lang.NullPointerException异常
                   当实现Comparator接口时,并重写里面的compare()方法并对键为null进行判断,则可以成功存入
 例如:下面是 键值为null时可以成功存入的情况
public void demo() {
Map<Integer, Object> map = new TreeMap<>(new Comparator<Integer>() {
			public int compare(Integer o1, Integer o2) {
				if(o1 ==null) {
					return 1;
				}else {
					return o2-o1;
				}
			}
		
		});
		
		map.put(2, null);
		map.put(null, 2);
		map.put(null,null);
		System.out.println(map);
	}
	运行结果:
	{2=null, null=2, null=null}

2、介绍有关集合的另外一种特殊情况:集合中存放的对象及对象内容发生改变,集合怎样变化

public void demo1() {
		List<String> list = new ArrayList<>();
		Set<String> set = new HashSet<>();
		Map<Object,String> map = new HashMap<>();
		
		String str = new String("abc");
		list.add(str);
		set.add(str);
		map.put(6,str);
		System.out.println(list);
		System.out.println(set);
		System.out.println(map);
		System.out.println("---------------------");
		str = new String("aaa");
		System.out.println(list);
		System.out.println(set);
		System.out.println(map);
	}
	
运行结果
[abc]
[abc]
{6=abc}
---------------------
[abc]
[abc]
{6=abc}

demo1()方法是对象的指向发生改变,由运行结果可知集合并未发生改变

public void demo2() {
		List<A> list = new ArrayList<>();
		Set<A> set = new HashSet<>();
		Map<Integer,A> map = new HashMap<>();
		
		A a = new A(1, "田菲", 20);
		list.add(a);
		set.add(a);
		map.put(1, a);
		System.out.println(list);
		System.out.println(set);
		System.out.println(map);
		System.out.println("------------------------------");
		
		a.setName("李盾");
		System.out.println(list);
		System.out.println(set);
		System.out.println(map);
	}
	
运行结果:
[A [id=1, name=田菲, age=20, getId()=]]
[A [id=1, name=田菲, age=20, getId()=]]
{1=A [id=1, name=田菲, age=20, getId()=]}
----------------------------------------------
[A [id=1, name=李盾, age=20, getId()=]]
[A [id=1, name=李盾, age=20, getId()=]]
{1=A [id=1, name=李盾, age=20, getId()=]}

demo2()方法存放的是对象的应用,可以看到对象的内容发生变化,集合也改变了

由两个方法对比可以总结出:
若是对象的指向发生改变,集合不改变;
若集合中存放的是对象的引用类型,如果对象的内容发生改变,对象的内存地址会发生改变,集合也就会改变。

两种情况结合的例子:

public void d() {
		Map<Integer, A> map = new HashMap<>();
		A a1 = new A(1, "张三", 29);
		A a2 = new A(2,"田灿",20);
		A a3 = new A(3,"旭样",44);
		map.put(7, a1);
		map.put(34, a2);
		System.out.println(map);
		a2.setName("田菲");//改变
		System.out.println(map);
		a2 = null;//这种方法并没有改变集合的内容,只是指向改变所以集合不改变
		System.out.println(map);
		a2 = a3;//不改变
		System.out.println(map);
	}
运行结果:
{34=A [id=2, name=田灿, age=20, getId()=], 7=A [id=1, name=张三, age=29, getId()=]}
{34=A [id=2, name=田菲, age=20, getId()=], 7=A [id=1, name=张三, age=29, getId()=]}
{34=A [id=2, name=田菲, age=20, getId()=], 7=A [id=1, name=张三, age=29, getId()=]}
{34=A [id=2, name=田菲, age=20, getId()=], 7=A [id=1, name=张三, age=29, getId()=]}