【16-Ⅰ】Head First Java 学习笔记

HeadFirst Java

本人有C语言基础,通过阅读Java廖雪峰网站,简单速成了java,但对其中一些入门概念有所疏漏,阅读本书以弥补。

第一章 Java入门
第二章 面向对象
第三章 变量
第四章 方法操作实例变量
第五章 程序实战
第六章 Java函数库
第七章 继承与多态
第八章 深入多态
第九章 构造器与垃圾收集器
第十章 数字与静态
第十一章 异常处理
第十二章 GUI(内部类)
第十三章 Swing
第十四章 保存对象
第十五章 网络与线程
第十六章 数据结构


前言

结束了上一章,网络与多线程,真是一个超长的巨头,内容也很重要!主要学习了客户端、服务端的Socket连接,以及多线程并发的相关问题。这一章我们学习Java常用的集合框架(Collections Framework),支持大多数的数据结构!此外,也将学习泛型,这也是一个重要的概念。

这里我们需要对歌单文件进行一个排序,前文学习过ArrayList,但这个集合并没有sort方法,怎么办呢?

常用的集合
在这里插入图片描述

排序

Collections.sort()

P535~P538,先是使用该方法对ArrayList排序,后要对ArrayList排序会编译报错,为什么呢?下文详解

泛型

目的:写出有类型安全性的集合

基本用到泛型的程序都与集合有关,让编译器帮助你避免把Dog加到一群Cat中,将错误在编译器找到,而不是执行期
在泛型之前,我们把集合写成处理Object类,任何东西都可以放进去,但取出来时我们只能得到Object类的引用,这在好几章前讲过
在这里插入图片描述

如何使用泛型:
1.创建 泛型化类的实例
2.声明与分配 泛型类型的变量
3.声明与调用 存取泛型类型的方法

new ArrayList<Song>();//  1.创建实例
List<Song> songList = new ArrayList<Song>();
ArrayList<Animal> list = new ArrayList<Hippo>();//这是错误的分配
// 声明:List<Song> songList 声明了遥控 泛型类的实例 的引用变量
// 分配: = ,将ArrayList<Song> 泛型类的实例 赋给 声明的引用变量
void foo(List<Song> list);//3.声明
x.foo(songList);//4.调用

使用泛型时,我们<>中填的永远是具体的类,而不是一个符号。读完下文,再理解这句话,意思就是:告诉泛型类,其形式参数的值是传入的具体类。如List ,List接口的形参T的值为Song。

补充4. 实现 泛型类接口 的 类

在后续中,实现Comparable会强调。
其实与声明也一样,List不就是用到了List接口,无论你怎么用(创建实例、声明变量、实现接口等等),你使用到了泛型(List),编译器会去看这个接口,并且知道接口定义的T的值为Song

使用泛型的类

从ArrayList源码学起,关键两部分
1)类的声明
2)方法的声明

关键在于理解E是什么?(看了英文版更具体些)
E 表示 数组将保存元素的类型 的一个替代符号(Element,实际上你改成也可以),它会在你声明和创建泛型类的实例时 被替代为一个具体的类。
E 即 形式参数,在方法中,传入参数的类型(形式参数) 可以用E。也就是不管E最后被替换成啥,咱们都可以在这个方法传进去

在这里插入图片描述

在这里插入图片描述

运用泛型的方法

由上,泛型的类即 类的声明 用到了 形式参数;那么泛型的方法 即 方法的声明 用到了 形式参数
关于方法的形式参数的用法如下
1.使用 定义在类的 形式参数

public class ArrayList<E> {public void add(E o)//类声明了E这个形式参数,所以方法可以直接用
}

2.使用 未定义在类的 形式参数

public <T extends Animal> void test(ArrayList<T> list)//在 返回类型(void)之前 声明 形式参数(这里T is-A Animal)

思考:
下面这行代码,与上面有何区别?

public void test(ArrayList<Animal> list)

回到sort()

为什么不能直接Collections.sort(songList)?
观看源码,可知因为Song 不是Comparable的子类,所以不能传入对象
在这里插入图片描述
注意,对于泛型,extends 代表 IS ”是一个“。也就是T 要么是 继承了Comparable类,要么是 实现了Comparable接口。实际上这里Comparable是个接口。所以这里意思是后者。

对于类的extends,即IS-A 包含继承关系,X IS-A Y,表示X比Y可做的更多
对于类的implement,即CAN-DO,包含扮演的作用,X CAN-DO Y,表示X可以做Y做的事情,这是接口
在泛型的类,其extends,IS,包含了继承与扮演两种 含义。

为什么泛型要用extends关键词,不加入IS关键词?

会破坏旧版的程序,或许有人用了名称为is的变量

重新实现Song类

问题就出在Song必须实现Comparable接口,才能将ArrayList传给Collections.sort方法
在这里插入图片描述

返回负数,传入对象大;正数,传入对象小。

class Song implements Comparable<Song> {//普通的类Song 实现 泛型的类Comparable接口String title;public int compareTo(Song s) {return title.compareTo(s.getTitle());//String类有compareTo方法}
}

原文:按规定,这里泛型类的<> 中内容 必须是Song,或者其他可以与Song比较的类

误区:public class Song implements Comparable ,把E当作类!E只是定义泛型类时声明了一个形式参数,实际运用泛型时,我们要指定具体的类。
注意,这里是普通类 实现一个接口,没有定义形式参数E,E是在接口定义那定义的
类比创建实例时ArrayList,创建泛型类实例时,指明集合元素的类型;编译器对该实例,E都会替换为Song,add等方法传入实际参数即对象只能是Song类
这里实现接口,同理 指明与Song类(这里的实现类)可比较的元素的类型是Song;编译器对该实现类,E都会替换为Song,覆写方法时传入实际参数即对象必须是Song类

在这里插入图片描述

自定义Comparator(比较器)

那如果要根据歌星名排序呢?

在song类中加 flag变量,再在compareTo中加上if判断即可——这样不好,内管外,不合理

查询API,可知sort的重载版本——传入Comparator参数
在这里插入图片描述

根据调用sort的版本
1.元素的类 实现Comparable接口 ,使用compareTo方法
2.自定义比较器类 实现Comparator接口,使用compare方法

使用比较器的点歌系统
class box {ArrayList<Song> songList = new ArrayList<>();class titleCompare implements Comparator<Song>  {//用 内部类 实现 接口类,并指定接口形参为Songpublic int compare(Song one,Song two) return one.getTitle().compareTo(two.getTitle());class ArtCompare implements Comparator<Song>  {// 为什么用内部类?实现同一个接口多次 + 面向对象的意义public int compare(Song one,Song two) //return one.getArt().compareTo(two.getArt());public void test() {Collections.sort(songList,new titleCompare());//调用sort的第二版}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1409662.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 模拟实现 priority_queue(优先队列)

目录 一&#xff0c;优先队列简介 二&#xff0c;priority_queue 的内部实现原理 三&#xff0c;模拟实现 priority_queue 1&#xff0c;模板参数与数据结构 2&#xff0c;构造 3&#xff0c;辅助功能&#xff08;堆的有序化&#xff0c;建立堆&#xff09; 4&#xff0…

202012青少年软件编程(Python)等级考试试卷(一级)

第 1 题 【单选题】 运行下方代码段&#xff0c;输出是6&#xff0c;则输入的可能是&#xff08; &#xff09;。 a eval(input())print(a)A :8%2 B :8/2 C :3*2 D :3**2 正确答案:C 试题解析: 第 2 题 【单选题】 关于Python变量&#xff0c;下列叙述正确的是&#x…

【智能算法】鹦鹉优化算法(WO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2024年&#xff0c;J Lian等人受到鹦鹉学习行为启发&#xff0c;提出了鹦鹉优化算法&#xff08;Parrot Optimizer, PO&#xff09;。 2.算法原理 2.1算法思想 PO灵感来自于在驯养的鹦鹉中观察到的…

八皇后问题-使用递归回溯方法用c语言实现

学习的视频&#xff1a;懒猫老师 https://www.bilibili.com/video/BV1wJ411U7Gy/?spm_id_from333.337.search-card.all.click&vd_sourceda60f9e1bc3321cae28c29fe80e9b078 代码&#xff1a; 编译&#xff1a;gcc test.c -g #include <stdio.h> #include<st…

【openLooKeng集成Hive连接器完整过程】

【openLooKeng集成Hive连接器完整过程】 一、摘要二、正文2.1 环境说明2.2 Hadoop安装2.2.1. 准备工作2.2.2 在协调节点coordinator上进行安装hadoop2.2.3、将Hadoop安装目录分发到从节点worker2.2.4、在协调节点coordinator上启动hadoop集群2.3 MySQL安装2.4 Hive安装及基本操…

数据结构算法——链表带环问题——数学深度解析

前言:本节内容主要是讲解链表的两个问题 &#xff1a;1、判断链表是否带环&#xff1b; 2、一个链表有环&#xff0c; 找到环的入口点。 本节内容适合正在学习链表或者链表基础薄弱的友友们哦。 我们先将问题抛出来&#xff0c;友友们可以自己去力扣或者牛客网去找相应题目&…

el-tabs作为子组件使用页面空白

文章目录 前言一、问题展示二、源码分析三、解决方案 前言 如果el-tabs是子组件&#xff0c;父组件传值value / v-model为空字符&#xff0c;这个时候在watch中监听value / v-model就会发现监听的数据会被调用为‘0’。一定是作为子组件引用&#xff0c;且在watch进行监听&…

【Java探索之旅】包管理精粹 Java中包的概念与实践

文章目录 &#x1f4d1;前言一、封装1.1 封装的概念1.2 访问限定修饰符 二、封装扩展&#xff08;包&#xff09;2.1 包的概念2.2 带入包中的类2.3 自定义包2.4 常见的包 &#x1f324;️全篇总结 &#x1f4d1;前言 在Java编程中&#xff0c;封装是面向对象编程的核心概念之一…

令牌技术详解

1. 问题引出 之前我们讲 Cookie 和 Session 时提到过一个用户登录的场景&#xff1a;当用户登录时&#xff0c;服务器端可以把用户的登录信息存在Session中 并返回给客户端对应的SessionID&#xff0c;客户端会把这个SessionID存在Cookie 中当下次访问该服务器时&#xff0c;…

【C语言/数据结构】经典链表OJ习题~第二期——链中寻环

&#x1f388;&#x1f388;&#x1f388;欢迎采访小残风的博客主页&#xff1a;残风也想永存-CSDN博客&#x1f388;&#x1f388;&#x1f388; &#x1f388;&#x1f388;&#x1f388;本人码云 链接&#xff1a;残风也想永存 (FSRMWK) - Gitee.com&#x1f388;&#x1f…

JUC并发-共享模型-不可变

1、日期转换的问题 下面的代码在运行时&#xff0c;由于 SimpleDateFormat 不是线程安全的 Slf4j(topic "c.Test1") public class Test1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int…

Mac系统常用操作

文章目录 1、常用快捷键2、常用功能及其操作 1、常用快捷键 win和mac键盘对比&#xff1a;Command按键和Ctrl按键类似&#xff0c; 图片来源&#xff1a;https://www.xiaohongshu.com/explore/62d2787a0000000011012ab9锁屏&#xff1a;ControlCommandQ复制、粘贴、剪切、全选…

hdc不是内部或外部命令,也不是可运行的程序或批处理文件。【鸿蒙报错已解决】

文章目录 项目场景:问题描述原因分析:解决方案:此Bug解决方案总结Bug解决方案寄语项目场景: 最近遇到了这个问题,看到网上也有人在询问这个问题,实操了很多网上的解决方案发现并不能解决这个Bug,所以我在解决这个问题后,总结了自己和其他人的解决经验,进行了整理,写…

linux系统的rsync命令实现本机到远程主机之间目录的复制和同步

一、rsync命令介绍 在Linux中&#xff0c;rsync 是一个强大的命令行工具&#xff0c;用于同步文件和目录。它可以在本地或通过网络在远程系统之间复制文件。 二、远程目录复制的条件 1、系统要已经安装rsync工具 要使用 rsync 复制远程目录&#xff0c;需要确保系统上安装了 …

知识图谱与知识表示:人工智能的基石

知识图谱与知识表示&#xff1a;人工智能的基石 一、知识图谱&#xff1a;连接数据的桥梁1.1 知识图谱的构成1.2 知识图谱的应用 二、知识表示&#xff1a;AI的推理基础2.1 知识表示的定义2.2 知识表示的形式 三、从符号表示到向量表示3.1 符号表示与向量表示3.2 向量表示的优势…

自动化机器学习——网格搜索法:寻找最佳超参数组合

自动化机器学习——网格搜索法&#xff1a;寻找最佳超参数组合 在机器学习中&#xff0c;选择合适的超参数是模型调优的关键步骤之一。然而&#xff0c;由于超参数的组合空间通常非常庞大&#xff0c;手动调整超参数往往是一项耗时且困难的任务。为了解决这个问题&#xff0c;…

算法入门<二>:分治算法之汉诺塔问题及递归造成的栈溢出

1、分治算法 分治&#xff08;divide and conquer&#xff09;&#xff0c;全称分而治之&#xff0c;是一种非常重要且常见的算法策略。分治通常基于递归实现&#xff0c;包括“分”和“治”两个步骤。 分&#xff08;划分阶段&#xff09;&#xff1a;递归地将原问题分解为两…

PyCharm 2024新版图文安装教程(python环境搭建+PyCharm安装+运行测试+汉化+背景图设置)

名人说&#xff1a;一点浩然气&#xff0c;千里快哉风。—— 苏轼《水调歌头》 创作者&#xff1a;Code_流苏(CSDN) 目录 一、Python环境搭建二、PyCharm下载及安装三、解释器配置及项目测试四、PyCharm汉化五、背景图设置 很高兴你打开了这篇博客&#xff0c;如有疑问&#x…

小浪助手:下载学浪视频的最佳助手

小浪助手我已经打包好了,有需要的自己下载一下 学浪下载器链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.打开小浪助手.exe 3.选择一种登录方式&#xff0c;扫码登录或者手机号…

【办公类-26-02】20240423 UIBOT学分自动评价(自动登录、评价和退出,全自动)

背景需求&#xff1a; 我想用UIBOT自动模拟鼠标&#xff0c;登录每位老师的账户&#xff0c;进入评价区域&#xff0c;自动选择7次“满意”&#xff0c;输入1次“无”&#xff0c;然后提交。 C Dim objExcelWorkBook,arrayRet,iRet,temp,iPID,hWeb,dictRet,XobjExcelWorkBook …