collection集合的全部都已经结束,但是我们发现他都是单列存在的集合,map则是双列存在的集合。
如图:
它是键值存在的集合,键是唯一的,但是值可以不唯一,但是必须一对一唯一。也就是不能重复的。
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>的数据类型可以相同,也可以不同。
如前文,集合
①创建对象
Map<string,interger> map=new hashmap <string,integer>();
②常用方法
③遍历重要
它的遍历方式非常特殊。
1.
2.
3.但因为它是通过返回一个set集合,借用set集合的遍历方法进行遍历,也就是说它可以用for或者迭代器Iterator来使用,两两配合,总共有四个方法
代码如下
package com.oracle.demo01; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Demo01 { public static void main(String[] args) { //创建map集合 hashmap是子类 Map<String,String> map=new HashMap<String,String>(); map.put("a", "123"); map.put("b", "456"); map.put("c", "123"); map.put("a", "147"); //重复的键值存储不了,但会把原先的覆盖掉 //get方法返回的是value值 System.out.println(map.get("a")); //遍历 //第一种,通过map的keySet()方法,调取key,通过key获取所有的set。 //keySet+增强for //1、获取所有key所在的Set集合 //多态 Set<String>set =map.keySet(); //增强for遍历set集合 System.out.println("-----------------------------------keyset()方法+增强for-"); for(String key:set){ System.out.println(key+"..."+map.get(key)); System.out.println("-----------------------------------keyset+Iterator-"); //第二种:keySet +Iterator Set<String> set1=map.keySet(); //遍历 用变量名.方法名() Iterator<String> iterator=set1.iterator(); while(iterator.hasNext()){ String key1=iterator.next(); System.out.println(key1+map.get(key1)); //创建map集合 hashmap是子类 } } } }
package com.oracle.demo01; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Set; public class Demo02 { public static void main(String[] args) { //创建map集合 Map<Integer,String>map=new HashMap<Integer,String>(); //put增加内容 map.put(1, "司南"); map.put(2, "周戎"); map.put(3, "楚慈"); //遍历 //1.entrySet+增强for //1.获取所有结婚证entry对象 System.out.println("==================entrySet+增强for"); Set<Map.Entry<Integer,String>> set=map.entrySet(); //2.遍历结婚证集合获取每一个结婚证entry对象 for(Map.Entry<Integer,String> entry :set){ //因为有返回值,所以接收一下 /* int key=entry.getKey(); String value=entry.getValue();*/ System.out.println(entry.getKey()+"..."+entry.getValue()); } //entry+Iterator System.out.println("==================entry+Iterator"); //1.获取所有结婚证对象所在的set集合 Set<Map.Entry<Integer, String>> set2=map.entrySet(); //2.获取iterator对象 这里需要提前声明泛型,要不后面需要向下转换 Iterator<Map.Entry<Integer, String>> it=set2.iterator(); //3.遍历循环 while(it.hasNext()){ //获取每一个结婚证对象这里必须要带有map.entry<>因为这才是里面返回的泛型 Map.Entry<Integer, String> entry1=it.next(); int key1=entry1.getKey(); String value1=entry1.getValue(); System.out.println(key1+"..."+value1); } } }
这里的hashmap集合如果泛型是自定义类,和set一样,需要重写hashcode和equals方法。就不多说了。(因为他是返回set的缘故)也因为hashset的缘故,它的LinkedHashMap也是保证顺序的集合呢。
比较少见的方法
1.静态导入
import static XXXimport static java.lang.System.out;.YYY; 导入后YYY可直接使用。
import static java.lang.System.out;
//导入静态
out.println("lalla");
2.可变参数
修饰符 返回值类型 方法名(参数类型... 形参名){ }
代码案例:
package com.oracle.demo02; import static java.lang.System.out; public class Demo01 { public static void main(String[] args) { //导入静态 out.println("lalla"); System.out.println(add(1,2)); System.out.println(add(2,3,4)); System.out.println(add(2,3,4,5)); System.out.println(add(2,3,4,5,6)); } //写一个方法,计算求和,方法类型可以 public static int add(int ...a){//double...b){//可变参数,int [] a数组,如果有另外的可变参数,需要把它写在后面,如果是限定死的参数,
就可以写在前面,好处就是可以无限制的传递参数,但一个里面只能写一个、 int sum=0; for(int s:a){ sum=sum+s; } return sum; } /*public static int add(int a,int b,int c){ return a+b; }*/ }
3.collections集合的工具类
好了,篇幅有点长,下一篇单纯补充两个案例。