JAVA---集合之Map接口

版权声明:转载请标明出处~~谢谢! https://blog.csdn.net/zoe_ranxiaosu/article/details/82117445

Map接口

Map接口------集合框架中的另一个父接口
   Map集合(另名为散列表):用于存储一一对应的元素数据,第一个对象可以作为索引,第二个对象作为值,

  我们称之为key-    value,键值对。

存储数据的特点 

     (1)以key-value形式进行存储。
     (2)key与value都必须是引用类型。
     (3)key可以为null。
     (4)key与value是单向一对一映射。
     (5)key不能重复。

存储机制 

Map是基于数组和链表的数据结构进行存储数据。
       作为key的对象也是采用了散列算法计算存储在数组(散列数组,散列桶)的位置上, 如果计算出来的位置,数组中此位置没有元素,就可以添加到散列桶内。

        如果有元素,key的equals方法返回值为false,就会存储在散列桶元素对应的单向链表中。
       如果key的equals方法返回true,就进行替换(覆盖)。
    PS:使用Map集合时,作为key的数据类型应该重写equals和HashCode方法 

常用方法 

V put(K k,V v)
           作用:用于存储一对key-value,返回被替换的value值
                     如果不是替换就返回null。--返回值类型和value类型一致
    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接口的子类

HashMap与HashTable的区别
        (1)HashTable是一个古老的类。不建议使用
        (2)HashTable是一个线程安全的类,HashMap线程不安全
        (3)HashTable的Key不能是null,HashMap可以是null
LinkedHashMap:是HashMap的子类,使用链表来维护key-value的顺序,在迭代时顺序与添加的顺序一致。
TreeMap: 是SortedMap子接口的实现类,使用了二叉树的数据结构维护填入集合的顺序。
   (1)自然排序:往TreeMap添加的key对象,可以实现Comparable接口的compareTo方法
   (2)定制排序:作为key对象的数据类型,可以不实现Comparable接口。

                         需要创建一个比较器Comparator对象。实现compare方法。

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

		}
		/**
		 * 遍历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();// 获取封装的key值
			Person value = e.getValue();
			System.out.println(key + "=" + value);
			System.out.println(e);

		}
		/*
		 * 遍历Map集合的第三种方法
		 * 
		 * 此方法只能够拿到所有的value,无法取 key
		 */
		Collection<Person> ps = map.values();
		for (Person p : ps) {
			System.out.println(p);
		}

	}

}

Properties 

是HashTable的子类型,用于封装属性文件的key-value信息,因为在文件里写的都是字符串,因此Properties的key与value都是字符串类型

public class TestProperties {
	public static void main(String[] args) throws IOException {
		/*创建一个Properties对象*/
		Properties prop = new Properties();
		/*创建指定硬盘位置上的流对象,用于读取数据*/
		InputStream is = TestProperties.class
				          .getClassLoader().getResourceAsStream("db.properties");
		prop.load(is);
		/*获取属性文件里的信息*/
		String url = prop.getProperty("url");
		System.out.println(url);
		String username = prop.getProperty("username");
		System.out.println(username);
		String pwd = prop.getProperty("pwd");
		System.out.println(pwd);
	}

}

猜你喜欢

转载自blog.csdn.net/zoe_ranxiaosu/article/details/82117445