# zb_java0802 **Repository Path**: climpeaker/zb_java0802 ## Basic Information - **Project Name**: zb_java0802 - **Description**: 集合及工具类 - **Primary Language**: Java - **License**: GPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 3 - **Created**: 2018-08-02 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # zb_java0802 # 课堂笔记 *集合及工具类* *泛型和比较器* ## 1 集合 ### 1.1 map集合 * 1 map集合 map集合的元素时一个键值对,以键作为存储的标识,进行散列存储; 键和值的类型都是对象类型;一般采用String作为键;值可以是任何对象类型,可以是数组、Set、List; 键值对:由键(key)和值(value)组成,键和值是一一对象的关系,java中用 Entry抽象封装了键值对; map集合中存储的是一个个的键值对,也就是map中存储的是Entry对象; map可以通过get(key)的方式获取该key的值(value) map集合的遍历: map集合没有迭代器;但是可以获取所有键集合的迭代器;可以获取所有Entry集合的迭代器; 先取出 Key的Set集合或者 Entry的Set集合,Value的集合,然后再对其进行遍历; * 2 HashMap实现类 底层是Hash散列存储【对key进行Hash散列】; | 是否可以重复 | 是否可以为null | 是否有序 | 是否排序 | |:---------:|:-----------:|:--------:|:-------:| | 否 | 是 | 否 | 否 | * 3 LinkedHashMap实现类 底层是链表存储进行实现; | 是否可以重复 | 是否可以为null | 是否有序 | 是否排序 | |:---------:|:-----------:|:--------:|:-------:| | 否 | 是 | 是 | 否 | * 3 TreeMap实现类 底层是树型存储进行实现; | 是否可以重复 | 是否可以为null | 是否有序 | 是否排序 | |:---------:|:-----------:|:--------:|:-------:| | 否 | 否 | 否 | 是 | * 3 HashTable实现类 是HashMap的线程安全类; 代码[com.yuw.collectionTools]: *课下作业:* 使用集合存储一张Excel表格内容,并进行输出显示;【要求有序】 提示:使用List+Map的形式进行存储; map表示一行,用键值对存储该行中各列的值; list表示有多少行,list中存储了多少个map对象就有多少行数据; ### 1.2 泛型 因为集合中存储的都是Object类型,使用了用父类执行子类的多态,如果需要调用子类的方法,则需要进行向下溯型; 泛型是在使用集合时,可以指定集合可以存储的具体的子类类型;这样可以避免向下溯型的转换过程; 泛型也是使用多态【父类指代子类】; ### 1.1 集合和数组工具类 Collections是集合的工具类;Arrays是数组的工具类; 集合工具类中的sort方法只能对可以排序的基本类型和String类型进行排序;【只有实现了Comparable接口的类才能使用sort方法进行排序】 sort还有一个重载方法,要求提供实现了Coparator接口的比较器; 也就是说,如果是自定义的类需要使用sort方法进行排序,则需要该类实现Coparable接口,或者提供实现了Comparator接口的比较器; 代码[com.yuw.collectionTools.comparedemo]: 代码[com.yuw.collectionTools.comparedemo2]: ### 1.2 包装类 * 1 包装类的概念 包装类:就是对基本类型的抽象封装。 8种基本类型具有对应的8中包装类: | 基本类型 | 包装类 | |:---------:|:-----------:| | byte | Byte | | short | Short | | int | Integer | | long | Long | | float | Float | | double | Double | | char | Character | | boolean | Boolean | 作用: (1)将8种基本类型纳入到面向对象的体系中; (2)集合中只存储对象类型。【因为有些情况下只能使用包装,例如:线程同步】 * 2 包装类、基本类型、String类型之间的转换 *自动拆箱和装箱* 装箱:基本类型可以自动默认转换为包装类类型,这一过程叫做装箱; 拆箱:将包装类型转换为基本类型,这一过程叫做拆箱; *三者之间的转换关系* 包装类类型转换为基本类型: (1)默认转换; (2)包装类.XXXValue()方法 基本类型转包装类类型: (1)构造方法; (2)默认转换 (3)包装类类型.valueOf(基本类型) 包装类类型转String类型: (1).toString()方法 (2)包装类+"" String转包装类: (1)构造方法 (2)静态valueOf方法【可以做进制转换】 String转基本类型: (1)静态方法parseInt 基本类型转String类型: (1)基本类型+"" (2)构造方法【可以做进制转换】 ### 1.3 内部类 定义在一个类内部的类就是内部类; 根据定义位置分为: 成员内部类; 静态内部类; 局部内部类; 匿名内部类;【没有名字的局部内部了就是匿名内部类】 *匿名内部类* 没有名字的局部内部了就是匿名内部类; 语法: 接口/抽象类 变量名 = new 接口/抽象类(){ // 此处需要对接口或抽象类的抽象方法全部进行实现 }; 解析: (1)表面上好像是new创建了抽象类的实例对象,jvm内部是分两步进行处理, 第一步,创建一个匿名的子类来实现接口或抽象类的抽象方法; 第二步,创建第一步的匿名子类的实例对象; 作用: 可以通过使用匿名内部类直接“new”抽象类和接口; 匿名内部类使用情景: 当调用者只关注于抽象行为的动作的执行结果而不关注于动作的执行者时,使用匿名内部类;【一般多用于事件处理】 代码[com.yuw.collectionTools.innerclassdemo]以及[com.yuw.collectionTools.comparedemo2.innerclass]: ### 1.4 Object Object类是java中所有类的根类。【java中所有的类都是Object类的直接或间接子类】 java所有的了都会从Object中继承一些行为方法,主要有: hashCode() toString() 在自定义类中可以通过ide工具自动生成,也可以自己重写; 如果没有进行重写,则调用Object类中的toString方法 右键 -- source -- generate toString equals() 重写Object的equals方法 *关于equals方法的使用* == 和equals的区别: == :对于对象类型,判定的是地址引用是否相同; equals方法:对于对象类型,判定的是内容是否相同; equals方法判定对象类型的内容相同的前提条件: 该类重写了Object的equals方法,才能判定内容相同; 如果 没有重写,则equals方法还是判定地址相同; 因为Object类中的原始equals方法就是判定地址相同,所以子类只有重写以后,才可以判定内容相同; 8种包装类类型和String类型都重写了Object类的equals方法; 注意: 如果自定义类想要通过equals方法判定两个对象的内容是否相同,则需要在自定义类中重写equals方法; 代码[com.yuw.objectdemo]: #### 参与贡献 1. Fork 本项目 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 码云特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. 码云官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解码云上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是码云最有价值开源项目,是码云综合评定出的优秀开源项目 5. 码云官方提供的使用手册 [http://git.mydoc.io/](http://git.mydoc.io/) 6. 码云封面人物是一档用来展示码云会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)