【集合】Map概述,Map与Collection的区别,Map的方法、集合的遍历,HashMap和Hashtable的区别,ArrayList嵌套,LinkedHashMap,TreeMap,Coll

阅读: 评论:0

【集合】Map概述,Map与Collection的区别,Map的方法、集合的遍历,HashMap和Hashtable的区别,ArrayList嵌套,LinkedHashMap,TreeMap,Coll

【集合】Map概述,Map与Collection的区别,Map的方法、集合的遍历,HashMap和Hashtable的区别,ArrayList嵌套,LinkedHashMap,TreeMap,Coll

Map集合

1. Map接口的概述

将键映射到值的对象。
Map不能包含重复的键;
每个键可以映射到最多一个值。

举例: <K,V> 键值对
1001 王宇
1002 周家祥
1001 周家祥(不允许)
Map集合中,K的值不能重复

2. Map接口与Collection接口有什么区别?

Map接口与Collection接口有什么区别?
1、Map接口与Collection接口是平级关系,不存在继承关系,都是属于util包下面的
2、Map集合中的元素都是成对出现的,Map集合中的键是唯一的,值是可以重复的 又称之为:夫妻对
3、Collection集合中的元素都是单独出现的,Collection接口下面有个子接口Set,它的元素也是唯一的
List中的元素也是单独出现,可以重复,像这样单独出现的元素,称之为:光棍

3. Map接口中的方法:

1、添加功能:
V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。
举例:map.put(1001,“王宇”);

2、删除功能:
void clear() 从该Map中删除所有的映射(可选操作)。
V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。

3、判断功能:
boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。
boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。
boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。

4、获取功能:
V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
Set keySet() 返回此Map中包含的键的Set视图。
Collection values() 返回此Map中包含的值的Collection视图
Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成

5、长度功能:
int size() 返回此Map中键值映射的数量。

public class MapDemo1 {public static void main(String[] args) {//创建Map集合对象//由于Map是一个接口,所以接口不能直接实例化,要使用一个具体的子类进行实例化//这里借助HashMapHashMap<String, String> map = new HashMap<>();//添加元素//V put(K key, V value) 将指定的值与该映射中的指定键相关联(可选操作)。//这里的返回值是将来再次插入同一个键的时候,被覆盖的那个值map.put("唐三","小舞");map.put("沐白","竹清");map.put("唐晨","婆塞西");map.put("唐三","小舞");//2、删除功能://void clear() 从该Map中删除所有的映射(可选操作)。//  map.clear();//System.out.println(map);//{}//V remove(Object key) 如果存在(从可选的操作),从该Map中删除一个键的映射。//   String s = ve("唐三");//  System.out.println(s);//小舞// System.out.println(map);//{沐白=竹清, 唐晨=婆塞西}//   3、判断功能://   boolean containsKey(Object key) 如果此映射包含指定键的映射,则返回 true 。System.out.ainsKey("沐白"));//true//  boolean containsValue(Object value) 如果此地图将一个或多个键映射到指定的值,则返回 true 。System.out.ainsValue("小舞"));//true//boolean isEmpty() 如果此地图不包含键值映射,则返回 true 。System.out.println(map.isEmpty());//false}
}

结果:

4. Map集合的获取功能:

V get(Object key) 返回到指定键所映射的值,或 null如果此映射包含该键的映射。
Set keySet() 返回此Map中包含的键的Set视图。
Collection values() 返回此Map中包含的值的Collection视图

public class MapDemo2 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(10001,"神");map.put(10002,"封号斗罗");map.put(10003,"斗王");map.put(10004,"斗圣");//V get(Object key) 返回到指定键所映射的值,或 null//如果此映射包含该键的映射。String s = (10002);String s1 = (100000);System.out.println(s);//封号斗罗System.out.println(s1);//nullSystem.out.println("================================");// Set<K> keySet() 返回此Map中包含的键的Set视图。可//以用来遍历集合Set<Integer> num = map.keySet();for (Integer num1:num){String s2 = (num1);System.out.println(num1+"-------"+s2);}/*10001-------神10002-------封号斗罗10003-------斗王10004-------斗圣*///Collection<V> values() 返回此Map中包含的值的//Collection视图,就是得到所有的值Collection<String> values = map.values();for (String s2:values)System.out.println(s2);////封号斗罗//      斗王//斗圣}}

结果:

5.Map集合的遍历

集合遍历的方式一:根据键找值
1、通过调用keySet()方法获取Map集合中所有的key
2、结合get(key)这个方法,可以获取到每一个key对应的value
3、输出

集合遍历的方式二: /一次先把所有的键值对获取到
//Set<Map.Entry<K,V>> entrySet() 获取Map中所有元素,元素的类组成是由一个键和一个值组成


```java
public class MapDemo3 {public static void main(String[] args) {HashMap<String, String> map = new HashMap<>();map.put("猴子","露娜");map.put("猪八戒","嫦娥");map.put("周瑜","小巧");map.put("猴子","紫霞");System.out.println("==============第一种遍历==============");// 集合遍历的方式一:根据键找值Set<String> set = map.keySet();for (String s:set) {String s1 = (s);System.out.println(s + "------" + s1);}/*猴子------紫霞猪八戒------嫦娥周瑜------小巧*///  集合遍历的方式二: /一次先把所有的键值对获取到//  Set<Map.Entry<K,V>> entrySet() 获取Map中//所有元素,元素的类组成是由一个键和一个值组成System.out.println("=============第二种遍历==============");Set<Map.Entry<String, String>> set1 = Set();for ( Map.Entry<String,String> s2:set1){String key = s2.getKey();String value = s2.getValue();System.out.println(key+"------"+value);}
/*==============第一种遍历==============
猴子------紫霞
猪八戒------嫦娥
周瑜------小巧
=============第二种遍历==============
猴子------紫霞
猪八戒------嫦娥
周瑜------小巧

结果:
举例:
HashMap<Integer,String>类型

public class MapDemo4 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<>();map.put(001,"斗帝");map.put(002,"斗宗");map.put(003,"斗皇");map.put(004,"斗师");map.put(005,"斗王");Set<Integer> num = map.keySet();for (Integer s:num){String s1 = (s);System.out.println(s+"----------"+s1);}Set<Map.Entry<Integer, String>> s2 = Set();for (Map.Entry<Integer,String> s3:s2){String value = s3.getValue();Integer key = s3.getKey();System.out.println(key+"-----------------"+value);}}
}

6.HashMap<Student,String>如果key是自己自定义的一个对象,该类需要重写hashCode()方法和equals()方法 因为put方法的底层,添加元素的标准就是根据hashCode()方法和equals()的值来判断元素是否重复

import java.security.Key;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;public class MapDemo5 {public static void main(String[] args) {HashMap<Student, String> map = new HashMap<>();Student s1 = new Student("小明", 18);Student s2 = new Student("小型", 19);Student s3 = new Student("大蛇", 34);Student s4 = new Student("小明", 18);;map.put(s1,"帅气逼人");map.put(s2,"人见人爱");map.put(s3,"花见花开");map.put(s4,"花见");Set<Map.Entry<Student, String>> entries = Set();for (Map.Entry<Student,String> s:entries){Student key = s.getKey();String value = s.getValue();System.out.println(key+"-------------"+value);/*结果:是去重(只有当key值相同时才会自动去重,value值随意),且是有序的。Student{name='小明', age=18}-------------花见Student{name='小型', age=19}-------------人见人爱Student{name='大蛇', age=34}-------------花见花开*/}}
}

结果:

7. 面试题:HashMap和Hashtable的区别

1、HashMap与Hashtable它们存储的元素都是一个一个的键值对
2、HashMap中的key和value允许为null值,而Hashtable不允许
3、Hashtable是线程安全的,而HashMap是线程不安全的

public class HashMapAndHashtable {public static void main(String[] args) {HashMap<String, String> map1 = new HashMap<>();map1.put(null,"123");map1.put("111",null);map1.put(null,null);System.out.println(map1);//{null=null, 111=null}Hashtable<String, String> map2 = new Hashtable<>();//   map2.put(null,"123"); //Hashtable元素中的key不允许//为null
//     map2.put("111",null); //Hashtable元素中的value不允
//许为null// map2.put(null,null);//nullPointerExceptionSystem.out.println(map2);}
}

结果:

8.ArrayList嵌套HashMap

public class ArrayListAndHashMap8 {public static void main(String[] args) {ArrayList<HashMap<Integer, String>> list = new ArrayList<>();HashMap<Integer, String> map1 = new HashMap<>();HashMap<Integer, String> map2= new HashMap<>();map1.put(1,"鸣人");map1.put(2,"佐助");map1.put(3,"小樱");map2.put(01,"大将");map2.put(02,"大校");map2.put(03,"大尉");list.add(map1);list.add(map2);for (HashMap<Integer,String> s:list){Set<Map.Entry<Integer, String>> entries = s.entrySet();for (Map.Entry<Integer,String> s2:entries ){Integer key = s2.getKey();String value = s2.getValue();System.out.println(key+"-------------"+value);}}}
}

结果:

9.LinkedHashMap:

class LinkedHashMap extends HashMap implements Map{}
哈希表和链表实现的Map接口,具有可预测的迭代次序。
哈希保证的是元素的唯一,保证key是唯一
链表保证是有序的(存储和取出的顺序一致)

import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;public class LinkdHashMapDemo7 {public static void main(String[] args) {LinkedHashMap<Integer, String> map = new LinkedHashMap<>();map.put(11,"凯");map.put(8,"露娜");map.put(2,"鲁班");map.put(99,"关羽");map.put(11,"芈月");map.put(18,"凯");Set<Map.Entry<Integer, String>> entries = Set();for (Map.Entry<Integer,String> s:entries){Integer key = s.getKey();String value&#Value();System.out.println(key+"------------"+value);/*11------------芈月8------------露娜2------------鲁班99------------关羽18------------凯*/}}
}

结果:

10. TreeMap:键是基于红黑树结构存储的,可以保证键的排序和唯一性

####(1)
键:String
值:String

public class TreeMApDemo8 {public static void main(String[] args) {TreeMap<String, String> map = new TreeMap<>();map.put("hello", "你好");map.put("world", "世界");map.put("java", "面向对象的编程语言");map.put("mysql", "结构化数据库");Set<Map.Entry<String, String>> entries = Set();for (Map.Entry<String,String> s:entries){String value = s.getValue();String key = s.getKey();System.out.println(key+"-----------"+value);/*结果:按照key的值进行排序利用comparaTor()方法进行比较hello-----------你好java-----------面向对象的编程语言mysql-----------结构化数据库world-----------世界*/}}
}

结果:

(2) TreeMap<Student,String>

键:Student 键的存储是红黑树结构存储,可以保证键的排序和唯一
值:String

public class TreeMapDemo2 {public static void main(String[] args) {TreeMap<Student21, String> map = new TreeMap<>(new Comparator<Student21>() {@Overridepublic int compare(Student21 o1, Student21 o2) {int i1&#Age()-o2.getAge();int i2=i1==Name()Name()):i1;return i2;}});Student21 s1 = new Student21("晓燕", 23);Student21 s2 = new Student21("腿姐", 34);Student21 s3 = new Student21("张宇", 30);map.put(s1,"英语");map.put(s2,"政治");map.put(s3,"数学");Set<Map.Entry<Student21, String>> entries = Set();for (Map.Entry<Student21,String> s:entries){Student21 key = s.getKey();String value = s.getValue();System.out.println(key+"--------------"+value);/*Student21{name='晓燕', age=23}--------------英语Student21{name='张宇', age=30}--------------数学Student21{name='腿姐', age=34}--------------政治*/}}
}

Student类:

package com.shujia.wyh.day02.day20;public class Student21 {private String name;private int age;public Student21(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student21{" +"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;}
}

(3)“aababcabcdabcde”,获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)

分析:
1、定义一个字符串(后期可用键盘录入改进)
2、定义一个TreeMap对象存储数据
键:Character
值:Integer
3、将字符串转成字符数组
4、遍历字符数组,得到每一个字符
5、拿着这个字符作为键去map集合中去找,看返回值
如果返回值是null,表示集合中没有该字符作为键,就把当前这个字符设置为键,value设置为1
如果返回值不是null,说明集合中已经存在这个字符作为键,value值+1,然后重新放入到集合中
6、定义一个StringBuffer作为拼接
7、遍历集合得到键和值,按照对应的输出格式进行拼接
8、把StringBuffer输出

输入:aababcabcdabcde
输出:a(5)b(4)c(3)d(2)e(1)

import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeMap;public class TreeMapDemo3 {public static void main(String[] args) {Scanner sc=new Scanner(System.in);System.out.println("请输入一个字符串:");String  s&#();TreeMap<Character, Integer> map = new TreeMap<>();char[] chars = s.toCharArray();for (Character character:chars){Integer integer = (character);if (integer==null){map.put(character,1);}else {integer++;map.put(character,integer);}}StringBuffer stringBuffer = new StringBuffer();Set<Map.Entry<Character, Integer>> entries = Set();for (Map.Entry<Character,Integer> s2:entries){Character key = s2.getKey();Integer value = s2.getValue();stringBuffer.append(key).append("(").append(value).append(")");}System.out.println(stringBuffer);}}

结果:

二.Collections工具类的概述:

针对集合操作的工具类

Collections与Collection的区别:
1、Collection是单列集合的顶层接口,有两大子接口List/Set
2、Collections是一个针对于集合操作的工具类,可以对集合进行排序,还有查找(二分查找)

public static void sort(List list)
public static int binarySearch(List<?> list,T key)
public static T max(Collection<?> coll)
public static void reverse(List<?> list)
public static void shuffle(List<?> list)

static List synchronizedList(List list) 返回由指定列表支持的同步(线程安全)列表。

public class CollectionsDemo9 {public static void main(String[] args) {ArrayList<Integer> list1 = new ArrayList<>();Collections.synchronizedList(list1);//变为线性安全的list1.add(10);list1.add(30);list1.add(20);list1.add(70);list1.add(40);list1.add(50);System.out.println("排序前的集合为:"+list1);Collections.sort(list1);System.out.println("排序后的集合为"+list1);int i = Collections.binarySearch(list1, 20);System.out.println("20德索引为:"+i);System.out.println("集合中的最大数为:"+Collections.max(list1));verse(list1);System.out.println("反转后的集合为:"+list1);Collections.shuffle(list1);System.out.println("随机置换后的集合为:"+list1);}
}

结果:

本文发布于:2024-02-01 07:52:26,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170674514835011.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:区别   遍历   嵌套   方法   Map
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23