Map和Collection的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Map和Collection的区别相关的知识,希望对你有一定的参考价值。

参考技术A Collection接口,包含list和set子接口
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。
在Map对象中,每一个关键字最多有一个关联的值。
Map:不能包括两个相同的键,一个键最多能绑定一个值。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的
值为null。当get()方法返回null值时,即可以表示Map中没有该键,也可以表示该键所对应的值为null。因此,在Map中不能由get()方法来判断Map中是否存在某个键,而应该用containsKey()方法来判断。
参考技术B Collection接口,包含list和set子接口
Collection和Map接口之间的主要区别在于:Collection中存储了一组对象,而Map存储关键字/值对。
在Map对象中,每一个关键字最多有一个关联的值。
Map:不能包括两个相同的键,一个键最多能绑定一个值。null可以作为键,这样的键只有一个;可以有一个或多个键所对应的
值为null。当get()方法返回null值时,即可以表示Map中没有该键,也可以表示该键所对应的值为null。因此,在Map中不能由get()方法来判断Map中是否存在某个键,而应该用containsKey()方法来判断。
继承Map的类有:HashMap,HashTable
HashMap:Map的实现类,缺省情况下是非同步的,可以通过Map Collections.synchronizedMap(Map m)来达到线程同步
HashTable:Dictionary的子类,确省是线程同步的。不允许关键字或值为null
当元素的顺序很重要时选用TreeMap,当元素不必以特定的顺序进行存储时,使用HashMap。Hashtable的使用不被推荐,因为HashMap提供了所有类似的功能,并且速度更快。当你需要在多线程环境下使用时,HashMap也可以转换为同步的。本回答被提问者和网友采纳

Map类

package map;

public class differentDemo {
    /**
     * map和Collection集合的区别
     * map集合是键值对的集合    Collection是单一出现数据的聚合
     * Map的键是唯一的,而collection的子接口List集合中的元素是可以重复的,set是唯一的
     * map是夫妻对,collection是光棍
     */
}
package map;

import java.util.HashMap;
import java.util.Map;

public class MapDemo1 {
    public static void main(String[] args) {
        
        /**
         * Map的特点:
         * 数据成对出现
         * 数据的键是唯一的
         * 一个键只能对应一个值
         * 值可以重复
         * 键允许一个为空,值可以多个是空
         * 方法:
         * put()
         * putAll()
         * remove()
         * clear()
         * 
         * get()
         *  Set<k>   keySet
         *  
         *  判断功能:
         *  containsKey()
         *  containsValue()
         *  isEmpty()
         *  
         *  
         *  遍历方式:
         *  Set<Entry<String,Person>> entry = map.entrySet();
         *  for(Entry<String,Person> sp:entry){
         *      String key = sp.getKey();
         *      Person value = sp.getValue();
         *  System.out.println("键:"+key+"   值:"+value);
         *  
         *  }
         *  HashMap:
         *  
         *  HashMap是map的实现类
         *   允许多个null值和null键
         *   Hashmap中的元素没有顺序
         *   hashmap不是线程安全的
         *   Map<String,String> map = new HashMap<String,String>();
         *   map = Collections.synchronizedMap(map);
         *   这样就变成了线程安全的
         *   
         *   Treemap:
         *   可以进行自然排序
         *   可以创建comparetor进行排序,可以重写compareto进行排序
         *   
         *   key不能为null,不能重复
         *   
         *   
         *   HashTable:
         *   不允许有任何null值和null键
         *   
         *   HashTable中的元素没有顺序
         *   是线程安全的
         *   
         *   LinkedHashMap:
         *   
         *   有顺序,
         *   允许多个null值和null键
         *   不是线程安全的
         *   
         *  
         *  
         */
        Map<String,String> map = new HashMap<String,String>();
        map.put("鼓上蚤","时迁");
        map.put("行者","武松");
        //键是唯一的,如果有俩会存在覆盖的情况
        map.put("行者","武大郎");
        
        
    }
}
package practice;

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

public class Demo1 {
    public static void main(String[] args) {
        /**
         * map的特点: 1.数据成对出现 2.数据的键是唯一的,如果有相同的会被覆盖的 3.一个键只能有一个值 4.值可以重复
         * 5.键允许有一个为空,值可以多个是空,有一个null可以对应,有两个null就无法正确对应了
         */
        Map<String, String> map = new HashMap<String, String>();
        map.put("鼓上蚤", "时迁");
        map.put("行者", "武松");
        map.put("及时雨", "宋江");
        map.put("呼保义", "宋江");
        map.put(null, "无用");
        map.put("晓晓", null);
        map.put("螃蟹", null);
        // 只能有一个null键,否则,会被覆盖
//        map.put(null, "无1用");
        System.out.println(map);

        Map<String, String> map1 = new HashMap<String, String>();
        map1.put("花和尚", "鲁智深");
        map1.put("青面兽", "杨志");
        // 一个map添加到另一个map中
        map.putAll(map1);
        System.out.println(map);
//        清空map
        map1.clear();
        System.out.println(map1);
        // 删除一个键值对
        map.remove("青面兽");
        // 通过对应的键来获取值
        System.out.println(map);
        // 通过get来获取键值对  如果没有相应的键就返回null
        String a = map.get("花和尚");
        System.out.println(a);
            
        Set<String> set = map.keySet();
        //这里输出的是所有的键
        System.out.println(set);
        for(String key:set) {
            //根据当前的key来获得value
            String value  = map.get(key);
            System.out.println(value);
        }
        
        Map<String,Person> map2 = new HashMap<String,Person>();
        
        map2.put("3", new Person(1,"阿彪",1));
        map2.put("2", new Person(1,"拖拉机",2));
        System.out.println(map2);
        //是否包含某个值
        boolean iscon = map.containsKey("花和尚");
        System.out.println(iscon);
        boolean isval = map.containsValue("鲁智深");
        System.out.println(isval);
        
        boolean isval1 = map2.containsValue(new Person(1,"阿彪",1));
        System.out.println(isval1);
        
        Set<Entry<String, String>> entry  = map.entrySet();
        for(Entry<String, String> et : entry)
        {        //for循环中自己定义的那个就是元素
            String key1 = et.getKey();
            String value1 = et.getValue();
            System.out.println("键:  "+key1+"     值:"+value1);
        }
        
    }
}
package practice;

import java.util.HashMap;
import java.util.Map;

public class HashMapDemo {
        
    
    public static void main(String[] args) {
        /**
         * map的实现类HashMap
         * 1.允许多个null值和一个null键
         * 2.HashMap中的元素没有顺序(跟添加的顺序无关)
         * 3.HashMap不是线程安全的
         */
        Map<String,String> map = new HashMap<String,String>();
        map.put("鼓上蚤", "时迁");
        map.put("呼保义", "宋江");
        map.put("及时雨", "宋江");
        map.put("行者", "武松");
        System.out.println(map);
        
    }
}
package practice;

public class HashtableDemo {
/**
 * 不允许有null值和null键
 */
}
package practice;

public class HashtableDemo {
/**
 * 不允许有null值和null键
 */
}
package practice;

public class Person {
    private int age;
    
    private String name;
    
    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [age=" + age + ", name=" + name + ", gender=" + gender + "]";
    }

    public Person(int age, String name, int gender) {
        super();
        this.age = age;
        this.name = name;
        this.gender = gender;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + age;
        result = prime * result + gender;
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if(!(obj instanceof Person)) {
            return false;
        }
        Person p = (Person)obj;
        if(this.age == p.age&&this.gender==p.gender
                &&this.name!=null&&p.name!=null&this.name.equals(p.name)) {
            return true;
        }
        else {
            return false;
        }
        
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getGender() {
        return gender;
    }

    public void setGender(int gender) {
        this.gender = gender;
    }

    private int gender;
}
package practice;

public class TreeMap {
/**
 * 有自然排序
 */
}

 

以上是关于Map和Collection的区别的主要内容,如果未能解决你的问题,请参考以下文章

Map和Collection的区别

Collections,Collection ,Map,List,Set的区别?

java面试题——集合框架

Java集合框架中接口Collection和Map的区别

List,set,Map 的用法和区别

JAVA Collection接口中List Map 和Set的区别(转)