五、Map
Map接口的特点
1. 用于存储任意键值对(key - value) 2. 键:无序、无下标、不允许重复(唯一) 3. 值:无序、无下标、允许重复
方法:
1. V put(K key, V value) 将对象存到集合中,关联键值 2. Object get(Object key) 根据键获得对应的值 3. Set<K> 返回所有的Key 4. Collection<V> values() 返回包含所有值的Collection集合 5. Set<Map.Entry<K, V>> 键值匹配的Set集合
5.1 Map接口的使用
//创建Map集合 Map<String, String> map = new HashMap<>(); // 1. 添加元素 map.put("cn", "中国"); map.put("uk", "英国"); map.put("cn", "zhongguo"); // 会替换第一个 // 2. 删除 map.remove("uk"); // 3. 遍历 // 3.1 使用KeySet() //Set<String> keyset = map.keySet(); // 所有Key的set集合 for(String key : map.keyset){ sout(key + "---" + map.get(key)); } // 3.2 使用entrySet() //Set<Map.Entry<String, String>> entries = map.entrySet(); for(Map.Entry<String, String> entry : map.entries){ sout(entry.getKey() + "---" + entry.getValue(); }
5.2 HashMap 【重点】
存储结构:哈希表(数组+链表+红黑树)
使用key可使hashcode和equals作为重复
增、删、遍历、判断与上述一致
原码分析总结:
- HashMap刚创建时,table是null,节省空间,当添加第一个元素时,table容量调整为16
- 当元素个数大于阈值(16*0.75 = 12)时,会进行扩容,扩容后的大小为原来的两倍,目的是减少调整元素的个数
- 当每个链表长度 >8 ,并且数组元素个数 ≥64时,会调整成红黑
5.3 Hashtable
线程安全,运行效率慢;不允许null作为key或是value
5.4 Properties
hashtable的子类,要求key和value都是string,通常用于配置文件的读取
5.5 TreeMap
实现了SortedMap接口(是map的子接口),可以对key自动排序
六、Collection工具类
概念:集合工具类,定义了除了存取以外的集合常用方法
直接二分查找int i = Collections.binarySearch(list, x);
成功返回索引
其他方法 : copy复制、reverse反转、shuffle打乱
补充:
// list转成数组 Integer[] arr = list.toArray(new Integer[10]); sout(arr.length); sout(Array.toString(arr)); // 数组转成集合 // 此时为受限集合,不能 添加和删除! String[] name = {"张三","李四","王五"}; List<String> list2 = Arrays.asList(names); // 把基本类型数组转为集合时,需要修改为包装类 Integer[] nums = {100, 200, 300, 400, 500}; List<Integer> list3 = Arrays.asList(nums);