Java集合之五Map、HashMap、LinkedHashMap、TreeMap、Properties

Map

Map用于保存具有映射关系(Key-Value)的数据, key 和  value都可以是任何引用类型的数据,我们常用String类型来做Key值。
Map 中的 key 用Set来存放,不允许重复,允许有一个null值的key,即同一个Map对象所对应的类,须重写hashCode()和equals()方法。key 和 value之间存在单向一对一关系,即通过指定的key总能找到唯一的、确定的 value。


Map常用方法

①Object put(Object key,Object value):像Map中添加一个key-value
②Object remove(Object key):通过key值删除对应的键值对
③void putAll(Map t):将指定的Map中全部元素添加到此Map中
④void clear():删除Map中全部键值对
⑤Set keySet():返回keySet
⑥Collection values():返回value的值集合
⑦Set entrySet():返回一个entrySet
⑧Object get(Object key):通过key值取出value值,若没有这个key则返回null
⑨boolean containsKey(Object key):判断是否包含指定的key值
⑩boolean containsValue(Objectv alue):判断是否包含指定的value
⑪int size():返回Map的元素数量
⑫boolean isEmpty():判断Map内元素的个数是否为0,为0返回true
⑬boolean equals(Object obj):判断Map与指定的对象是否相等

使用示例

@Test
	public void test1(){
		Map map = new HashMap();
		//添加一个元素
		map.put("AA", 123);
		map.put("BB", 234);
		map.put(123, "AA");
		map.put("AA", 1234);
		map.put(new Person(1,"jack",21), 1);
		map.put(new Person(2,"tom",21), 2);
		map.put(new Person(1,"jack",21), 3);
		//判断Map是否为空
		boolean b1 = map.isEmpty();
		System.out.println(b1);
		//判断map是否存在AA的key值
		boolean b2 = map.containsKey("AA");
		System.out.println(b2);
		//判断map是否存在AA的value值
		boolean b3 = map.containsValue("AA");
		System.out.println(b3);
		//输出map的元素的个数
		int size = map.size();
		System.out.println(size);
		//删除key为123的键值对
		Object obj = map.remove(123);
		System.out.println(obj);
		//获取key为BB的value值
		Object obj2 = map.get("BB");
		System.out.println(obj2);
		Map map2 = new HashMap();
		map2.put("aa", "aa");
		map2.put("bb", "bb");
		//判断两个map是否相等
		boolean b4 = map.equals(map2);
		System.out.println(b4);
		map.putAll(map2);
		//遍历map
		/*
		 * 方式一:通过Map.keySet遍历key和value
		 */
        for (Object o : map.keySet()) {
            //map.keySet()返回的是所有key的值
            Object value = map.get(o);//得到每个key多对用value的值
            System.out.println(o + ":" + value);
        }
        /*
		 * 方式二:通过Map.entrySet使用iterator遍历key和value
		 */
        System.out.println("==========================");
        Iterator it = map.entrySet().iterator();
        while (it.hasNext()) {
             Map.Entry entry = (Entry) it.next();
               System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
        }
        /*
		 * 方式三:通过Map.entrySet遍历key和value
		 * 推荐,尤其是容量大时,效率相对较快
		 */
        System.out.println("=========================");
        Set entrySets = map.entrySet();
        for (Object o : entrySets) {
        	Map.Entry entry = (Map.Entry)o;
            System.out.println("key= " + entry.getKey() + " and value= "
                    + entry.getValue());
        }
        /*
		 * 方式四:通过Map.values()遍历所有的value,但不能遍历key
		 */
        System.out.println("=========================");
        for (Object value : map.values()) {
            System.out.println("value= " + value);
        }
        //清空
        map.clear();
        System.out.println(map.size());
	}
输出结果

false
true
true
5
AA
234
false
AA:1234
BB:234
Person [id=2, name=tom, age=21]:2
aa:aa
Person [id=1, name=jack, age=21]:3
bb:bb
==========================
key= AA and value= 1234
key= BB and value= 234
key= Person [id=2, name=tom, age=21] and value= 2
key= aa and value= aa
key= Person [id=1, name=jack, age=21] and value= 3
key= bb and value= bb
=========================
key= AA and value= 1234
key= BB and value= 234
key= Person [id=2, name=tom, age=21] and value= 2
key= aa and value= aa
key= Person [id=1, name=jack, age=21] and value= 3
key= bb and value= bb
=========================
value= 1234
value= 234
value= 2
value= aa
value= 3
value= bb
0
注意:像HashMap里添加元素时,因为key是用Set存储的,所以会调用key所在类的equals()方法和hashCode()方法,如果相同,则把第二个元素添加进去,顶掉已经存在的那个。

HashMap

HashMap与HashSet一样,不保证映射的顺序,是非线程安全的。HashMap 判断两个 key 相等的标准是:两个 key 通过 equals()方法返回 true,hashCode 值也相等。HashMap 判断两个 value相等的标准是:两个 value通过 equals()方法返回 true。
如果HashMap想实现线程同步,可以使用Collections. synchronizedMap或ConcurrentHashMap 。
HashMap键无序,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度,在Map 中插入、删除和定位元素,HashMap 是最好的选择。

LinkedHashMap

LinkedHashMap 是 HashMap 的子类,与LinkedHashSet类似,LinkedHashMap 可以维护 Map 的迭代顺序:迭代顺序与Key-Value 对的插入顺序一致。

TreeMap
TreeMap存储 Key-Value对时,需要根据 key-value对进行排序。TreeMap 可以保证所有的Key-Value对处于有序状态。
TreeMap 的 Key 的排序:
自然排序:TreeMap 的所有的 Key 必须实现 Comparable接口,而且所有的Key应该是同一个类的对象,否则将会抛出ClasssCastException
定制排序:创建 TreeMap 时,传入一个Comparator对象,该对象负责对TreeMap 中的所有 key 进行排序。此时不需要Map的 Key 实现 Comparable接口。
其原理和具体实现类似TreeSet,可以参照我的上篇博文:点击打开链接

Hashtable
Hashtable是个古老的 Map 实现类,线程安全。 与HashMap不同,Hashtable 不允许使用null作为 key 和 value 与HashMap一样,Hashtable 也不能保证其中Key-Value对的顺序, Hashtable判断两个key相等、两个value相等的标准,与hashMap一致。由于Hashtable效率太慢,不建议使用。

Properties
Properties 类是 Hashtable 的子类,该对象用于处理属性文件。 由于属性文件里的 key、value都是字符串类型,所以 Properties 里的 key value 都是字符串类型。 存取数据时,建议使用setProperty(Stringkey,Stringvalue)方法和getProperty(Stringkey)方法
Properties pros = new Properties();
pros.load(new FileInputStream("jdbc.properties"));
String user = pros.getProperty("user");
System.out.println(user);
user=root
password=123456



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值