JAVA基础(24)-Java集合之Map接口

本文详细介绍了Map接口的概念及其存储特点,包括key-value形式存储、存储机制、常用方法等,并对比了HashMap与HashTable的区别,同时介绍了LinkedHashMap、TreeMap及Properties等子类的应用场景。
摘要由CSDN通过智能技术生成

Map接口

        集合框架中的另一个父接口
        Map集合,用于储存一一对应的元素数据,第一个对象可以作为索引,第二个对象作为值,我们称之为key-value,键值对。
 
        储存数据的特点:
              (1) 以key-value形式进行存储。
              (2) key与value都必须是引用类型
              (3) key可以为null。
              (4) key与value是单向一对一映射。
              (5) key不能重复
        存储机制:
              Map是基于数组和链表的数据结构进行存储数据。作为key的对象采用了hash算法计算存储的数组(散列数组,散列桶)的位置,如果计算出来的位置,数组中此位置没有元素,就可以添加到散列桶内,如果有元素,key的equals方法返回值为false,就会存储在散列桶元素对应的单向链表中。如果key的equals方法返回true,就进行替换(覆盖)。集合中key的元素不可重复,value的元素可重复出现多次
              PS:使用Map集合,做为key的数据类型应该重写equals和HashCode方法   
        常用方法:
              V  put(K k,V v)    用于存储一对key-value.  返回被替换的value值如果不是替换就返回null
              V  get(K k)    通过key对象,获取对应的value对象,如果集合中没有此key,返回null 
        Map集合的遍历:
              Set<K>  keySet()    用于获取Map中所有的key对象,返回一个Set集合
              Set<Entry<K,V>>  entrySet()    将key-value封装成内部类对象,返回Entry对象的Set集合                        
              Collection<V> values()    将map集合中的所有value封装到一个Collection集合中。

              map<String,String> descendingMap()  将map的key倒叙输出

public static void main(String[] args) {
		/*存储五个人,一个身份证号对应一个人*/
		Map<String,Person> map =
				 new HashMap<String,Person>();
		map.put("222333199011111234", new Person("222333199011111234","张三",23,'f'));
		map.put("222333199011118888", new Person("222333199011118888","李四",53,'m'));
		map.put("22233319901111999x", new Person("22233319901111999x","小泉",22,'m'));
		map.put("222333199011110000", new Person("222333199011110000","小姚",20,'m'));
		map.put("222333199011115555", new Person("222333199011115555","小黑",23,'f'));
		System.out.println(map);
		/*查看是否有一个身份证号为
		 * 222333199011110000的人
		 * */
		Person p1 = map.get("222333199011110001");
		if(p1==null) {
			System.out.println("查无此人");
		}else {
			System.out.println(p1.getName());
			System.out.println(p1.getGender());
		}
        System.out.println("==================================");

		/*遍历Map集合的第一种方法:
		 * Set<K>  keySet();
		 * */
		Set<String> set = map.keySet();
		for(String key:set) {
			Person value = map.get(key);
			System.out.println(key+"="+value);
		}
		System.out.println("==================================");

		/*遍历Map集合的第二种方法:*/
		Set<Entry<String,Person>> entrys = map.entrySet();
		for(Entry<String,Person> e:entrys) {
			String key = e.getKey();
			Person value = e.getValue();
			System.out.println(key+"="+value);
		}
        System.out.println("==================================");

		/*遍历Map集合的第三种方法*/
		   Collection<Person> ps = map.values();
		   for(Person p:ps) {
			   System.out.println(p);
		   }
		System.out.println(map.size());
	}

        装载因子和HashMap的优化:
              装载因子:DEFAULT_LOAD_FACTOR = 0.75f 
              默认容量:DEFAULT_INITIAL_CAPACITY  = 16,就是数组的容量
              元素个数: size    
           
              当我们创建一个HashMap对象时,底层数组的初始容量为16。当存储的数据的个数 size/DEFAULT_INITIAL_CAPACITY等于DEFAULT_LOAD_FACTOR时,数组开始扩容。此时最佳。如果小于0.75扩容,比较占内存。如果大于0.75扩容,操作的元素比较多。

 

Map接口的子类


        HashMapHashTable的区别
              (1)HashTable是一个古老的类。不建议使用
              (2)HashTable是一个线程安全的类,HashMap线程不安全
              (3)HashTable的key不能是null,HashMap可以是null
        LinkedHashMap :是HashMap子类,使用链表来维护key-value的顺序,在迭代时顺序与添加顺序一致。
        TreeMap:是SortedMap子接口的实现类,使用了二叉树的数据结构维护 填入集合的顺序。
              (1)自然排序:往TreeMap里添加的key对象,可以实现Comparable接口。重写compareTo方法
              (2)定制排序:做为key对象的数据类型,可以不实现Comparabel接口。需要创建一个比较器Comparator对象。实现compare方法
        Properties:是HashTable的子类型,用于封装属性文件的key-value信息因为在文件里写的都是字符串,因此Properties的key与value都是字符串类型

源码参考:HashMap源码分析TreeMap源码分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值