Loading

Map集合_HashMap_TreeMap_等_小记

Map是一种依照键值对数据存储元素的容器。
Map中的元素是两个对象,一个对象作为键,一个对象作为值。一个键(key)和它对应的值构成map集合中的一个元素。Map集合的数据结构只跟键有关,键不可以重复,但是值可以重复。

—|Hashtable:
底层是哈希表数据结构,线程是同步的,不可以存入null键,null值。
效率较低,被HashMap 替代。
—|HashMap:
底层是哈希表数据结构,线程是不同步的,可以存入null键,null值。
要保证键的唯一性,需要覆盖hashCode方法,和equals方法。哈希表的数据结构保证了元素的唯一性,内在是因为重写了equal和HashCode方法。
—| LinkedHashMap:
该子类基于哈希表又融入了链表。可以Map集合进行增删提高效率。
—|TreeMap:
底层是二叉树数据结构。可以对map集合中的键进行排序。需要使用Comparable或者Comparator 进行比较排序。return 0,来判断键的唯一性。
Map


常用方法:
V put(K key, V value)添加键值对,第一次用put存储数据,返回null,第二次放置键相同的数据,返回第一次放置的值。
remove(K) 输入键值,移除键对应的值,并返回该值
clear() 清空集合对象
value get(key); 可以用于判断键是否存在的情况。当指定的键不存在的时候,返 回的是null。
boolean isEmpty() 判断是否为空,长度为0返回true否则false
boolean containsKey(Object key) 判断集合中是否包含指定的key
boolean containsValue(Object value) 判断集合中是否包含指定的value
Int size()

package Day16_HashMap;

import java.util.HashMap;
import java.util.Map.Entry;
import java.util.Set;

/**
 * @author Aoman_Hao
 */
public class HashMapTest {

    public static void main(String[] args) {

        HashMap<Integer, String> Ha = new HashMap<Integer,String>();

        String s1 = Ha.put(1, "刘诗诗");
        String s2 = Ha.put(2, "诗诗");
        String s3 = Ha.put(3, "涵");
        String s4 = Ha.put(4, "TZRRY");
        Ha.put(8, "TZRRY");
        String s5 = Ha.put(5, "刘诗5");
        Ha.put(5, "刘诗6");

        //集中健的集合 keySet
        Set<Integer> keySet = Ha.keySet();
        for(Integer key:keySet){
            System.out.println("编号:"+key+"\t"+"姓名:"+Ha.get(key));
        }
        System.out.println("--------------------------------");

        //返回键值对的集合entrySet
        Set<Entry<Integer, String>> entry = Ha.entrySet();
        for(Entry<Integer, String> key2:entry ){
            System.out.println("号="+key2.getKey()+"\t"+"名="+key2.getValue());
        }
        System.out.println("--------------------------------");
        //判断是否包含键 containsKey
        System.out.println("是否包含键2,"+Ha.containsKey(2));
        System.out.println("是否包含键10,"+Ha.containsKey(10));

        //判断是否包含值 containsValue
        System.out.println("是否包含值‘刘诗诗’,"+Ha.containsValue("刘诗诗"));
        System.out.println("是否包含值‘Aoman’,"+Ha.containsValue("Aoman"));
        System.out.println("-----------------------");

        //暴力清空
        Ha.clear();
        System.out.println(Ha);
    }

}
输出:
编号:1    姓名:刘诗诗
编号:2    姓名:诗诗
编号:3    姓名:涵
编号:4    姓名:TZRRY
编号:5    姓名:刘诗6
编号:8    姓名:TZRRY
--------------------------------
号=1 名=刘诗诗
号=2 名=诗诗
号=3 名=涵
号=4 名=TZRRY
号=5 名=刘诗6
号=8 名=TZRRY
--------------------------------
是否包含键2,true
是否包含键10,false
是否包含值‘刘诗诗’,true
是否包含值‘Aoman’,false
-----------------------
{}

总:键相同,值覆盖,map集合的数据结构只跟键有关,如要存储不一样的数据,必须保证键值是不一样的,否则会导致存储数据跟预想的不一样,会丢失数据。map集合重写了tostring语句,所以可以有默认格式的输出,hash表的结构的特点是输出无序的,即存数据跟取数据的顺序是不一致的。

测试类
package Day16_HashMap;

import java.util.HashMap;
import java.util.Set;

/**
 * @author Aoman_Hao
 */
public class HashMapTest2 {

    public static void main(String[] args) {
        //创建
        HashMap<Star, Integer> StHa = new HashMap<Star,Integer>();

        StHa.put(new Star("刘诗诗", 23, "女"), 01);
        StHa.put(new Star("TZRRY", 24, "男"), 02);
        StHa.put(new Star("涵", 25, "女"), 03);
        StHa.put(new Star("刘六", 28, "男"), 04);


        //打印成字符串
        //键集合,转为数组类型,
        Object[] array = StHa.keySet().toArray();
            StringBuffer Sb = new StringBuffer();
            for(Object key: array){
                //强转star类型
                Star s_Key=(Star)key;
                //append拼接
                Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
                .append("年龄:").append(s_Key.getAge()).append("\t")
                .append("性别").append(s_Key.getGender()).append("\t")
                .append("编号:").append(StHa.get(key)).append("\r\n");
            }
            System.out.println(Sb);

    }

}
输出:
个人信息:姓名:TZRRY   年龄:24   性别男 编号:2
个人信息:姓名:刘六  年龄:28   性别男 编号:4
个人信息:姓名:涵   年龄:25   性别女 编号:3
个人信息:姓名:刘诗诗 年龄:23   性别女 编号:1

注:star是简单的姓名年龄性别的类。

LinkedHashMap的特点是元素有序,元素唯一。
有序性即存取数据的顺序是一致的,是靠链表完成的。
唯一性是靠哈希表完成的。

package Day16_HashMap;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Set;

/**
 * @author Aoman_Hao
 */
public class HashMapTest2 {

    public static void main(String[] args) {
        //创建
        HashMap<Star, Integer> StHa = new LinkedHashMap<Star,Integer>();

        StHa.put(new Star("刘诗诗", 23, "女"), 01);
        StHa.put(new Star("TZRRY", 24, "男"), 02);
        StHa.put(new Star("涵", 25, "女"), 03);
        StHa.put(new Star("刘六", 28, "男"), 04);


        //打印成字符串
        //键集合,转为数组类型,
        Object[] array = StHa.keySet().toArray();
            StringBuffer Sb = new StringBuffer();
            if(StHa!=null){
                for(Object key: array){
                    //强转star类型
                    Star s_Key=(Star)key;
                    //append拼接
                    Sb.append("个人信息:").append("姓名:").append(s_Key.getName()).append("\t")
                    .append("年龄:").append(s_Key.getAge()).append("\t")
                    .append("性别").append(s_Key.getGender()).append("\t")
                    .append("编号:").append(StHa.get(key)).append("\r\n");
                }
                System.out.println(Sb); 
            }       
    }
}

输出:
个人信息:姓名:刘诗诗 年龄:23   性别女 编号:1
个人信息:姓名:TZRRY   年龄:24   性别男 编号:2
个人信息:姓名:涵   年龄:25   性别女 编号:3
个人信息:姓名:刘六  年龄:28   性别男 编号:4

注:增强for循环前定要对集合进行非空判断,否则会出现空指针异常。

HashMap嵌套串用,可与ArrayList搭配使用

package Day16_HashMap;

import java.util.HashMap;
import java.util.Set;

/**
 * 
 * 
 * 集合嵌套之HashMap嵌套HashMap


                偶像派(没演技)
                    杨幂      30   女
                    杨颖      30   女
                实力派
                    刘诗诗 27   女
                    胡歌      30   男
 * @author Aoman_Hao
 */
public class HashMapQT {

    public static void main(String[] args) {
        //创建小集合
        HashMap<Star, String> Idol = new HashMap<Star,String>();
        HashMap<Star, String> Actor = new HashMap<Star,String>();

        //创建大集合
        HashMap<String, HashMap<Star, String>> Hash = new HashMap<String,HashMap<Star, String>>();

        //添加元素
        Idol.put(new Star("杨幂", 30, "女"), "i1");
        Idol.put(new Star("杨颖", 30, "女"), "i2");
        Actor.put(new Star("刘诗诗", 27, "女"), "a1");
        Actor.put(new Star("胡歌", 30, "男"), "a1");

        Hash.put("偶像", Idol);
        Hash.put("实力派", Actor);

        Set<String> Hash_keyset = Hash.keySet();

        //遍历大集合
        for(String fen:Hash_keyset){
            //得到大集合中元素,求的其键
            HashMap<Star, String> Hash_son = Hash.get(fen);
            Set<Star> Hash_son_keySet = Hash_son.keySet();

            //格式打印
            System.out.println("分类:"+fen);
            System.out.println("\t"+"姓名:"+"\t"+"年龄:"+"\t"+"性别:"+"\t"+"编号:");
            //建立缓冲区,append拼接
            StringBuffer Sb = new StringBuffer();
            //遍历小集合
            for(Star key:Hash_son_keySet){
                Sb.append("\t").append(key.getName()).append("\t")
                .append(key.getAge()).append("\t")
                .append(key.getGender()).append("\t")
                .append(Hash_son.get(key)).append("\r\n");
            }
            System.out.println(Sb);
        }
    }
}

输出:

分类:实力派
    姓名: 年龄: 性别: 编号:
    胡歌  30  男   a1
    刘诗诗 27  女   a1

分类:偶像
    姓名: 年龄: 性别: 编号:
    杨幂  30  女   i1
    杨颖  30  女   i2

Collections常用法
public static void sort(List list): 排序,默认按照自然顺序
public static int binarySearch(List<> list,T key): 二分查找
public static T max(Collection<> coll): 获取最大值
public static void reverse(List<> list): 反转
public static void shuffle(List<> list): 随机置换

posted @ 2017-11-20 17:21  AomanHao  阅读(15)  评论(0)    收藏  举报