Day18_集合第四天
1、Map集合成员方法(掌握)
|
V put(K key, V value) |
当key在集合中不存在时,添加元素;当key在集合存在时候,替换元素 |
|
删除功能 |
|
|
void clear |
清除所有键值对数据 |
|
V remove(Object key) |
根据指定的键删除键值对 |
|
判断功能 |
|
|
boolean containsKey(Object key) |
判断指定的键是否在集合中存在 |
|
boolean containsValue(Object value) |
判断指定的值是否在集合中存在 |
|
boolean isEmpty |
判断集合是否为空 |
|
获取功能 |
|
|
Set<Map.Entry<K,V>> entrySet() |
键值对对象的集合 |
|
Object get(Object key) |
根据键获取值 |
|
Set<K> keySet() |
所有键的集合 |
|
Collection<V> values() |
所有值的集合 |
|
长度 |
|
|
int size() |
获取长度 |
2、Map集合的两种遍历方式(掌握)
|
创建 Map集合 |
|
|
第一种 遍历方式(通过keySet()) |
|
|
第二种 遍历方式(通过entrySet()) 当一个类或者一个接口被定义到类的成员位置的时候,在其他类中可以直接通过导入包名.外部类名.内部类名来使用。注意:这种方式只能创见引用,不能创建对象 package cn.itcast;
import cn.itcast.Outer.InnerClass;
public class Test {
public static void main(String[] args) {
InnerClass in = new Outer().new InnerClass();
}
}
|
|
3、HashMap存储自定义对象实现去重 (将自定义对象存储到Key的位置)(掌握)
需求:需要将自定义对象存储到key的位置,并实现去重功能,怎么办?
4、TreeMap存储自定义对象实现排序 (将自定义对象存储到Key的位置)(掌握)
5、面试题:HashTable和HashMap区别(掌握)
6、集合体系-总结(掌握)
| Collection(单列集合) | Map(双列集合) |
| |--Collection(单列) |--List(有序,可重复) |--ArrayList 底层数据结构是数组,查询快,增删慢。 线程不安全,效率高。 |--Vector 底层数据结构是数组,查询快,增删慢。 线程安全,效率低。 |--LinkedList 底层数据结构是链表,查询慢,增删快。 线程不安全,效率高。 |--Set(可能无序,肯定唯一) |--HashSet 底层数据结构是哈希表。 线程不安全,效率高。 怎么保证唯一性的呢? 它依赖两个方法:hashCode()和equals() 顺序: 首先判断hashCode()值是否相同。 同:继续走equals(),看返回值 如果true:就不添加到集合。 如果false:就添加到集合。 不同:就添加到集合。 |--TreeSet 底层数据结构是二叉树。 线程不安全,效率高。 怎么保证唯一性的呢?是根据返回是否是0。 怎么保证排序的呢?两种方式 自然排序(元素具备比较性) 实现Comparable接口 比较器排序(集合具备比较性) 实现Comparator接口 |
|--Map(双列 底层结构是针对键有效,跟值无关) |--HashMap 底层数据结构是哈希表。 线程不安全,效率高。允许null键和值 怎么保证唯一性的呢? 它依赖两个方法:hashCode()和equals() 顺序: 首先判断hashCode()值是否相同。 同:继续走equals(),看返回值 如果true:就不添加到集合。 如果false:就添加到集合。 不同:就添加到集合。 |--Hashtable 底层数据结构是哈希表。 线程安全,效率低。不允许null键和值 怎么保证唯一性的呢? 它依赖两个方法:hashCode()和equals() 顺序: 首先判断hashCode()值是否相同。 同:继续走equals(),看返回值 如果true:就不添加到集合。 如果false:就添加到集合。 不同:就添加到集合。 |--TreeMap 底层数据结构是二叉树。 线程不安全,效率高。 怎么保证唯一性的呢?是根据返回是否是0。 怎么保证排序的呢?两种方式 自然排序(元素具备比较性) 实现Comparable接口 比较器排序(集合具备比较性) 实现Comparator接口 |
7、案例(掌握)
1、HashMap集合键是Student值是String的案例
8、案例代码(掌握)
/**学生类*/public class Student implements Comparable<Student> {private String name;private int age;public Student() {super();}public Student(String name, int age) {super();this.name = name;this.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;}@Overridepublic String toString() {return "Student [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;Student other = (Student) 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 compareTo(Student o) {int num = this.age - o.age; //以年龄为主要条件return num == 0 ? this.name.compareTo(o.name) : num;}}/**测试类*/public class Demo5_HashMap {/** * A:案例演示* HashMap集合键是Student值是String的案例* 键是学生对象,代表每一个学生* 值是字符串对象,代表学生归属地*/public static void main(String[] args) {HashMap<Student, String> hm = new HashMap<>();hm.put(new Student("张三", 23), "北京");hm.put(new Student("张三", 23), "上海");hm.put(new Student("李四", 24), "广州");hm.put(new Student("王五", 25), "深圳");System.out.println(hm);}}
package com.heima.map;import java.util.LinkedHashMap;public class Demo6_LinkedHashMap {/*** @param args* LinkedHashMap可以保证怎么存就怎么取*/public static void main(String[] args) {LinkedHashMap<String, Integer> lhm = new LinkedHashMap<>();lhm.put("张三", 23);lhm.put("李四", 24);lhm.put("赵六", 26);lhm.put("王五", 25);System.out.println(lhm);}}
package com.heima.map;import java.util.Comparator;import java.util.TreeMap;import com.heima.bean.Student;public class Demo7_TreeMap {/*** * A:案例演示* TreeMap集合键是Student值是String的案例*/public static void main(String[] args) {//demo1();TreeMap<Student, String> tm = new TreeMap<>(new Comparator<Student>() {@Overridepublic int compare(Student s1, Student s2) {int num = s1.getName().compareTo(s2.getName()); //按照姓名比较return num == 0 ? s1.getAge() - s2.getAge() : num;}});tm.put(new Student("张三", 23), "北京");tm.put(new Student("李四", 13), "上海");tm.put(new Student("赵六", 43), "深圳");tm.put(new Student("王五", 33), "广州");System.out.println(tm);}public static void demo1() {TreeMap<Student, String> tm = new TreeMap<>();tm.put(new Student("张三", 23), "北京");tm.put(new Student("李四", 13), "上海");tm.put(new Student("王五", 33), "广州");tm.put(new Student("赵六", 43), "深圳");System.out.println(tm);}}
package com.heima.map;import java.util.HashMap;import com.heima.bean.Student;public class Demo8_HashMapHashMap {/*** * A:案例演示* 集合嵌套之HashMap嵌套HashMap** 需求:* 双元课堂有很多基础班* 第88期基础班定义成一个双列集合,键是学生对象,值是学生的归属地* 第99期基础班定义成一个双列集合,键是学生对象,值是学生的归属地** 无论88期还是99期都是班级对象,所以为了便于统一管理,把这些班级对象添加到双元课堂集合中*/public static void main(String[] args) {//定义88期基础班HashMap<Student, String> hm88 = new HashMap<>();hm88.put(new Student("张三", 23), "北京");hm88.put(new Student("李四", 24), "北京");hm88.put(new Student("王五", 25), "上海");hm88.put(new Student("赵六", 26), "广州");//定义99期基础班HashMap<Student, String> hm99 = new HashMap<>();hm99.put(new Student("唐僧", 1023), "北京");hm99.put(new Student("孙悟空",1024), "北京");hm99.put(new Student("猪八戒",1025), "上海");hm99.put(new Student("沙和尚",1026), "广州");//定义双元课堂HashMap<HashMap<Student, String>, String> hm = new HashMap<>();hm.put(hm88, "第88期基础班");hm.put(hm99, "第99期基础班");//遍历双列集合for(HashMap<Student, String> h : hm.keySet()) { //hm.keySet()代表的是双列集合中键的集合String value = hm.get(h); //get(h)根据键对象获取值对象//遍历键的双列集合对象for(Student key : h.keySet()) { //h.keySet()获取集合总所有的学生键对象String value2 = h.get(key);System.out.println(key + "=" + value2 + "=" + value);}}}}
package com.heima.test;import java.util.HashMap;public class Test1 {/*** * A:案例演示* 需求:统计字符串中每个字符出现的次数** 分析:* 1,定义一个需要被统计字符的字符串* 2,将字符串转换为字符数组* 3,定义双列集合,存储字符串中字符以及字符出现的次数* 4,遍历字符数组获取每一个字符,并将字符存储在双列集合中* 5,存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储* 6,打印双列集合获取字符出现的次数*/public static void main(String[] args) {//1,定义一个需要被统计字符的字符串String s = "aaaabbbbbccccccccccccc";//2,将字符串转换为字符数组char[] arr = s.toCharArray();//3,定义双列集合,存储字符串中字符以及字符出现的次数HashMap<Character, Integer> hm = new HashMap<>();//4,遍历字符数组获取每一个字符,并将字符存储在双列集合中for(char c: arr) {//5,存储过程中要做判断,如果集合中不包含这个键,就将该字符当作键,值为1存储,如果集合中包含这个键,就将值加1存储/*if(!hm.containsKey(c)) { //如果不包含这个键hm.put(c, 1);}else {hm.put(c, hm.get(c) + 1);}*/hm.put(c, !hm.containsKey(c) ? 1 : hm.get(c) + 1);}//6,打印双列集合获取字符出现的次数for (Character key : hm.keySet()) { //hm.keySet()代表所有键的集合System.out.println(key + "=" + hm.get(key));//hm.get(key)根据键获取值}}}
package com.heima.test;import java.util.ArrayList;import java.util.Collections;import java.util.HashMap;import java.util.TreeSet;public class Test3 {/*** * A:案例演示* 模拟斗地主洗牌和发牌并对牌进行排序的代码实现** 分析:* 1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去* 2,洗牌* 3,发牌* 4,看牌*/public static void main(String[] args) {//1,买一副扑克,其实就是自己创建一个集合对象,将扑克牌存储进去String[] num = {"3","4","5","6","7","8","9","10","J","Q","K","A","2"};String[] color = {"红桃","黑桃","方片","梅花"};HashMap<Integer, String> hm = new HashMap<>(); //存储索引和扑克牌ArrayList<Integer> list = new ArrayList<>(); //存储索引int index = 0;//拼接扑克牌并索引和扑克牌存储在hm中for(String s1 : num) { //获取数字for(String s2 : color) { //获取颜色hm.put(index, s2.concat(s1));list.add(index); //将索引0到51添加到list集合中index++;}}//将小王添加到双列集合中hm.put(index, "小王");list.add(index); //将52索引添加到集合中index++;hm.put(index, "大王");list.add(index); //将52索引添加到集合中//2,洗牌Collections.shuffle(list);//3,发牌TreeSet<Integer> gaojin = new TreeSet<>();TreeSet<Integer> longwu = new TreeSet<>();TreeSet<Integer> me = new TreeSet<>();TreeSet<Integer> dipai = new TreeSet<>();for(int i = 0; i < list.size(); i++) {if(i >= list.size() - 3) {dipai.add(list.get(i)); //将三张底牌存储在底牌集合中}else if(i % 3 == 0) {gaojin.add(list.get(i));}else if(i % 3 == 1) {longwu.add(list.get(i));}else {me.add(list.get(i));}}//看牌lookPoker(hm, gaojin, "高进");lookPoker(hm, longwu, "龙五");lookPoker(hm, me, "冯佳");lookPoker(hm, dipai, "底牌");}/** 看牌* 1,返回值类型void* 2,参数列表HashMap,TreeSet,String name*/public static void lookPoker(HashMap<Integer, String> hm,TreeSet<Integer> ts ,String name) {System.out.print(name + "的牌是:");for(Integer i : ts) { //i代表双列集合中的每一个键System.out.print(hm.get(i) + " ");}System.out.println();}}
package com.heima.collections;import java.util.ArrayList;import java.util.Collections;public class Demo1_Collecitons {/*** Collecitons中的常见方法* public static <T> void sort(List<T> list)public static <T> int binarySearch(List<?> list,T key)public static <T> T max(Collection<?> coll)public static void reverse(List<?> list)public static void shuffle(List<?> list)*/public static void main(String[] args) {//demo1();//demo2();ArrayList<String> list = new ArrayList<>();list.add("a");list.add("c");list.add("d");list.add("g");list.add("f");//System.out.println(Collections.max(list)); //根据默认排序结果获取集合中的最大值//Collections.reverse(list); //反转集合Collections.shuffle(list); //随机置换,可以用来洗牌System.out.println(list);}public static void demo2() {ArrayList<String> list = new ArrayList<>();list.add("a");list.add("c");list.add("d");list.add("f");list.add("g");System.out.println(Collections.binarySearch(list, "c"));System.out.println(Collections.binarySearch(list, "b"));}public static void demo1() {ArrayList<String> list = new ArrayList<>();list.add("c");list.add("a");list.add("a");list.add("b");list.add("d");System.out.println(list);Collections.sort(list); //将集合排序System.out.println(list);}}
9、今天必须掌握的内容,面试题,笔试题。
* (1)以逗号作为分隔符,把已知的字符串分成一个String类型的数组,数组中的每一个元素类似于"1.2","3.4"这样的字符串 * (2)把数组中的每一个元素以 * "."作为分隔符,把"."左边的元素作为key,右边的元素作为value,封装到Map中,Map中的key和value都是Object类型。 * (3)把map中的key封装的Set中,并把Set中的元素输出。 * (4)把map中的value封装到Collection中,把Collection中的元素输出。Day18_集合第四天的更多相关文章
- Java List集合 遍历 四种方式(包含 Lambda 表达式遍历)
示例代码如下: package com.miracle.luna.lambda; import java.util.ArrayList; import java.util.List; /** * @A ...
- Java中的集合(十四) Map的实现类LinkedHashMap
Java中的集合(十四) Map的实现类LinkedHashMap 一.LinkedHashMap的简介 LinkedHashMap是Map接口的实现类,继承了HashMap,它通过重写父类相关的方法 ...
- Java中的集合(四)PriorityQueue常用方法
Java中的集合(四)PriorityQueue常用方法 PriorityQueue的基本概念等都在上一篇已说明,感兴趣的可以点击 Java中的集合(三)继承Collection的Queue接口 查看 ...
- Java中Map集合的四种访问方式(转)
最近学习Java发现集合类型真是很多,访问方式也很灵活,在网上找的方法,先放下备用 public static void main(String[] args) { Map<String, St ...
- Map集合的四种遍历方式
很久以前写的代码,和上一个做比较吧!便于以后查看 import java.util.HashMap; import java.util.Iterator; import java.util.Map; ...
- Map集合的四种遍历
Map集合遍历 Map<String,Integer> m = new HashMap<String,Integer>(); m.put("one",100 ...
- 集合(四)HashMap
之前的List,讲了ArrayList.LinkedList,最后讲到了CopyOnWriteArrayList,就前两者而言,反映的是两种思想: (1)ArrayList以数组形式实现,顺序插入.查 ...
- Map集合的四种遍历方式(转载)
import java.util.HashMap; import java.util.Iterator; import java.util.Map; public class TestMap { pu ...
- Java集合系列(四):HashMap、Hashtable、LinkedHashMap、TreeMap的使用方法及区别
本篇博客主要讲解Map接口的4个实现类HashMap.Hashtable.LinkedHashMap.TreeMap的使用方法以及三者之间的区别. 注意:本文中代码使用的JDK版本为1.8.0_191 ...
随机推荐
- 17.KVM安装之虚拟磁盘,安装脚本
1.创建磁盘 vm.list 指定虚拟磁盘名称和主机名 create_vm.sh #创建vm.list中的虚拟磁盘,并指定大小100G #!/bin/bash VM_DIR="/opt ...
- C语言面试题(二)
上篇对嵌入式中C语言基本数据类型,关键字和常用操作进行了汇总,这篇我们将侧重字符串操作.请看下面的字符串处理函数: a.库函数 1)将字符串src拷贝到字符数组dest内 c ...
- HDU-4534 郑厂长系列故事——新闻净化 AC自动机+DP
题意:给定一些单词,这些单词必须要是一个目标串的子串,同时给定一些串,这些串不能够出现在目标串中,其余一些串只会带来不同附加值.现在问满足前两者的情况下,要求附加值最大.数据给定一个原始串,现在要求在 ...
- windows目录选择 文件选择 文件保存对话框
打开文件对话框 const char pszFilter[] = _T("EXE File (*.txt)|*.txt|All Files (*.*)|*.*||"); CFile ...
- html中button自动提交表单?
在ie中,button默认的type是button,而其他浏览器和W3C标准中button默认的属性都是submit
- 主页面获取iframe 的子页面方法。
父页面parent.html <html> <head> <script type="text/javascript"> function sa ...
- Creating Materials at runtime And Issue of Shader.Find()
Creating Materials at runtimehttp://forum.unity3d.com/threads/create-materials-at-runtime.72952/ //通 ...
- /etc/rc.d/与/etc/rc.d/init.d的关系
/etc/init.d指向/etc/rc.d/init.d目录 . 除了直接调用脚本外(如/etc/rc.d/init.d/xinetd),还可以用service命令来控制init.d目录下的服务如 ...
- 读javascript高级程序设计14-错误处理与调试
一 错误类型 ECMA规定了常见的7种错误类型: Error: 基类型.其他常见的错误类型都继承自该类型,一般供开发人员抛出自定义错误. EvalError:该类型会在eval()函数使用异常时被抛 ...
- iOS开发UI篇—在UItableview中实现加载更多功能
一.实现效果 点击加载更多按钮,出现一个加载图示,三秒钟后添加两条新的数据. 二.实现代码和说明 当在页面(视图部分)点击加载更多按钮的时候,主页面(主控制器 ...