三十四、Java基础之Map集合

一、Map常用方法

/**
 * Map集合:是按照<键,值>形式存储数据,
 * java.util.Map基本操作:
 * 1。void clear():清空集合中所有的键值对
 * 2。boolean containsKey(Object key):判断是否包含指定的键
 * 3。boolean containsValue():判断是否包含指定的值
 * 4。Set<Map.Entry<K,V>> entrySet():返回所有的Entry集合,一个<键,值>对就是一个Entry
 * 5。get(Object key):返回键对应的值
 * 6。boolean isEmpty():判断集合是否为空
 * 7。Set<K> keySet():返回键的集合
 * 8。put<key,value>:添加键值对,如果key已存在,就使用新的value值替换原来的值
 * 9。void putAll(Map<?extend k,?extend v> m):把m集合中的所有键值对添加到当前集合中
 * 10。remove(Object key):只要key匹配就删除对应的键值对
 * 11。default boolean remove(Object k,Object v):删除键值对
 * 12。replace(key,value):使用value值替换key对应的原来的值
 * 13。int size():返回键值对的数量
 * 14。Collection<V> values():返回所有值的集合
 *
 */

例1:

public class Test01 {
    public static void main(String[] args){

        //1.创建Map,集合中只能存引用类型的数据
        Map<String,Integer>    map= new HashMap<>();

        //2.添加数据
        map.put("chu01",100000);
        map.put("chu02",200000);
        map.put("chu03",300000);
        map.put("chu04",400000);

        //4.打印    ,直接打印,打印顺序可能与存储顺序不一致
        System.out.println(map);   //{chu04=400000, chu01=100000, chu02=200000, chu03=300000}
        //5。添加重复的键
        map.put("chu03",500000);
        System.out.println(map);

        //6.替换      ,如果键不存在,替换不成功,不会报错
        map.replace("chu02",200001);
        map.replace("chuchu",1000000);
        System.out.println(map);   //{chu04=400000, chu01=100000, chu02=200001, chu03=500000}

        //7。判断
        System.out.println(map.isEmpty());//false
        System.out.println(map.size()); //4
        System.out.println(map.containsKey("chu01"));   //true
        System.out.println(map.containsValue(200000));        //false
        System.out.println(map.get("chu04")); //400000
        System.out.println(map.get("ccc")); //null
        //8.删除。要求键与值都匹配才可删除
        map.remove("chu01",100);
        System.out.println(map); //{chu04=400000, chu01=100000, chu02=200001, chu03=500000}
        map.remove("chu02");
        System.out.println(map);    //{chu04=400000, chu01=100000, chu03=500000}

        
        

    }
}

二、Map遍历

public class Test02 {

    public static void main(String[] args) {

        //1.创建Map,集合中只能存引用类型的数据
        Map<String, Integer> map = new HashMap<>();

        //2.添加数据
        map.put("chu01", 100000);
        map.put("chu02", 200000);
        map.put("chu03", 300000);
        map.put("chu04", 400000);

        //3.输出所有的key集合.Set不可重复
        Set<String> keySet = map.keySet();
        System.out.println(keySet);//[chu04, chu01, chu02, chu03]

        //4.返回所有值的集合,Collection可重复
        Collection<Integer> values = map.values();
        System.out.println(values);//[400000, 100000, 200000, 300000]

        //5.值遍历
        Iterator<Integer> iterator = values.iterator();
        while(iterator.hasNext()){
            Integer next = iterator.next();
            System.out.print(next + "\t");//400000    100000    200000    300000
        }
        System.out.println();

        //6。所有的Entry集合,一个Entry就是一个键值对
        Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
        for (Map.Entry<String, Integer> entry:entrySet
             ) {
            System.out.println(entry.getKey()+":"+entry.getValue());
            /**
             * chu04:400000
             * chu01:100000
             * chu02:200000
             **/

        }
    }
}

三、统计字符串中每个字符出现的次数

public class Test03 {
    public static void main(String[] args){

        String text="hfsafkjlashljhfoihfonalnfjlash  hflakljhfd f hfkjsahfk";

        //1、定义个Map,接受<字符,次数>的集合
        Map<Character,Integer> map = new HashMap<>();

        //2、遍历字符串
        for (int i=0;i<text.length();i++){
            char c = text.charAt(i);//取出对应的字符串
            //如果字符不是第一次出现,将原来的次数+1
            if(map.containsKey(c)){
                Integer integer = map.get(c);//将原来的次数取出来
                map.replace(c,integer+1);//加1后,存储进去
            }else{
                //如果字符是第一次出现,把<字符,1>保存到集合中
                map.put(c,1);
            }

        }


        //3、打印结果
        System.out.println(map);

        //4、遍历
        Set<Map.Entry<Character, Integer>> entries = map.entrySet();
        for (Map.Entry<Character, Integer> entry:entries
             ) {
            System.out.println(entry.getKey()+":"+entry.getValue());
            /**
             *  :4
             * a:6
             * s:4
             * d:1
             * f:10
             * h:9
             * i:1
             * j:5
             * k:4
             * l:6
             * n:2
             * o:2
             */
        }


    }

}

四、HashMap介绍

/**
 * HashMap底层是哈希表,散列表,哈希表就是一个数组,数组的每个元素就是一个单项链表
 * 1、HashMap的加载因子为0.75,this.loadFactor = DEFAULT_LOAD_FACTOR;
 * 2、在第一次执行put方法时,给哈希表(哈希桶)默认初始化容量为:16
 * 3、如果单项链表中的结点数超过8个时,系统会自动把单项链表转换为树形结构
 * 4、当HashMap中的键值对的数量>哈希桶*加载因子,哈希桶(数组)要扩容,按照2倍大小扩容
 * 5、HashMap可以指定初始化容量,系统会自动调整为2的幂次方,可以快速计算数组的下标
 *
 * 返回对应的hash值:
 * static final int hash(Object key) {
 *         int h;
 *         return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
 *     }
 *
 */
public class Test04 {

    public static void main(String[] args){

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

        hashMap.put("chu01",123);
        hashMap.put(null,null);

        //创建HashMap时,还可以指定初始化容量,最好把容量指定为2的幂次方,如果不是2的幂次方,系统会自动调整为2的幂次方
        //如果初始化容量为17~31之间的数,系统会调整为24
        //如果初始化容量为33-63之间的数,系统会自动调整为64

        hashMap = new HashMap<>(23);

    }
}

五、HashTable介绍

/**
 * HashTable:
 * 1、与HashMap一样,底层是哈希表,但是HashTable是线程安全的
 * 2、HashMap默认初始化容量是16,HashTable默认初始化容量为11
 * 3、加载因子:0.75,当键值对的数量*哈希桶容量时,要扩容
 * 4、HashMap默认按2倍大小扩容,HashTable按2倍+1扩容
 * 5、HashMap可以指定初始化容量,系统会自动调整为2的幂次方,HashTable也能指定初始化容量,系统不会自动调整

 */
public class Test05 {

    public static void main(String[] args) {
        Hashtable<String,Integer> hashtable = new Hashtable<>();
        hashtable.put("chu01",123);
        //hashtable.put(null,null);//java.lang.NullPointerException
        System.out.println(hashtable);

        hashtable = new Hashtable<>(32);
    }
}

六、Properties

  6.1

/**
 * 使用properties读取配置文件
 * 1、配置文件保存什么内容?
 *      经常保存系统属性
 * 2、如何添加配置文件
 *      一般会在项目中单独创建一个包,在该包中添加一个配置文件,该配置文件的扩展名为:.properties
 *

 */

 

public class Test06 {

    public static void main(String[] args) {

        //1、创建Properties,不需要通过泛型约束键值对的类型,都是String
        Properties properties = new Properties();

        //2、设置属性
        properties.setProperty("username","chu");
        properties.setProperty("password","123456");
        //3、读取属性
        System.out.println(properties.getProperty("username"));
        System.out.println(properties.getProperty("password"));

    }
}
public class Test07 {

    public static void main(String[] args) throws IOException {

        //1、创建propertise
        Properties properties = new Properties();

        //2、加载配置文件,两种 方式
        //InputStream in = Test07.class.getResourceAsStream("/resources/config.properties");
        //开发多线程程序,使用下面的,相反使用上面的
        InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("resources/config.properties");

        properties.load(in);

        //3、读取系统属性
        System.out.println(properties.getProperty("username"));
        System.out.println(properties.getProperty("password"));

    }
}

6.2

/**
 * 使用ResourceBundle读取配置文件
 * @author:csjin
 * 创建日期:2019-07-07-15:27
 */
public class Test08 {

    public static void main(String[] args) {
        //加载配置文件时,不需要扩展名,(前提是配置文件扩展名是:properties)
        ResourceBundle resourceBundle= ResourceBundle.getBundle("resources/config");

        System.out.println(resourceBundle.getString("username"));
        System.out.println(resourceBundle.getString("password"));
        System.out.println(resourceBundle.getBaseBundleName());

    }
}

七、TreeMap介绍

7.1

public class Test09 {
    public static void main(String[] args) {

        //1、创建一个TreeMap
        TreeMap<String,Integer> treeMap = new TreeMap<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                return o2.compareTo(o1);//字符串降序排序
            }
        });

        //2、添加元素
        treeMap.put("c01",18);
        treeMap.put("c02",19);
        treeMap.put("c03",20);
        treeMap.put("c04",21);
        treeMap.put("c05",22);


        //3、输出结果,按照字符串降序排序
        System.out.println(treeMap);//{c05=22, c04=21, c03=20, c02=19, c01=18}


        //4、创建TreeMap,没有创建比较器,要求实现Comparable接口,默认升序
        TreeMap<String,Integer> treeMap1=new TreeMap<>();
        treeMap1.putAll(treeMap);
        System.out.println(treeMap1);//{c01=18, c02=19, c03=20, c04=21, c05=22}

    }
}

7.2

public class Person implements Comparable<Person>{
    String name;
    int age;

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

    @Override
    public String toString() {
        return "{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    @Override
    public int compareTo(Person o) {
        return this.name.compareTo(o.name);
    }
}

 

/**
 * TreeMap中的键必须是可比较的
 *      要么指定Comparator比较器,要么实现Conparable
 * 
 */
public class Test10 {
    public static void main(String[] args) {

        TreeMap<Person,String> treeMap = new TreeMap<>(new Comparator<Person>() {
            @Override
            public int compare(Person o1, Person o2) {
                return o2.age-o1.age;
            }
        });

        treeMap.put(new Person("chu01",18),"一部");
        treeMap.put(new Person("chu02",19),"二部");
        treeMap.put(new Person("chu03",20),"三部");
        treeMap.put(new Person("chu04",21),"四部");


        System.out.println(treeMap);//{{name='chu04', age=21}=四部, {name='chu03', age=20}=三部, {name='chu02', age=19}=二部, {name='chu01', age=18}=一部}

        TreeMap<Person,String> treeMap1= new TreeMap<>(treeMap);
        System.out.println(treeMap1);//{{name='chu04', age=21}=四部, {name='chu03', age=20}=三部, {name='chu02', age=19}=二部, {name='chu01', age=18}=一部}


        TreeMap<Person,String> treeMap2=new TreeMap<>();
        treeMap2.putAll(treeMap1);
        System.out.println(treeMap2);//{{name='chu01', age=18}=一部, {name='chu02', age=19}=二部, {name='chu03', age=20}=三部, {name='chu04', age=21}=四部}


    }
}

 

posted @ 2019-07-11 09:41  旅行没有终点  阅读(237)  评论(0编辑  收藏  举报