Java集合框架之二
1. Map接口
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
l Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
l Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
l Collection中的集合称为单列集合,Map中的集合称为双列集合。
l 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
l Map中常用的集合为HashMap集合、LinkedHashMap集合。
2. Map接口中常用集合概述
通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。
l HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
l LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
l 注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。
3. Map接口中的常用方法
l put方法:将指定的键与值对应起来,并添加到集合中
n 方法返回值为键所对应的值
使用put方法时,若指定的键(key)在集合中没有,则没有这个键对应的值,返回null,并把指定的键值添加到集合中;
使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
l get方法:获取指定键(key)所对应的值(value)
l remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
1 /** 2 * 使用Map中的常用方法 3 * Map的实现类HashMap 4 * @author vanguard 5 * 6 */ 7 public class MapDemo { 8 public static void main(String[] args) { 9 function_2(); 10 } 11 12 /** 13 * 根据键,移除集合中的键值对,返回被移除之前的值 14 * V remove(K) 15 * 16 */ 17 private static void function_2() { 18 Map<String ,Integer> map = new HashMap<String, Integer>(); 19 map.put("a", 1); 20 map.put("b", 2); 21 map.put("c", 3); 22 System.out.println(map); 23 24 Integer value = map.remove("a"); 25 System.out.println(value); 26 System.out.println(map); 27 } 28 29 /** 30 * 根据指定的键,获取对象的值 31 * V get(K) 32 * 如果没有这个键,返回null 33 */ 34 private static void function_1() { 35 Map<String ,Integer> map = new HashMap<String, Integer>(); 36 map.put("a", 1); 37 map.put("b", 2); 38 map.put("c", 3); 39 40 Integer value = map.get("a"); 41 System.out.println(value); 42 } 43 44 /** 45 * 将键值存储到集合中 46 * V put(K, V) K作为键的对象,V作为值得对象 47 * 存储的是重复的键,会将原有的值覆盖 48 * 返回值,一般返回null 49 * 存储重复键的时候,返回覆盖之前的值 50 */ 51 public static void function() { 52 //创建集合对象,HashMap,存储对象,键是字符串类型,值是整型 53 Map<String, Integer> map = new HashMap<String, Integer>(); 54 map.put("abc", 1); 55 Integer i = map.put("abc", 1); 56 System.out.println(i); 57 map.put("bcd", 2); 58 map.put("cde", 3); 59 60 System.out.println(map); 61 } 62 }
4. Map集合遍历:键找值方式
键找值方式:即通过元素中的键,获取键所对应的值
操作步骤与图解:
1.获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键
2.遍历键的Set集合,得到每一个键
3.根据键,获取键所对应的值
1 /** 2 * Map集合的遍历 3 * 利用键获取值 4 * Map接口中定义方法keySet 5 * 所有的键,存储到Set集合 6 * 1. 调用map集合的方法keySet,所有的键存储到Set集合中 7 * 2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键) 8 * 3. 调用map集合方法get,通过键获取到值 9 * @author vanguard 10 * 11 */ 12 public class HashDemo01 { 13 public static void main(String[] args) { 14 Map<String, Integer> map = new HashMap<String, Integer>(); 15 map.put("abc", 1); 16 map.put("bcd", 2); 17 map.put("cde", 3); 18 System.out.println(map); 19 20 //1. 调用map集合的方法keySet,所有的键存储到Set集合中 21 Set<String> set = map.keySet(); 22 //2. 遍历Set集合,获取出Set集合中的所有元素 (Map中的键) 23 Iterator<String> it = set.iterator(); 24 while(it.hasNext()) { 25 String key = it.next(); 26 //3. 调用map集合方法get,通过键获取到值 27 Integer value = map.get(key); 28 System.out.println(key + "..." + value); 29 } 30 31 System.out.println("====================="); 32 //利用增强for循环遍历 33 for(String key : map.keySet()) { 34 Integer value = map.get(key); 35 System.out.println(key + "..." + value); 36 } 37 } 38 }
5. Entry键值对对象
在Map类设计时,提供了一个嵌套接口:Entry。Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
l Entry是Map接口中提供的一个静态内部嵌套接口。
l getKey()方法:获取Entry对象中的键
l getValue()方法:获取Entry对象中的值
entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
6. Map集合遍历:键值对方式
键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。
操作步骤与图解:
1.获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。
2.遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象
3.通过键值对(Entry)对象,获取Entry对象中的键与值。
/** * Map集合获取方式 * entrySet方法,键值对映射关系 * 实现步骤: * 1. 调用Map集合方法entrySet()将集合映射关系对象存储到set集合中 * set<Entry <K, V>> * 2. 迭代遍历Set集合 * 3. 获取出Set集合的元素,是映射关系对象 * 4. 通过映射关系对象方法 getKey() getValue() 获取键值对 * * 创建内部类对象:外部类.内部类 变量名 = new 外部类.内部类() * @author vanguard * */ public class HashDemo02 { public static void main(String[] args) { Map<String, Integer> map = new HashMap<String, Integer>(); map.put("abc", 1); map.put("bcd", 2); map.put("cde", 3); System.out.println(map); //1. 调用Map集合方法entrySet()将集合映射关系对象存储到set集合中 Set<Entry<String, Integer>> set = map.entrySet(); //2. 迭代遍历Set集合 Iterator<Entry<String, Integer>> it = set.iterator(); while(it.hasNext()) { //3. 获取出Set集合的元素,是映射关系对象 Entry<String, Integer> entry = it.next(); //4. 通过映射关系对象方法 getKey() getValue() 获取键值对 String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + "..." + value); } System.out.println("=================="); //利用增强for循环 for(Entry<String, Integer> entry : map.entrySet()) { String key = entry.getKey(); Integer value = entry.getValue(); System.out.println(key + "..." + value); } } }
7. Collections集合工具类
Collections是集合工具类,用来对集合进行操作。部分方法如下:
public static <T> void sort(List<T> list) // 集合元素排序
//排序前元素list集合元素 [33,11,77,55]
Collections.sort( list );
//排序后元素list集合元素 [11,33,55,77]
public static void shuffle(List<?> list) // 集合元素存储位置打乱
//list集合元素 [11,33,55,77]
Collections.shuffle( list );
//使用shuffle方法后,集合中的元素为[77,33,11,55],每次执行该方法,集合中存储的元素位置都会随机打乱