Java Map

235 阅读4分钟

1.Map及其实现类对比

java.util.Map:存储一对一对的数据(key-value键值对,(x1,y1)、(x2,y2) --> y=f(x),类似于高中的函数)
    HashMap:主要实现类;线程不安全的,效率高;可以添加nuLl的key和value值;底层使用数组+单向链表+红黑树结构存储(jdk8)
        LinkedHashMap;是HashMap的子类,在HashMap使用的数据结构的基础上,增加了一对双向链表,用于记录添加的元素的先后顺序,进而我们在遍历元素时,就可以按照添加的顺序显示。开发中,对于频繁的遍历操作,建议使用此类。
    TreeMap:底层使用红黑树存储;可以按照添加的key-valve中的key元素的指定的属性的大小顺序进行历。需要考虑使用 自然排序、定制排序。
    Hashtable:古老实现类;线程安全的,效率低;不可以添加nuLL的key或valve值;底层使用数组+单向表结构存储(jdk8)
        Properties:其key和value都是String类型。常用来处理属性文件。

2. HashMap中元素的特点

HashMap中的所有的key彼此之间是不可重复的、无序的。所有的key就构成一个Set集合。--->key所在的类要重写hashcode()和equals()方法
HashMap中的所有的value彼此之间是可重复的、无序的。所有的valve就构成一个CoLLection集合。--->VaLue所在的类要重写equals()方法
HashMap中的一个key-value,就构成了一个entry。HashMap中的所有的entry彼此之间是不可重复的、无序的。所有的entry就构成了一个Set集合。

3. Map中的常用方法

  • 添加、修改操作:

Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中
void putALL(Map m):将m中的所有key-value对存放到当前map中

  • 删除操作:

0bject remove(Object key):移除指定key的key-value对,并返回value
void clear():清空当前map中的所有数据

  • 元素查询的操作:

Object get(object key):获取指定key对应的value
boolean containsKey(Object key):是否包含指定的key
boolean containsValue(Object value):是否包含指定的value
int size():返回map中key-vaLue对的个数
boolean isEmpty():判断当前map是否为空
boolean equals(Object obj):判断当前map和参数对象obj是否相等

  • 元视图操作的方法(遍历操作):

Set keySet():返回所有key构成的Set集合
Collection values():返回所有value构成的ColLection集合
Set entrySet():返回所有key-vaLue对构成的Set集合

public void test0(){
    HashMap map = new HashMap();

     // put(Object key,Object value)
    map.put("AA",11);
    map.put("BB",22);
    map.put("CC",33);
    map.put(new Person("Tom",51),44);

    System.out.println(map);//{Person {name='Tom', age=51}=44, AA=11, BB=22, CC=33}
    //size()
    System.out.println(map.size());//4

    //remove()
    map.remove("BB");
    System.out.println(map);//{Person {name='Tom', age=51}=44, AA=11, CC=33}

    //get()
    System.out.println(map.get("CC")); //33

    System.out.println();
    //Set keySet():返回所有key构成的Set集合
    Set keyset = map.keySet();
    Iterator iterator = keyset.iterator();
    while (iterator.hasNext()){
        System.out.println(iterator.next()); //AA
                                             //CC
                                             //Person {name='Tom', age=51}

    }

    //Collection values():返回所有value构成的ColLection集合
    Collection values = map.values();
    for (Object obj:values) {
        System.out.println(obj);    //11
                                    //33
                                    //44
    }

    //Set entrySet():返回所有key-vaLue对构成的Set集合
    Set entrySet = map.entrySet();
    Iterator iterator1 = entrySet.iterator();
    while (iterator1.hasNext()){
        System.out.println(iterator1.next());   //Person {name='Tom', age=51}=44
                                                //AA=11
                                                //CC=33
    }
    Set entrySet1 = map.entrySet();
    Iterator iterator2 = entrySet1.iterator();
    while (iterator2.hasNext()){
        Map.Entry entry = (Map.Entry) iterator2.next();
        System.out.println(entry.getKey() + "----" + entry.getValue());
    }
    //AA----11
    //CC----33
    //Person {name='Tom', age=51}----44
}

4. TreeMap的使用

底层使用红黑树存储
可以按照添加的key-value中的key元素的指定的属性的大小顺序进行遍历
需要考虑使用 自然排序、定制排序
要求:向TreeMap中添加的key必须是同一个类型的对象

@Test
public void test01(){
    TreeMap map = new TreeMap();
    map.put("AA",11);
    map.put("BB",22);
    map.put("CC",33);
    map.put("DD",66);

    //自然排序
    Set entryset = map.entrySet();
    for (Object obj:entryset) {
        System.out.println(obj);
        //AA=11
        //BB=22
        //CC=33
        //DD=66
    }
}

//自然排序
@Test
public void test02(){
    TreeMap map = new TreeMap();
    map.put(new Person("Tom",20),11);
    map.put(new Person("Sam",52),22);
    map.put(new Person("James",62),33);
    map.put(new Person("Curry",41),44);
    map.put(new Person("Jorge",53),55);

    Set entryset = map.entrySet();
    for (Object obj:entryset) {
        System.out.println(obj);
    }
    //Person {name='James', age=62}=33
    //Person {name='Jorge', age=53}=55
    //Person {name='Sam', age=52}=22
    //Person {name='Curry', age=41}=44
    //Person {name='Tom', age=20}=11
}

//定制排序
@Test
public void test03(){
    Comparator comparator = new Comparator() {
        @Override
        public int compare(Object o1, Object o2) {
            if(o1 instanceof Person && o2 instanceof Person){
                Person p1 = (Person) o1;
                Person p2 = (Person) o2;

                return p1.getAge() - p2.getAge();
            }
           throw new RuntimeException("类型不匹配");
        }
    };

    TreeMap map = new TreeMap(comparator);

    map.put(new Person("Tom",20),11);
    map.put(new Person("Sam",52),22);
    map.put(new Person("James",62),33);
    map.put(new Person("Curry",41),44);
    map.put(new Person("Jorge",53),55);

    Set entryset = map.entrySet();
    for (Object obj:entryset) {
        System.out.println(obj);
    }
    //Person {name='Tom', age=20}=11
    //Person {name='Curry', age=41}=44
    //Person {name='Sam', age=52}=22
    //Person {name='Jorge', age=53}=55
    //Person {name='James', age=62}=33

5. Properties的使用

其key和value都是String类型。常用来处理属性文件。

File file = new File("info.properties"); //注意,要提前创建好
System.out.printin(file.getAbsolutePath());
FileInputStream fis = new FileInputStream(file);
Properties pros = new Properties();
pros.Load(fis); //加载流中的文件中的数据
//读取数据
String name = pros.getProperty("name");
String pwd = pros.getProperty("password");
System.out.println(name +“:"+ pwd);

fis.close();

6. 一个key添加多个value

public void test01(){
    HashMap map = new HashMap();

    String name = "山西";
    List list = new ArrayList();

    list.add("醋文化");
    list.add("关帝庙");
    list.add("晋祠");
    list.add("汾河");
    list.add("煤炭");

    map.put(name,list);

    Set entrySet = map.entrySet();
    for (Object obj : entrySet) {
        System.out.println(obj);
    }
}