三十四、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}=四部} } }
当有些人一出生就有的东西,我们要为之奋斗几十年才拥有。但有一样东西,你一辈子都不会有,那就是我们曾经一无所有。