Day 18

一、泛型(掌握)

  • 参数化数据类型
  • 创建类的时候无法确定属性的数据类型,创建对象的时候根据实际需求确定数据类型
package com.qf.test;import java.util.ArrayList;public class Demo05 {public static void main(String[] args) {Student<String,String> stu01 = new Student<String,String>("10010", "张三", 23);Student<Integer,String> stu02 = new Student<Integer,String>(10011, "李四", 24);}
}class Student<T, K>{T id;String name;int age;K gender;public Student() {super();}public Student(T id, String name, int age) {super();this.id = id;this.name = name;this.age = age;}@Overridepublic String toString() {return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";}
}

二、集合工具类Collections(掌握)

  • 操作集合的一个工具类
  • 提供了翻转,添加,排序,查找等方法
package com.qf.test;import java.util.ArrayList;
import java.util.Collections;public class Demo06 {public static void main(String[] args) {// Collections工具类/*** addAll* shuffle* sort* swap* reverse*/ArrayList<String> list = new ArrayList<String>();// 向指定集合中添加元素Collections.addAll(list, "张三","周毅","吴老二","正三");System.out.println(list);// 随机排序集合元素Collections.shuffle(list);System.out.println(list);ArrayList<String> names = new ArrayList<String>();names.add("Tom");names.add("Jerry");names.add("Poly");names.add("Kitty");System.out.println(names);// 排序Collections.sort(names);System.out.println(names);Collections.swap(names, 0, names.size()-1);System.out.println(names);// 翻转集合Collections.reverse(names);System.out.println(names);for (int i = 0; i < names.size()/2; i++) {Collections.swap(names, i, names.size()-i-1);}System.out.println(names);}
}

三、Set集合

  • 一个不包含重复元素的 collection。
  • 更确切地讲,set 不包含满足 e1.equals(e2) 的元素对 e1e2,并且最多包含一个 null 元素。
  • 正如其名称所暗示的,此接口模仿了数学上的 set 抽象。

四、HashSet(重点掌握)

4.1 定义

  • 此类实现 Set 接口,由哈希表(实际上是一个 HashMap 实例)支持。
  • 它不保证 set 的迭代顺序;特别是它不保证该顺序恒久不变。
  • 此类允许使用 null 元素。

4.2 创建对象

HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。
HashSet(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的新 set。
package com.qf.set;import java.util.ArrayList;
import java.util.HashSet;public class Demo01 {public static void main(String[] args) {// 阈值 16*0.75/***     HashSet() 构造一个新的空 set,其底层 HashMap 实例的默认初始容量是 16,加载因子是 0.75。 HashSet(Collection<? extends E> c) 构造一个包含指定 collection 中的元素的新 set。 */// 无序不重复HashSet<String> set = new HashSet<String>();set.add("赤脚大仙");set.add("赤脚大仙");set.add("土地公");set.add("太上老君");set.add("卷帘大将");set.add("卷帘大将");System.out.println(set);ArrayList<String> list = new ArrayList<String>();list.add("司马懿");list.add("司马昭");list.add("司马炎");list.add("司马师");list.add("司马光");list.add("司马光");list.add("司马光");System.out.println(list);HashSet<String> names = new HashSet<String>(list);System.out.println(names);list = new ArrayList<String>(names);System.out.println(list);}
}

4.3 HashSet去重原理

  • 认为重复的条件

    • e1.equals(e2)的结束是true
    • 重写之后计算得到的hashCode值一致
  • HashSet添加元素的原理
    • 调用了HashMap的put方法
    • put(e,v)
    • e是我们传入的元素
    • v是统一的值:一个静态常量对象

4.4 常用方法

package com.qf.set;import java.util.HashSet;public class Demo03 {public static void main(String[] args) {HashSet<String> set01 = new HashSet<String>();set01.add("马超");set01.add("马良");set01.add("马岱");set01.add("马谡");set01.add("马云");set01.add("马化腾");set01.add("马赛克");System.out.println(set01);// 删除的方法System.out.println(set01.remove("马赛克"));System.out.println(set01.remove("马赛克"));// 查看元素个数System.out.println(set01.size());System.out.println(set01.contains("马赛克"));System.out.println(set01.contains("马化腾"));}}

4.5 遍历set集合

  • 没有下标,无法使用for‘或者while遍历
  • 可以使用foreach或者iterator遍历
package com.qf.set;import java.util.HashSet;
import java.util.Iterator;public class Demo04 {public static void main(String[] args) {HashSet<String> set01 = new HashSet<String>();set01.add("马超");set01.add("马良");set01.add("马岱");set01.add("马谡");set01.add("马云");set01.add("马化腾");set01.add("马赛克");System.out.println(set01);// 遍历:没有下标,可以使用foreach遍历System.out.println("==========foreach===========");for (String name : set01) {System.out.println(name);}System.out.println("==========iterator===========");Iterator<String> it = set01.iterator();while (it.hasNext()) {String name = it.next();System.out.println(name);}}
}

五、LinkedHashSet(掌握)

  • 继承自HashSet
  • 但是自己维护了一个链表,记录前一个和后一个元素的信息
  • 能保证插入的顺序和迭代的顺序一致
package com.qf.set;import java.util.LinkedHashSet;public class Demo05 {public static void main(String[] args) {LinkedHashSet<String> set = new LinkedHashSet<String>();set.add("张默");set.add("高虎");set.add("宁财神");set.add("柯震东");set.add("宋冬野");set.add("房祖名");set.add("宁财神");System.out.println(set);}
}

六、TreeSet(掌握)

6.1 定义

  • set接口的一个实现类
  • 集合中的元素能按照自然顺序进行排序
  • 集合中的对象需要具有可比较性或者传入比较器

6.2 创建对象

package com.qf.set;import java.util.TreeSet;public class Demo06 {public static void main(String[] args) {// TreeSet集合中的元素默认按照自然顺序排列TreeSet<String> set01 = new TreeSet<String>();set01.add("Jack");set01.add("Rose");set01.add("Tom");set01.add("Tony");set01.add("Mark");set01.add("Jack");set01.add("Rose");set01.add("Tom");set01.add("Tony");set01.add("Mark");System.out.println(set01);TreeSet<Integer> set02 = new TreeSet<Integer>();set02.add(110);set02.add(11);set02.add(220);set02.add(78);set02.add(110);set02.add(11);set02.add(220);set02.add(78);System.out.println(set02);TreeSet<Stu> stus = new TreeSet<Stu>();stus.add(new Stu("zhangsan", 23));stus.add(new Stu("lisi", 22));stus.add(new Stu("wangwu", 18));stus.add(new Stu("zhaoliu", 26));stus.add(new Stu("tianqi", 29));System.out.println(stus);}
}class Stu{String name;int age;public Stu(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Stu [name=" + name + ", age=" + age + "]";}}

6.3 定义对象的比较器

  • 创建TreeSet时候传入比较器
  • 有名字的比较器
package com.qf.set;import java.util.Comparator;
import java.util.TreeSet;public class Demo07 {public static void main(String[] args) {// 创建一个比较器,自定义比较的规则Comparator<Students> comparator = new Comparator<Students>() {@Overridepublic int compare(Students s1, Students s2) {int ret = s1.age - s2.age;if (ret == 0) {ret = s1.name.compareTo(s2.name);}return -ret;}};TreeSet<Students> stus = new TreeSet<Students>(comparator);stus.add(new Students("zhangsan", 23));stus.add(new Students("lisi", 25));stus.add(new Students("wangwu", 22));stus.add(new Students("zhaoliu", 28));stus.add(new Students("tianqi", 28));System.out.println(stus);}
}class Students{String name;int age;public Students(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Students [name=" + name + ", age=" + age + "]";}}
  • 匿名比较器对象
package com.qf.set;import java.util.Comparator;
import java.util.TreeSet;public class Demo09 {public static void main(String[] args) {// 创建TreeSet对象,传入比较器Comparator匿名对象TreeSet<Students> stus = new TreeSet<Students>(new Comparator<Students>() {@Overridepublic int compare(Students s1, Students s2) {int ret = s1.age - s2.age;return ret == 0 ? s1.name.compareTo(s2.name) : ret;}});stus.add(new Students("zhangsan", 23));stus.add(new Students("lisi", 25));stus.add(new Students("wangwu", 22));stus.add(new Students("zhaoliu", 28));stus.add(new Students("tianqi", 28));System.out.println(stus);}
}
  • 对象的类实现Comparable接口
package com.qf.set;import java.util.TreeSet;public class Demo08 {public static void main(String[] args) {TreeSet<Person> persons = new TreeSet<Person>();persons.add(new Person("zhangsan", 23));persons.add(new Person("lisisi", 29));persons.add(new Person("wangwu", 33));persons.add(new Person("zhaoliu", 13));persons.add(new Person("tianqi", 23));System.out.println(persons);}
}/*** Person类*  实现Comparable接口,重写compareTo方法,自定义比较的规则* @author Dushine2008**/
class Person implements Comparable<Person>{String name;int age;public Person(String name, int age) {super();this.name = name;this.age = age;}@Overridepublic String toString() {return "Person [name=" + name + ", age=" + age + "]";}@Overridepublic int compareTo(Person o) {return this.age - o.age == 0 ? this.name.compareTo(o.name) : this.age - o.age;}}

七、Map(掌握)

7.1 定义

  • 双列集合的顶层接口
  • 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。

7.2 常见实现类

  • HashMap
  • HashTable
  • Properties
  • TreeMap
  • … …

八、HashMap(重点掌握)

8.1 定义

  • 基于哈希表的 Map 接口的实现。此实现提供所有可选的映射操作,并允许使用 null 值和 null 键。
  • 此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

8.2 创建对象

package com.qf.map;import java.util.HashMap;public class Demo01 {public static void main(String[] args) {/***    HashMap() 构造一个具有默认初始容量 (16) 和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity) 构造一个带指定初始容量和默认加载因子 (0.75) 的空 HashMap。 HashMap(int initialCapacity, float loadFactor) 构造一个带指定初始容量和加载因子的空 HashMap。 HashMap(Map<? extends K,? extends V> m) 构造一个映射关系与指定 Map 相同的新 HashMap。 */HashMap<String, String> map = new HashMap<String, String>();System.out.println(map);map.put("zhangsan", "法外狂徒张三");map.put("zhangsan", "法外狂徒");System.out.println(map);map.put("lisi", "法外狂徒张三的搭档");System.out.println(map);}
}

8.3 HashMap增删改方法

  • put
  • remove
package com.qf.map;import java.util.HashMap;public class Demo02 {public static void main(String[] args) {HashMap<Integer, String> map = new HashMap<Integer, String>();// 增加元素map.put(10010, "李白,唐朝诗人,浪漫主义豪放派诗人,被后人成为诗仙。");map.put(10011, "杜甫,唐朝诗人,现实主义诗人,被后人成为诗圣。");map.put(10012, "李贺,唐朝诗人,浪漫主义诗人,被后人成为诗鬼。");map.put(10013, "李清照,宋朝诗人,浪漫主义诗人,被后人成为诗鬼。");System.out.println(map);// 修改元素map.put(10013, "宋朝词人,婉约派词人,有很多诗词传世。");System.out.println(map);// 删除元素System.out.println(map.remove(10012));System.out.println(map.remove(10012));System.out.println(map.remove(10013, "宋朝词人,婉约派词人,有很多诗词传世。"));}
}

8.4 HashMap查询数据方法

  • keySet
  • values
  • get
  • containsKey
  • containsValue
  • size
package com.qf.map;import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;public class Demo03 {public static void main(String[] args) {HashMap<String, String> map = new HashMap<String, String>();map.put("悯农", "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。");map.put("静夜思", "床前明月光,疑是地上霜。举头望明月,低头思故乡。");map.put("望庐山瀑布", "日照香炉生紫烟光,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。");// 查询所有的键Set<String> keys = map.keySet();System.out.println(keys);// 查询所有的值Collection<String> values = map.values();System.out.println(values);// 查询所有的键值对Set<Entry<String,String>> entrys = map.entrySet();System.out.println(entrys);// 查询元素是否存在map中System.out.println(map.containsKey("锄禾"));System.out.println(map.containsKey("悯农"));System.out.println(map.containsValue("锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。"));// 查询map集合键值对的个数System.out.println(map.size());// 根据键查询键对应的值System.out.println(map.get("静夜思"));System.out.println(map.get("静夜思000"));}
}

8.5 遍历map集合(重点重点掌握)

  • 通过key遍历
  • 通过entry遍历
package com.qf.map;import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;public class Demo03 {public static void main(String[] args) {HashMap<String, String> map = new HashMap<String, String>();map.put("悯农", "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦。");map.put("静夜思", "床前明月光,疑是地上霜。举头望明月,低头思故乡。");map.put("望庐山瀑布", "日照香炉生紫烟光,遥看瀑布挂前川。飞流直下三千尺,疑是银河落九天。");// 查询所有的键Set<String> keys = map.keySet();System.out.println(keys);// 查询所有的键值对Set<Entry<String,String>> entrys = map.entrySet();System.out.println(entrys);// 通过键遍历map集合System.out.println("===============foreach遍历key==============");for (String key : keys) {System.out.println(key + "=====" + map.get(key));}System.out.println("===============iterator遍历key==============");Iterator<String> it = keys.iterator();while (it.hasNext()) {String key = it.next();System.out.println(key + "<<<>>>" + map.get(key));}// 通过键值对遍历集合System.out.println("===============foreach遍历entry==============");for (Entry<String, String> entry : entrys) {System.out.println(entry.getKey() + "=========" + entry.getValue());}System.out.println("===============iterator遍历entry==============");Iterator<Entry<String,String>> its = entrys.iterator();while(its.hasNext()) {Entry<String,String> entry = its.next();System.out.println(entry.getKey() + "------------" + entry.getValue());}}
}

Java基础——Day18——泛型,collections,set,map相关推荐

  1. Java基础之泛型简单讲解(通俗易懂)

    Java基础之泛型简单讲解(通俗易懂) 1. 前言 2. 简单例子对比理解 2.1 未使用泛型例子--ArrayList 2.2 使用泛型的例子 2.2.1 ArrayList 举例 2.2.2 Ha ...

  2. Java基础day18

    Java基础day18 Java基础day18-字节缓冲流&字符流 1.字节缓冲流 1.1字节缓冲流构造方法 1.2字节流复制视频 2.字符流 2.1为什么会出现字符流 2.2编码表 2.3字 ...

  3. 【JAVA基础】java基础之-泛型详解

    写在前面的话 脑子是个好东西,可惜的是一直没有搞懂脑子的内存删除机制是什么,所以啊,入行多年,零零散散的文章看了无数,却总是学习了很多也忘了很多. 痛定思痛的我决定从今天开始系统的梳理下知识架构,记录 ...

  4. java基础之泛型(Generics)

    泛型,广泛存在于各种开源框架及容器集合类中,在我们阅读源码的过程中一定会碰到,作为java基础知识的一个重要模块,对泛型的理解和掌握有助于我们在之后的源码阅读中借鉴框架思想以及在项目开发中灵活应用泛型 ...

  5. 14. Java基础之泛型

    一. 泛型概念的提出(为什么需要泛型)? 首先,我们看下下面这段简短的代码: 1 public class GenericTest { 2 3 public static void main(Stri ...

  6. JAVA基础-06.集合-15.【Map】

    01_Map集合遍历键找值方式 02_Map集合遍历键值对方式 03_练习_计算一个字符串中每个字符出现次数 04_斗地主案例需求分析 day04 [Map] 主要内容 Map集合 教学目标 能够说出 ...

  7. Java基础—集合2Set接口和Map接口

    第一讲 Set 一 概述 Set:1. 元素存储无下标,所以元素是无序(存入和取出的顺序不一定一致) 2. 元素不可以重复 |--HashSet:底层数据结构是哈希表.线程不同步. 保证元素唯一性的原 ...

  8. JAVA基础知识之Collections工具类

    排序操作 Collections提供以下方法对List进行排序操作 void reverse(List list):反转 void shuffle(List list),随机排序 void sort( ...

  9. Java基础之泛型反射

    a.泛型 含义:是JDK1.5的新特性,本质是参数化类型,即所操作的数据类型被指定为一个参数,使用时通过传参来指定具体的类型. 好处:安全简单.具体体现在提供编译时的强类型检查,而不用等到运行:可避免 ...

最新文章

  1. 百度推出自动驾驶系统Apollo2.0, 距商业化“更近一步”!
  2. python写魔兽世界脚本_用python bat写软件安装脚本 + HM NIS Edit自动生成软件安装脚本...
  3. 与1000天的我约定
  4. 在安装one_gadget遇到 one_gadget requires Ruby version >= 2.4. 的问题解决
  5. C++中的 auto类型详解
  6. bzoj2154(莫比乌斯反演)
  7. PowerDesigner反向工程 mysql
  8. IDEA自动勾选显示类型(specify type)
  9. Bootstrap 状态切换
  10. ​OCO订单(委托)
  11. vbreport8.wpf.viewer 个别电脑不显示_【电脑手机小技巧】新买的电脑,第一次开机最好要这样设置...
  12. 旋转式直流无刷Maxon电机与copley驱动器调试
  13. 网盘上传文件服务器失败原因,百度网盘上传文件一直失败是什么情况?具体解决方法...
  14. 科创人·望繁信创始人索强:中国版流程挖掘注定有完全不同的活法
  15. sqlserver笔记
  16. MySQL create database 新建utf-8/utf8mb4编码 数据库
  17. matlab plot大小,Matlab 修改plot大小
  18. 50Projects--Blurry Loading
  19. The number of GET/POST parameters exceeded settings.DATA_UPLOAD_MAX_NUMBER_FIELDS. ERROR:django.secu
  20. linux自定义命令-通过关键字批量杀死进程

热门文章

  1. 2018年计算机CPU纳米制程,英特尔CPU缺货情况持续 10纳米制程遥遥无期
  2. Arduino 无线继电器 蓝牙 4.0 BLE XBEE 24L01 4路遥控开关
  3. Drools基本介绍
  4. Sping 自己学习心得(IOC)
  5. 基于WIFI探针的商业大数据分析系统(hadoop+spark+hbase+bootstrap+echarts)
  6. OllyDBG 杂记
  7. 魔力宝贝/石器时代 图档格式压缩算法
  8. 混合高斯模型 opencv
  9. HTG评论Braven BRV-X:耐候蓝牙音频
  10. 2020威海CCPC D,思维训练