目录

一,Map集合的概述及特点

1.1 概述:

1.2特点:

二,Map遍历方式(两种)

2.1实现方式:

2.1.1第一种KeySet:

2.2.1第二种entrySet:

三,字符串出现次数

 四,泛型

4.1概述

4.1.1不加泛型的操作使用:

4.1.2加泛型的操作使用:

五,工具类的使用

5.1Collections方法使用

5.2Arrays方法的使用:


一,Map集合的概述及特点

1.1 概述:

  1. Map集合是一种双列集合,每个元素包含两个数据。
  2. Map集合的每个元素的格式:key=value(键值对元素)。
  3. Map集合也被称为“键值对集合”。

1.1.1Map集合体系图

说明:

  1.    Map集合中HashMap是使用最多的
  2.    HashTable相比HashMap线程安全  且jdk1.8以下存储值不能为null值

1.2特点:

Map集合的特点都是由键决定的。
Map集合的键是无序,不重复的,无索引的,值不做要求(可以重复)。
Map集合后面重复的键对应的值会覆盖前面重复键的值。
Map集合的键值对都可以为null。

   

Map集合实例:      

package com.LiuBing;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo1 {
	public static void main(String[] args) {
         Map map = new HashMap<>();//定义一个Map集合
	     map.put("name", "小王");//添加数据
	     map.put("age", 55);
	     map.put("sex", "男");
//         map.put("a", 1);
//         map.put("b", 2);
//         map.put("c", 3);
	     System.out.println(map);//输出
	     Object remove = map.remove("name");//删除 返回的是键对应的值
	     System.out.println(remove);
	     
	     map.put("sex", "女");//修改 采用的也是put方法 覆盖之前键值对内容
	     System.out.println(map);
	     
	    
	     System.out.println(map.get("age"));//单条键查询  返回value
	   
	
	}      
}

运行控制台输出:

二,Map遍历方式(两种)

2.1实现方式:

2.1.1第一种KeySet:

(1)使用Map集合中的方法keySet(),把Map集合所有的key取出来,存储到一个Set集合

(2)遍历set集合,获得Map集合中的每一个key

(3)通过Map集合中的方法get(key),通过key找到value

2.2.1第二种entrySet:

(1)Map.entrySet()把map的键值映射成Set集合

(2)Map.entrySet迭代器会生成EntryIterator,其返回的实例是一个包含key/value键值对的对象

(3)getKey(): 返回键值对的key

(4)getValue(): 返回键值对的value

Map两种遍历方式案例:

package com.LiuBing;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class Demo1 {
	public static void main(String[] args) {
         Map map = new HashMap<>();//定义一个Map集合
	     map.put("name", "小王");//添加数据
	     map.put("age", 55);
	     map.put("sex", "男");
	     //两种遍历方式
	     //遍历方式1 根据所有key拿值  
	     Set keySet = map.keySet();
         for (Object key : keySet) {
			System.out.println("键:"+key+"值:"+map.get(key));
		}
         
         //方式二 映射遍历
         Set entrySet = map.entrySet();
         for (Object object : entrySet) {
			Map.Entry entry= (Entry) object;
			System.out.println(entry.getKey()+":"+entry.getValue());
		}
	
	
	}      
}

运行控制台输出:

三,字符串出现次数

   实现步骤:

1 将字符串转为字符数组

2 遍历字符数组且定义一个HashMap集合

3 将字符数组保存到map集合中 返回Integer 

4 判断value

5 如果value值为空 默认给该集合值为1   反之value值叠加1(覆盖形式)

6 最后再遍历Map集合

代码实现:

package com.LiuBing;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class Demo2 { 
	public static void main(String[] args) {
		
		 String str ="qwertyuuytrewqwertyhsafqgrhwqe54tefrfqrtqfgaffffff";//定义一个字符串
	        char[] charArray= str.toCharArray();//转成一个数组容器 
	        Map<Character,Integer> map= new HashMap<>();//定义一个Map集合 
	        for (char c : charArray) {//遍历字符数组 
				Integer value = map.get(c);
				//如果集合中的键存在和该字符一样的值,那么就在原有的值上加1,覆盖掉原来的键值
				if(value==null) {//判断如果值等于空
					map.put(c, 1);//默认为一
				}else {//否则
					map.put(c, value+1);//将值加1
				}
			}
	       //Entry遍历
	        Set<Entry<Character, Integer>> entrySet = map.entrySet();
	        for (Entry<Character, Integer> entry : entrySet) {
                 System.out.println(entry.getKey()+":"+entry.getValue());
			}
	       
	}
        
}

控制台运行输出:

 四,泛型

4.1概述

    (1)编写代码时使用类型参数来表示不同的数据类型。通俗地说,泛型就是将不同类型的数据通用化,可以在同一个类或方法中实现对不同数据类型的操作。

    (2)将不必要的控制台异常代码,换做编译时的代码错误,提高代码的健壮性,小部分提高   代码效率

4.1.1不加泛型的操作使用:

实操代码:

     会发现以上代码没有系统报错,大多数人以为没有问题,但是一运行就会异常报错(下图)

     因为数据中有字符串,无法转型,那为什么不在编译就提示有代码问题出来呢?

这就体现出泛型应用了,也在上方泛型的概述中提到过将不同类型的数据通用化,

4.1.2加泛型的操作使用:

实操代码:

public class Demo3 { 
	public static void main(String[] args) {
	     HashSet<Integer> set =new HashSet<>();//定义一个Set集合
	     set.add(1);
	     set.add(2);
	     set.add(3);
	     set.add(4);
	     set.add(5);
	     set.add(6);
//	     set.add("Java很nice"); //此行数据不能添加  因泛型的指定只能插入指定的类型数据  17行
      	  for (Object object : set) {//遍历set
		  if(Integer.valueOf(object.toString())!=0) {
		  System.out.println(object);
		}
	}
	     
	}
        
}

运行台输出:

     说明: 会发现在集合后面加了一个指定的数据类型,这就是泛型,将操作的数据类型统一化只能操作你指定的数据类型,并且操作其他的数据类型会报出编译时的错误,而加泛型的使用则不会

五,工具类的使用

5.1Collections方法使用

     Collections中的一些方法需要实现自然排序接口进行排序

    sort(List );根据元素的自然排序对指定的List集合元素按升序排序  

    常见的方法:

  1. 排序 : sort()
  2. 查找 : binarySearch()
  3. 比较: equals()
  4. 填充 : fill()
  5. 转列表: asList()
  6. 转字符串 : toString()
  7. 复制: copyOf()

实操代码:

package com.LiuBing;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class Demo4 {
	public static void main(String[] args) {
		List<Person> list = new ArrayList<Person>();// 定义一个Set集合
		list.add(new Person("a", 123));
		list.add(new Person("b", 12));
		list.add(new Person("c", 321));
		list.add(new Person("d", 1223));
		Collections.sort(list);
		System.out.println("========默认排序===========");
		System.out.println(list);
		System.out.println("=======根据年龄降序============");
		Collections.sort(list, (x,y)-> y.getAge()-x.getAge());
        System.out.println(list);
	}

}

class Person implements Comparable<Person> {
	private String name;
	private int age;

	public Person() {
		// TODO Auto-generated constructor stub
	}

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

                                                   控制台输出:

5.2Arrays方法的使用:

5.2.1一些常见方法:

  1. sort():对数组进行排序,支持多种排序算法;
  2. binarySearch():在有序数组中查找指定元素的位置,返回元素所在索引,不存在时返回负数;
  3. copyOf():将一个数组的部分或全部元素复制到另一个数组中,返回新的数组;
  4. fill():使用指定值填充数组的所有元素;
  5. equals():比较两个数组是否相等,即数组长度相等,并且对应索引位置上的元素也相等;
  6. toString():将数组转换为字符串形式。

 实操代码:

package com.LiuBing;
import java.util.Arrays;
public class Demo5 {
	public static void main(String[] args) {
		
	
	 int[] arr = {5, 8, 3, 2, 1, 9, 7, 6, 4};
     
     // 排序
     Arrays.sort(arr);
     System.out.println("排序后的数组:" + Arrays.toString(arr));
     
     // 查找元素位置
     int index = Arrays.binarySearch(arr, 9);
     System.out.println("9在数组中的位置:" + index);
     
     // 复制数组
     int[] arr2 = Arrays.copyOf(arr, 5);
     System.out.println("arr2数组:" + Arrays.toString(arr2));
     
     // 填充数组
     int[] arr3 = new int[5];
     Arrays.fill(arr3, 3);
     System.out.println("arr3数组:" + Arrays.toString(arr3));
     
     // 比较两个数组是否相等
     int[] arr4 = {5, 8, 3, 2, 1, 9, 7, 6, 4};
     boolean isEqual = Arrays.equals(arr, arr4);
     System.out.println("arr和arr4是否相等:" + isEqual);
}
}

                                                     控制台输出结果:

  好啦,今天的Map集合的分享就到这里啦,感谢阅读!

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐