Map接口:
Map集合中的每个元素由键和值2部分组成,通过键可以找到相应的值,Collection的集合为单列集合,Map的集合为双列集合,Map的集合不能不含重复的键,值可以重复,每个键只能对应一个值。
常用的方法:
Map接口常用的集合:
HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。也就是说,当给HashMap中存放自定义对象时,如果自定义对象作为key存在,这时要保证对象唯一,必须复写对象的hashCode和equals方法。
LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。如果要保证map中存放的key和取出的顺序一致,可以使用LinkedHashMap集合来存放。
注意事项:两个泛型变量<K,V>的数据类型可以相同,也可以不同。
Map集合遍历:
键找值方式:即通过元素中的键,获取键所对应的值。
1:获取Map集合中所有的键,由于键是唯一的,所以返回一个Set集合存储所有的键。
2:遍历键的Set集合,获取每一个键。
3:根据键,获取键所对应的值。
Map集合方法:keySet()得到Map集合中所有的键。
get(Object key):通过指定的键,从Map集合中找到相应的值。
代码体现:
public static void main(String[] args) { HashMap<String,Integer> map=new HashMap<String,Integer>(); map.put("张三",18); map.put("李四",18); map.put("张三",18); //map.remove("李四"); //System.out.println(map.get("李四")); //keySet+增强for循环 //1:获取所有key所在的Set集合 Set<String> set=map.keySet(); //2:遍历Set集合获取对应的value值 for(String key:set){ System.out.println(key+"..."+map.get(key)); } //2:keySet+Iterator迭代器 Set<String> set2=map.keySet(); Iterator<String> it=set2.iterator(); while(it.hasNext()){ String b=it.next(); System.out.println(b+"..."+map.get(b)); } }
Entry键值对对象:
Entry是一个嵌套接口,类似于成员内部类,Entry将键值对应的关系封装成了对象,即键值对对象,当遍历Map集合时,可以从每一个键值对(Entry)对象中获取对应的键与对应的值。
Entry是Map接口中提供的一个静态内部嵌套接口。
接口Map<k,v>
接口Map.Entry<k,v>
getKey()方法:获取Entry对象中的键。
getValue()方法:获取Entry对象中的值。
entrySet()方法:用于返回Map集合中所有的键值对(Entry)对象,以Set集合形式返回。
步骤:
键值对方式:即通过集合中的每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值
1:获取Map集合中的键值对(Entry)对象,以Set集合形式返回。
2:遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
3:通过键值对(Entry)对象,获取Entry对象中的键与值。
注意事项:Map集合不能直接使用迭代器或者foreach进行遍历。但是转成Set之后就可以使用了。因为他与迭代器与Collection没有任何关系。
代码体现:
public class Demo02 { public static void main(String[] args) { HashMap<Person, String> map = new HashMap<Person, String>(); map.put(new Person("张三", 18), "java0803"); map.put(new Person("张三", 18), "java0803"); map.put(new Person("李四", 20), "java0903"); map.put(new Person("王五", 21), "java0903"); //1:entrySet+增强for //获取所有结婚证所在的Set集合 Set<Map.Entry<Person,String>> set=map.entrySet(); //遍历Set集合,取到每一个结婚证对象 for(Map.Entry<Person,String> entry:set){ System.out.println(entry.getKey()+"..."+entry.getValue()); } //entrySet+Iterator迭代器 Set<Map.Entry<Person,String>> set2=map.entrySet(); Iterator<Map.Entry<Person,String>> it=set2.iterator(); while(it.hasNext()){ Map.Entry<Person,String> a=it.next(); System.out.println(a.getKey()+"..."+a.getValue()); } }
静态导入:
在导包的过程中我们可以直接导入静态部分,这样某个类的静态成员就可以直接使用了。在源码中经常会出现静态导入。
可变参数:我们定义一个方法需要接受多个参数,并且多个参数类型一致,我们可以对其简化成如下格式:
修饰符 返回值类型 方法名(参数类型... 形参名){ }==修饰符 返回值类型 方法名(参数类型[] 形参名){ },只是后面这种定义,在调用时必须传递数组,而前者可以直接传递数据即可。
同样是代表数组,但是在调用这个带有可变参数的方法时,不用创建数组(这就是简单之处),直接将数组中的元素作为实际参数进行传递,其实编译成的class文件,将这些元素先封装到一个数组中,在进行传递。这些动作都在编译.class文件时,自动完成了。
注意事项:只能出现一次,可变参数一定要写在参数列表的末尾位置。
代码体现:
package com.oracle.demo01; import static java.lang.System.out; public class Demo03 { public static void main(String[] args) { out.println(add(44,55)); out.println(add(44,55,99)); } public static int add(int...a){ int sun=0; for(int b:a){ sun+=b; } return sun; } }
collections集合工具类:
Collections是集合工具类,用来对集合进行操作。
四种集合嵌套代码体现:
1:
public static void main(String[] args) { HashMap<String, HashMap<Person,String>> map =new HashMap<String, HashMap<Person,String>>(); //创建2个小map HashMap<Person,String> java0803=new HashMap<Person,String>(); HashMap<Person,String> java0903=new HashMap<Person,String>(); java0803.put(new Person("小红帽",18), "山东淄博"); java0803.put(new Person("大灰狼",18), "山东济南"); java0903.put(new Person("小白兔",20), "山东淄博"); java0903.put(new Person("派大星",21), "山东济南"); map.put("java0803", java0803); map.put("java0903", java0903); Set<String> bigKeys=map.keySet(); for(String bigkey:bigKeys){ HashMap<Person,String> smallMap=map.get(bigkey); Set<Person> smallkeys=smallMap.keySet(); for(Person skey:smallkeys){ String svalue=smallMap.get(skey); System.out.println(bigkey+"..."+skey+"..."+svalue); } } }
2:
public static void main(String[] args) { HashMap<String, HashMap<Person,String>> map =new HashMap<String, HashMap<Person,String>>(); HashMap<Person,String> java0803=new HashMap<Person,String>(); HashMap<Person,String> java0903=new HashMap<Person,String>(); java0803.put(new Person("小红帽",18), "山东淄博"); java0803.put(new Person("大灰狼",18), "山东济南"); java0903.put(new Person("小白兔",20), "山东淄博"); java0903.put(new Person("派大星",21), "山东济南"); map.put("java0803", java0803); map.put("java0903", java0903); Set<String> bigkeys=map.keySet(); Iterator<String> it=bigkeys.iterator(); while(it.hasNext()){ String bigkey=it.next(); HashMap<Person,String> smallmap=map.get(bigkey) ; Set<Person> skeys=smallmap.keySet(); Iterator<Person> itt=skeys.iterator(); while(itt.hasNext()){ Person skey=itt.next(); String svalue=smallmap.get(skey); System.out.println(bigkey+"..."+skey+"..."+svalue); } } }
3:
Set<Map.Entry<String, HashMap<Person,String>>> bigentrys= map.entrySet(); for(Map.Entry<String, HashMap<Person,String>> bigentry:bigentrys){ String bigkey=bigentry.getKey(); HashMap<Person,String> smallMap=bigentry.getValue(); Set<Map.Entry<Person, String>> sentrys=smallMap.entrySet(); for(Map.Entry<Person, String> sentry:sentrys){ Person skey=sentry.getKey(); String svalue=sentry.getValue(); System.out.println(bigkey+"..."+skey+"..."+svalue); } } }
4:
Set<Map.Entry<String, HashMap<Person,String>>> bigkeys =map.entrySet(); Iterator<Map.Entry<String, HashMap<Person,String>>> it= bigkeys.iterator(); while(it.hasNext()){ Map.Entry<String, HashMap<Person,String>> bigenrys=it.next(); String bigkey=bigenrys.getKey(); HashMap<Person,String> smallMap=bigenrys.getValue(); Set<Map.Entry<Person,String>> sentrys=smallMap.entrySet(); Iterator<Map.Entry<Person,String>> itt=sentrys.iterator(); while(itt.hasNext()){ Map.Entry<Person,String> sentry=itt.next(); Person skey=sentry.getKey(); String svalue=sentry.getValue(); System.out.println(bigkey+"..."+skey+"..."+svalue); } } }