【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.mzph.cn/pingmian/5759.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

收藏:关于闭包表

参考视频&#xff1a;【IT老齐513】经典树形数据结构-闭包表_哔哩哔哩_bilibili&#xff0c; 这个视频系列的确不错&#xff0c;500多个了。 闭包表&#xff0c;其实就是用来做树形结构的时候&#xff0c;如何快速找到某个节点下的所有后代节点&#xff0c;用两张表去完成&…

【html知识】用html写一个简单的个人网页

介绍&#xff1a; 这是一个HTML和CSS的代码段&#xff0c;它构建了一个基本的个人网页布局。以下是该代码的详细介绍&#xff1a; HTML部分&#xff1a; 文档类型与基础结构&#xff1a;<!DOCTYPE html> 声明了文档类型为HTML5。<html lang"en"> 定义…

设计模式-03 设计模式-依赖倒转原则案例分析

设计模式-03 设计模式-依赖倒转原则案例分析 目录 设计模式-02 设计模式-依赖倒转原则案例分析 1.定义 2.内涵 3.案例对比 4.注意事项 5.最佳实践 6.总结 1.定义 依赖倒转原则&#xff08;Dependency Inversion Principle&#xff0c;简称DIP&#xff09;高层级的模块…

ModuleNotFoundError: No module named ‘pyautogui‘

ModuleNotFoundError: No module named pyautogui 这个错误意味着你的Python环境中没有安装pyautogui这个模块。pyautogui是一个用于程序化地控制鼠标和键盘的Python模块&#xff0c;常常用于自动化任务、GUI测试等场景。 为了解决这个问题&#xff0c;你需要安装pyautogui模块…

Java实现以图识图功能模块(简单案例)

由于完整的以图识图系统代码较长且复杂&#xff0c;这里仅提供使用OpenCV进行特征提取和比较的简化版示例代码。 1. 引入OpenCV Java库 首先&#xff0c;你需要在项目中引入OpenCV的Java库。这通常涉及将OpenCV的jar包添加到项目的类路径中。 2. 提取图像特征 使用OpenCV的…

机器学习实战-聚类算法

聚类算法是一种无监督学习的算法&#xff0c;用于将数据集中的数据分成不同的聚类或组。聚类算法是数据挖掘和机器学习领域中常见的技术之一&#xff0c;具有广泛的应用。 以下是聚类算法的一些知识点&#xff1a; 聚类算法的目的是将数据集划分为不同的组&#xff0c;使得组内…

C++ 矩阵

目录 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 矩阵乘法 矩阵快速幂 相伴矩阵模板 [相伴矩阵,快速矩阵幂]CSES1722 Fibonacci Numbers 了解矩阵的数学原理&#xff08;大学线性代数&#xff09; 矩阵及转置矩阵 这里A就是一个矩阵&…

uniapp 桌面应用插件 Ba-Launcher

简介&#xff08;下载地址&#xff09; Ba-Launcher 可以让你的应用成为简单的桌面应用&#xff0c;如需扩展功能&#xff0c;请联系我。 截图展示 可关注博客&#xff0c;实时更新最新插件&#xff1a; uniapp 常用原生插件大全 使用方法 使用方法也很简单&#xff0c;在插…

PG数据库结构与oracle比较

1.数据库集簇逻辑结构 数据库集簇概念&#xff1a;一个大的数据库是由若干个小的数据库组成&#xff0c;实现数据的隔离存放&#xff0c;在概念上应该是与mysql一样的 在mysql中可以用show database列出数据库 PG中用\l 数据库对象存放在数据库中&#xff1a; PG中的所有数据…

题解:CF1951E(No Palindromes)

题解&#xff1a;CF1951E&#xff08;No Palindromes&#xff09; 题目翻译&#xff1a;给定一个长度为 n n n 的字符串 s s s&#xff0c;询问是否可以将其分成若干份&#xff0c;使得每一份都不是回文串。若可以&#xff0c;输出 YES 并给出任意一组方案&#xff1b;若不可…

【BASH 常用脚本系列3 -- shell实现查找目录并进入目录】

文章目录 shell实现查找目录并进入目录脚本实现shell实现查找目录并进入目录 在linux中终端下工作,如果要进入一个深度很深的目录的话需要 cd ./xx/xx./.. 执行很多次,用起来很麻烦,有些人就建议使用autojump来实现,但是autojump 的一个缺点是:如果本地有多套代码,只是它…

计算机英文论文常见错误写作习惯3

目录 第一部分 Numbers and Equations ‘such as’ and ‘etc.’ 第二部分 第一部分 Numbers and Equations 两个非常常见的错误是关于阿拉伯数字和方程式的表示。中国作家通常写阿拉伯数字&#xff0c;而不是拼出单词。然而&#xff0c;使用阿拉伯数字本身并不是一个错误…

【Shell】part1-Shell-基础入门篇

part1-基础入门 HelloWorld 创建,编写,运行 Shell 脚本 vim test.sh#!/bin/bash echo "Hello World !"# 1.作为可执行程序运行 chmod ax ./test.sh #使脚本具有执行权限 ./test.sh #执行脚本# 2.作为解释器参数运行 /bin/sh test.sh /bin/php test.php变量 变…

【Python】 逻辑回归:从训练到预测的完整案例

我把我唱给你听 把你纯真无邪的笑容给我吧 我们应该有快乐的 幸福的晴朗的时光 我把我唱给你听 用我炙热的感情感动你好吗 岁月是值得怀念的留恋的 害羞的红色脸庞 谁能够代替你呀 趁年轻尽情的爱吧 最最亲爱的人啊 路途遥远我们在一起吧 &#x1f3b5; 叶…

如何利用STM32F103实现太阳板的光线追踪

如何利用STM32F103实现太阳板的光线追踪 太阳能发电效率的提升一直是绿色能源领域的研究热点。通过太阳板的光线追踪技术&#xff0c;我们可以确保太阳板始终面向太阳&#xff0c;从而最大化其接收阳光的面积&#xff0c;提高能源转换效率。本文将介绍如何利用STM32F103微控制…

Redis第15讲——RedLock、Zookeeper及数据库实现分布式锁

由于篇幅原因&#xff0c;在上篇文章我们只介绍了redis实现分布式锁的两种方式——setnx和Redission&#xff0c;并对Reidssion加锁和看门狗机制的源码进行了分析&#xff0c;但这两种方案在极端情况下都会出现或多或少的问题。那么针对上述问题&#xff0c;比较主流的解决方案…

Linux服务器基本操作

Linux下服务器基本操作指令 Vim 文件名 进入 i编辑 esc退出编辑 &#xff1a;wq 保存退出 Cp -r文件夹 path 完整或…/ Cp 文件 path pwd 查看当前目录 rm -rf 2005 删除文件夹 Mkdir 创建文件夹 squeue查看提交队列 tail -f rsl.out.0000 在运行当前目录下查看进度 Scancel j…

用Scrapy 从数据挖掘到监控和自动化测试

Scrapy 是一个 BSD 许可的快速高级网络爬虫和网络抓取框架&#xff0c;用于抓取网站并从其页面中提取结构化数据。它可以用于广泛的用途&#xff0c;从数据挖掘到监控和自动化测试。 安装scrapy pip install scrapy 爬虫示例 示例代码写入文件 import scrapyclass QuotesSp…

Kylin Linux V10 SP1 aarch64部署k8s集群严重bug

目录 1.部署方式 2.遇到问题 3.问题解决 1.部署方式 通过sealos方式部署 2.遇到问题 适配Kylin Linux V10 SP1 aarch64部署pod 不少出现CrashLoopBackOff 通过命令: kubectl describe pod xxx -n default 查看,发现报错如下: Error response from daemon: OCI …

简约大气的全屏背景壁纸导航网源码(免费)

简约大气的全屏背景壁纸导航网模板 效果图部分代码领取源码下期更新预报 效果图 部分代码 <!DOCTYPE html> <html lang"zh-CN"> <!--版权归孤独 --> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible…