集合--Map篇
(1)编写代码时使用类型参数来表示不同的数据类型。通俗地说,泛型就是将不同类型的数据通用化,可以在同一个类或方法中实现对不同数据类型的操作。(2)将不必要的控制台异常代码,换做编译时的代码错误,提高代码的健壮性,小部分提高代码效率。
目录
一,Map集合的概述及特点
1.1 概述:
- Map集合是一种双列集合,每个元素包含两个数据。
- Map集合的每个元素的格式:key=value(键值对元素)。
- Map集合也被称为“键值对集合”。
1.1.1Map集合体系图
说明:
- Map集合中HashMap是使用最多的
- 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集合元素按升序排序
常见的方法:
- 排序 :
sort()
- 查找 :
binarySearch()
- 比较:
equals()
- 填充 :
fill()
- 转列表:
asList()
- 转字符串 :
toString()
- 复制:
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一些常见方法:
sort()
:对数组进行排序,支持多种排序算法;binarySearch()
:在有序数组中查找指定元素的位置,返回元素所在索引,不存在时返回负数;copyOf()
:将一个数组的部分或全部元素复制到另一个数组中,返回新的数组;fill()
:使用指定值填充数组的所有元素;equals()
:比较两个数组是否相等,即数组长度相等,并且对应索引位置上的元素也相等;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集合的分享就到这里啦,感谢阅读!
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)