第07天 集合
今日内容介绍
    HashSet集合
    HashMap集合
第1章 HashSet集合
1.1 Set接口的特点
Set体系的集合:A:存入集合的顺序和取出集合的顺序不一致B:没有索引C:存入集合的元素没有重复
1.2 HashSet使用&唯一性原理
1.2.1   HashSet的使用
1.2.1.1 案例代码一:public class HashSetDemo2 {public static void main(String[] args) {//创建集合对象HashSet<Student> hs = new HashSet<Student>();//创建元素对象Student s = new Student("zhangsan",18);Student s2 = new Student("lisi",19);Student s3 = new Student("lisi",19);//添加元素对象hs.add(s);hs.add(s2);hs.add(s3);//遍历集合对象for (Student student : hs) {System.out.println(student);}}}
1.2.2   HashSet唯一性原理规则:新添加到HashSet集合的元素都会与集合中已有的元素一一比较首先比较哈希值(每个元素都会调用hashCode()产生一个哈希值)如果新添加的元素与集合中已有的元素的哈希值都不同,新添加的元素存入集合如果新添加的元素与集合中已有的某个元素哈希值相同,此时还需要调用equals(Object obj)比较如果equals(Object obj)方法返回true,说明新添加的元素与集合中已有的某个元素的属性值相同,那么新添加的元素不存入集合如果equals(Object obj)方法返回false, 说明新添加的元素与集合中已有的元素的属性值都不同, 那么新添加的元素存入集合
1.2.2.1 案例代码二:package com.itheima_01;import java.util.HashSet;/**   使用HashSet存储自定义对象并遍历     *   通过查看源码发现:*               HashSet的add()方法,首先会使用当前集合中的每一个元素和新添加的元素进行hash值比较,*                如果hash值不一样,则直接添加新的元素*                如果hash值一样,比较地址值或者使用equals方法进行比较*             比较结果一样,则认为是重复不添加*                所有的比较结果都不一样则添加*/
public class HashSetDemo2 {public static void main(String[] args) {//创建集合对象HashSet<Student> hs = new HashSet<Student>();//创建元素对象Student s = new Student("zhangsan",18);Student s2 = new Student("lisi",19);Student s3 = new Student("lisi",19);//添加元素对象hs.add(s);hs.add(s2);hs.add(s3);//遍历集合对象for (Student student : hs) {System.out.println(student);}}}class Student {String name;int age;public Student(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [name=" + name + ", age=" + age + "]";}@Overridepublic boolean equals(Object obj) {//System.out.println("-------------------");Student s = (Student)obj;//向下转型,可以获取子类特有成员//比较年龄是否相等,如果不等则返回falseif(this.age != s.age) {return false;}//比较姓名是否相等,如果不等则返回falseif(!this.name.equals(s.name)) {return false;}//默认返回true,说明两个学生是相等的return true;}@Overridepublic int hashCode() {return 1;}}1.2.2.2  hashCode方法优化:如果让hashCode()方法返回一个固定值,那么每个新添加的元素都要调用equals(Object obj)方法比较,那么效率较低只需要让不同属性的值的元素产生不同的哈希值,那么就可以不再调用equals方法比较提高效率
1.2.2.3 案例代码三:
package com.itheima_02;public class Person {String name;int age;public Person(String name,int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int hashCode() {final int prime = 31;int result = 1;result = prime * result + age;result = prime * result + ((name == null) ? 0 : name.hashCode());return result;}@Overridepublic boolean equals(Object obj) {if (this == obj)return true;if (obj == null)return false;if (getClass() != obj.getClass())return false;Person other = (Person) obj;if (age != other.age)return false;if (name == null) {if (other.name != null)return false;} else if (!name.equals(other.name))return false;return true;}/*@Overridepublic int hashCode() {* 我们发现当hashCode方法永远返回整数1时,所有对象的hash值都是一样的,* 有一些对象他的成员变量完全不同,但是他们还需要进行hash和equals方法的比较,* 如果我们可以让成员变量不同的对象,他们的hash值也不同,这就可以减少一部分equals方法的比较* 从而可以提高我们程序的效率* * 可以尝试着让hashCode方法的返回值和对象的成员变量有关* 可以让hashCode方法返回所有成员变量之和,* 让基本数据类型直接想加,然后引用数据类型获取hashCode方法返回值后再相加(boolean不可以参与运算)* //return age;return age + name.hashCode();}@Overridepublic boolean equals(Object obj) {System.out.println("-------------");//提高效率if(this == obj) {return true;}//提高健壮性if(this.getClass() != obj.getClass()) {return false;}//向下转型Person p = (Person)obj;if(!this.name.equals(p.name)) {return false;}if(this.age != p.age) {return false;}return true;}*/}package com.itheima_02;import java.util.HashSet;public class HashSetDemo3 {public static void main(String[] args) {//创建集合对象HashSet<Person> hs = new HashSet<Person>();//创建元素对象Person p = new Person("zhangsan",18);Person p2 = new Person("lisi",18);Person p3 = new Person("lisi",18); //添加元素对象hs.add(p);hs.add(p2);hs.add(p3);//遍历集合对象for (Person person : hs) {System.out.println(person);}}
}1.3    Collections中的方法
1.3.1   案例代码四:
package com.itheima_03;import java.util.ArrayList;
import java.util.Collections;
import java.util.List;/** Collections:* 面试题:Collection和Collections有什么区别?*      Collection是集合体系的最顶层,包含了集合体系的共性*      Collections是一个工具类,方法都是用于操作Collection* */
public class CollectionsDemo {public static void main(String[] args) {//static void swap(List list, int i, int j) :将指定列表中的两个索引进行位置互换List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(4);Collections.swap(list, 0, 1);System.out.println(list);}private static void method6() {//static void  sort(List<T> list) :按照列表中元素的自然顺序进行排序List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(4);list.add(3);list.add(2);Collections.sort(list);System.out.println(list);}private static void method5() {//static void shuffle(List list):傻否,随机置换  List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);Collections.shuffle(list);System.out.println(list);}private static void method4() {//static void reverse(List list)  :反转List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);Collections.reverse(list);System.out.println(list);}private static void method3() {//static void fill(List list, Object obj) :使用指定的对象填充指定列表的所有元素List<String> list = new ArrayList<String>();list.add("hello");list.add("world");list.add("java");System.out.println(list);Collections.fill(list, "android");System.out.println(list);}private static void method2() {//static void copy(List dest, List src) :是把源列表中的数据覆盖到目标列表//注意:目标列表的长度至少等于源列表的长度//创建源列表List<String> src = new ArrayList<String>();src.add("hello");src.add("world");src.add("java");//创建目标列表List<String> dest = new ArrayList<String>();dest.add("java");dest.add("java");dest.add("java");dest.add("java");Collections.copy(dest, src);System.out.println(dest);}private static void method() {//static int  binarySearch(List list, Object key) 使用二分查找法查找指定元素在指定列表的索引位置 List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);int index = Collections.binarySearch(list, 4);System.out.println(index);}
}1.4    斗地主案例
具体规则:1. 组装54张扑克牌
2. 将54张牌顺序打乱3. 三个玩家参与游戏,三人交替摸牌,每人17张牌,最后三张留作底牌。4. 查看三人各自手中的牌、底牌
1.4.1   案例代码五:package com.itheima_03;import java.util.ArrayList;
import java.util.Collections;/**    模拟斗地主发牌 买牌洗牌发牌*/
public class CollectionsTest {public static void main(String[] args) {//买牌String[] arr = {"黑桃","红桃","方片","梅花"};String[] arr2 = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};ArrayList<String> box = new ArrayList<String>();//添加每张牌for (int i = 0; i < arr.length; i++) {//获取每一个花色for (int j = 0; j < arr2.length; j++) {//获取每一个数box.add(arr[i] + arr2[j]);}}box.add("大王");box.add("小王");//System.out.println(box.size());//洗牌Collections.shuffle(box);//System.out.println(box);//发牌ArrayList<String> 林志玲 = new ArrayList<String>();ArrayList<String> 林心如 = new ArrayList<String>();ArrayList<String> 舒淇 = new ArrayList<String>();//留三张底牌给地主for (int i = 0; i < box.size() - 3; i++) {/**  i = 0;i % 3 = 0;*  i = 1;i % 3 = 1;*  i = 2;i % 3 = 2;*  i = 3;i % 3 = 0;*  i = 4;i % 4 = 1;*  i = 5;i % 5 = 2;*/if(i % 3 == 0) {林志玲.add(box.get(i));}else if(i % 3 == 1) {林心如.add(box.get(i));}else if(i % 3 == 2) {舒淇.add(box.get(i));}}System.out.println("林志玲:" + 林志玲);System.out.println("林心如:" + 林心如);System.out.println("舒淇:" + 舒淇);System.out.println("底牌:");/*  System.out.println(box.get(box.size() - 1));System.out.println(box.get(box.size() - 2));System.out.println(box.get(box.size() - 3));*/for (int i = box.size() - 3; i < box.size(); i++) {System.out.println(box.get(i));}}}
第2章 HashMap集合2.1    Map接口概述
我们通过查看Map接口描述,发现Map接口下的集合与Collection接口下的集合,它们存储数据的形式不同,如下图。
A:Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储
B:Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
C:Collection中的集合称为单列集合,Map中的集合称为双列集合。
需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。2.2    Map常用功能
A:映射功能:V put(K key, V value) :以键=值的方式存入Map集合
B:获取功能:V get(Object key):根据键获取值
int size():返回Map中键值对的个数
C:判断功能:boolean containsKey(Object key):判断Map集合中是否包含键为key的键值对boolean containsValue(Object value):判断Map集合中是否包含值为value键值对boolean isEmpty():判断Map集合中是否没有任何键值对
D:删除功能:void clear():清空Map集合中所有的键值对V remove(Object key):根据键值删除Map中键值对
E:遍历功能:Set<Map.Entry<K,V>> entrySet():将每个键值对封装到一个个Entry对象中,再把所有Entry的对象封装到Set集合中返回Set<K> keySet() :将Map中所有的键装到Set集合中返回Collection<V> values():返回集合中所有的value的值的集合
2.2.1   案例代码四:
package com.itheima_01;import java.util.HashMap;
import java.util.Map;/**    Map的常用功能:*       映射功能:*               V put(K key, V value) *         获取功能:*               V get(Object key) *                 int size() *        判断功能:*               boolean containsKey(Object key) boolean containsValue(Object value) boolean isEmpty() *         删除功能:*               void clear()  *                 V remove(Object key)  * *       遍历功能:*               Set<Map.Entry<K,V>> entrySet() * * *            Set<K> keySet()  *            Collection<V> values()  */
public class MapDemo2 {public static void main(String[] args) {//创建Map对象Map<String,String> map = new HashMap<String,String>();//V put(K key, V value) :就是将key映射到value,如果key存在,则覆盖value,并将原来的value返回System.out.println(map.put("ITCAST001", "张三"));System.out.println(map.put("ITCAST002", "李四"));System.out.println(map.put("ITCAST001", "王五"));//void clear() : 清空所有的对应关系  //map.clear();//V remove(Object key) :根据指定的key删除对应关系,并返回key所对应的值,如果没有删除成功则返回null//System.out.println(map.remove("ITCAST005"));//boolean containsKey(Object key) : 判断指定key是否存在//System.out.println(map.containsKey("ITCAST003"));//boolean containsValue(Object value):判断指定的value是否存在//System.out.println(map.containsValue("王五"));//boolean isEmpty() : 判断是否有对应关系//System.out.println(map.isEmpty());//int size() : 返回对应关系的个数//System.out.println(map.size());//V get(Object key) : 根据指定的key返回对应的valueSystem.out.println(map.get("ITCAST002"));System.out.println(map);}
}
2.2.2   案例代码五:package com.itheima_01;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**    Set<K> keySet()  *    Collection<V> values() */
public class MapDemo3 {public static void main(String[] args) {//创建Map对象Map<String,String> map = new HashMap<String,String>();//添加映射关系map.put("ITCAST001", "张三");map.put("ITCAST002", "李四");map.put("ITCAST005", "李四");//Set<K> keySet() : 以Set的形式获返回所有的keySet<String> keys = map.keySet();for (String key : keys) {System.out.println(key);}System.out.println("-----------");//Collection<V> values() :Collection<String> values = map.values();for (String value : values) {System.out.println(value);}}
}
2.3 Map的两种遍历方式
2.3.1   利用keySet()方法遍历package com.itheima_01;import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**    Map的第一种遍历方式:*            首先召集所有的丈夫*          遍历所有的丈夫*            获取每一个丈夫*            让每一个丈夫去找他自己的媳妇*/
public class MapDemo4 {public static void main(String[] args) {//创建Map对象Map<String,String> map = new HashMap<String,String>();//添加映射关系map.put("谢婷疯", "张箔纸");map.put("陈关西", "钟欣桶");map.put("李亚碰", "王飞");//遍历Map对象//首先召集所有的丈夫Set<String> keys = map.keySet();//遍历所有的丈夫for (String key : keys) {//让每个丈夫去找他自己的媳妇就可以了String value = map.get(key);System.out.println("丈夫:" + key + "---" + "媳妇:" + value);}}
}
2.3.2   利用entrySet()方法遍历
package com.itheima_01;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/**    Map的第二种遍历方式:*        通过结婚证对象来获取丈夫和媳妇* *  class 结婚证<K,V> {*     K 丈夫;*      V 媳妇;*  *   public 结婚证(K 丈夫,V 媳妇) {*         this.丈夫 = 丈夫;*         this.媳妇 = 媳妇;*     }*  *  *    public K get丈夫() {*         return 丈夫;*     }*  *   public V get媳妇() {*         return 媳妇;*     }*  }*  *  *  class Entry<K,V> {*     K key;*     V value;*  *    public Entry(K key,V value) {*       this.key = key;*       this.value = value;*   }*  *  *    public K getKey() {*        return key;*    }*  *   public V getValue() {*          return value;*      }*  }*  *  Set<Map.Entry<K,V>> entrySet()  * */
public class MapDemo5 {public static void main(String[] args) {//创建Map对象Map<String,String> map = new HashMap<String,String>();//添加映射关系map.put("尹志平", "小龙女");map.put("令狐冲", "东方菇凉");map.put("玄慈", "叶二娘");//获取所有的结婚证对象Set<Map.Entry<String,String>> entrys = map.entrySet();//遍历包含了结婚证对象的集合for (Map.Entry<String, String> entry : entrys) {//获取每个单独的结婚证对象//通过结婚证对象获取丈夫和媳妇String key = entry.getKey();String value = entry.getValue();System.out.println("丈夫:" + key + "---" + "媳妇:" + value);}}
}2.3.3  练习:
A:以key为学号字符串,value为学生姓名存入HashMap集合,分别以两种方式遍历集合
2.3.3.1 案例代码一:
package com.itheima_02;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;/** * 使用HashMap存储数据并遍历(字符串作为key)* */
public class HashMapDemo {public static void main(String[] args) {//创建Map对象HashMap<String,String> hm = new HashMap<String,String>();//添加映射关系hm.put("ITCAST001", "张三");hm.put("ITCAST002", "李四");hm.put("ITCAST003", "王五");hm.put("ITCAST003", "赵六");//遍历Map对象//方式1 获取所有的key,通过key来获取valueSet<String> keys = hm.keySet();for (String key : keys) {String value = hm.get(key);System.out.println(key + "=" + value);}System.out.println("------------------");//方式2:获取所有的结婚证对象,然后通过结婚证对象获取丈夫和媳妇Set<Map.Entry<String, String>> entrys = hm.entrySet();for (Map.Entry<String, String> entry : entrys) {String key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}
B: 定义一个学生类,学生类中有name和age两个属性,创建三个学生对象,分别对name和age赋值,然后以key为学生对象,value为学生的学号的方式存入HashMap集合,利用两种方式遍历这个Map
2.3.3.2 案例代码二:
package com.itheima_02;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
/** * 使用HashMap存储数据并遍历(自定义对象作为key)* */
public class HashMapDemo2 {public static void main(String[] args) {//创建Map对象HashMap<Student,String> hm = new HashMap<Student,String>();//创建key对象Student s = new Student("zhangsan",18);Student s2 = new Student("lisi",20);Student s3 = new Student("lisi",20);//添加映射关系hm.put(s, "ITCAST001");hm.put(s2, "ITCAST002");hm.put(s3, "ITCAST002");//遍历Map对象//方式1: 获取所有的key,通过key来获取valueSet<Student> keys = hm.keySet();for (Student key : keys) {String value = hm.get(key);System.out.println(key + "=" + value);}System.out.println("-----");//方式2:获取所有结婚证对象,通过结婚证对象获取丈夫和媳妇Set<Map.Entry<Student, String>> entrys = hm.entrySet();for (Entry<Student, String> entry : entrys) {Student key = entry.getKey();String value = entry.getValue();System.out.println(key + "=" + value);}}
}

18 Map与Set集合相关推荐

  1. 笔记整理4----Java语言高级(四)16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级

    16 JAVA常用API-高级+17 泛型与常见数据结构+18 Map与Set集合+19 异常处理+20 IO流-高级 第05天 API 今日内容介绍  Object类 & System类 ...

  2. java list map嵌套_Java 集合-Map集合嵌套 的遍历四种方式

    1 public static voidmain(String[] args) {2 3 HashMap> map = new HashMap>();4 5 HashMap mapin1 ...

  3. el表达式遍历list中的list_EL表达式获取map和list集合中的值 | 学步园

    Map的每个对象以key=value的形式给出 当forEach tag的item属性中的表达式的值是java.util.Map时,在var中命名的变量被设置为类型是java.util.Map.Ent ...

  4. 简述List、Set、Map类型的集合的各自特点

    简述List.Set.Map类型的集合的各自特点 转载于https://blog.csdn.net/m0_37668335/article/details/80556862?depth_1-utm_s ...

  5. java list键值_java基础之对List,Map,Set等集合键值对的简单认识

    [一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...

  6. java map 排序_java集合框架面试题大集合

    1.介绍JAVA 中的Collection FrameWork(及如何写自己的数据结构)[基础] 答:Collection FrameWork 如下: Collection: ├List │├Link ...

  7. Map 的Properties集合存储IO流对象

    package IODemo;import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.Pro ...

  8. Python(18)-字典dictionary、集合

    Python高级数据类型-字典 1.字典的定义 2.字典的基本操作:查询,增加,修改,获取 3.字典的统计.合并.清空 4.字典的循环遍历 5.返回最大"值"对应的"键& ...

  9. 集合、set、list、map、所有集合基本知识使用方法总结

    1.集合的概述 集合概述:就是一个专门存放多个引用数据类型对象的容器[重点::只能存放引用数据类型] 特点:1.它可以存放多种数据类型对象2.集合的长度可变的3.支持泛型 面试题:集合和数组的对比 数 ...

最新文章

  1. 178页,四年图神经网络研究精华汇总
  2. 海岛奇兵服务器维护费,坑爹啊! 海岛奇兵额外建筑工被疯狂吐槽!
  3. 用命令行操作 VirtualBox 和 SGD
  4. neo4j-admin导入海量数据
  5. UEFI下用rufus安装ubuntu16.04 LTS
  6. Django开发准则与最佳实践
  7. python存数据到excel_python爬取的数据--保存数据到excel
  8. 延长汽车使用寿命,抛弃六大用车坏习惯
  9. python tkinter画笑脸_python – 如何在tkinter窗口中绘制图像
  10. 14寸笔记本电脑_纯小白预算5000到6000有什么好的笔记本电脑推荐吗?
  11. hdu 5148 cities 树形DP
  12. php二分查找例题,PHP实现的二分查找算法实例分析
  13. 图像文字识别易语言代码
  14. 读《微波工程(第三版)》笔记 (9:传输线模型)
  15. apktool + dex2jar + xjad反编译apk文件
  16. Springboot 使用阿里云api批量发送短信
  17. JavaScript的输出语句
  18. Flutter中如何选择StatelessWidget和StatefulWidget
  19. 《四叶游戏》:梦想执念·棒球1号位
  20. 查看mysql端口 windows_Windows运维之windows下如何查看和修改MySQL的端口号

热门文章

  1. word2vec模型训练保存加载及简单使用
  2. js取小数点后两位 方法总结
  3. 90% 都会的 ES6 简化代码技巧,你用过哪些?
  4. UE风格化Day9-(摆烂特辑)原神石块砖材质欣赏
  5. 同等学力计算机科学与技术真题-2006年
  6. ST17H66 低功耗蓝牙SOC开发(3)—— OSAL系统简介
  7. centos7 串口配置修改_Linux串口参数设置
  8. 十二星座 谁是 “小笨猪” ?
  9. 以QRcode为例聊聊二维码的现状与未来(Java版本)
  10. 【观察】借道企业微信,销售易打开新一轮增长空间