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

news2024/12/28 20:13:52

HeadFirst Java

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

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


前言

上一小节,我们着重介绍了ArrayList,以及使用sort方法排序歌单。遇到了编译错误的问题,引入了泛型的介绍,以及comparable与comparator两个接口解决 排序的问题。这一小节继续介绍其他的集合。
泛型的理解不用太扣,就是泛型的类,E会被替代为实际类型, 什么时候替代,一般是创建实例 和 实现接口时 会用到具体的类。
书中对于什么时候替代并没有具体指出,这里是我自己的理解了。

当歌单数据有重复时,我们并不需要记录重复歌名,怎么办呢?
在这里插入图片描述
在这里插入图片描述`

在这里插入图片描述

对象相等

引用相等

指向同一个对象的引用相等,使用”==“,根据引用的bits pattern(位模式)进行比较,指向同一对象的 引用的 bits 相等。

equals() 默认执行”==“操作

references to two different objects will contain a diffterent bits pattern

hasCode(),获取对象的哈希值,因为指向同一对象,所以相等

hasCode()默认返回对象特有的序号(哈希值),这个值根据内存位置计算,因此每个对象的哈希值都不相同
在这里插入图片描述

对象相等

堆上的两个不同对象 在意义上相同

必须覆盖继承Object的hasCode() 和 equls()

覆写hasCode,比如标题相等,hashcode就返回相等值
覆写equals,比如标题相等,equls就返回true

if (foo.equals(bar) && foo.hasCode() == bar.hasCode())

在这里插入图片描述

HashSet如何检查重复

先根据对象的哈希值放入Set,同时会比较Set中其他对象的哈希值

所以必须覆写hashCode(),否则不可能有相同哈希值的对象

如果hashCode()找到相同hascode的两个对象,会进一步调用equals()比较是否在意义上相等(等效)。
在这里插入图片描述
在这里插入图片描述

总结eqauls()与hasCode()

两个对象相等

  • 哈希值 ,hasCode()返回相等
  • a.equals(b),b.equals(a)相等

equals即是对象相等
哈希值相等 不能推 对象相等,对象相等 必推 哈希值相等
—— 若equals被覆盖,hasCode也必须覆盖
——a.equals(b) 为true,则 a.hasCode == b.hasCode 为true。反之无

为什么不同对象 有相同hashCode的情况?

HashSet通过hashCode加快查询对象的速度,ArrayList则是从头遍历。
答:这与hashCode的计算算法有关,兼顾效率的同时,尽可能让不同对象的hashcode不同,但总可能会有相同情况。这时hashSet则会再根据equals进一步验证。可以理解为,hashCode是初步缩小查找范围。

TreeSet

保持有序,工作原理与sort()一样,具体回忆上一小节
1.元素的类实现Comparable接口
2.传入Comparator对象参数
在这里插入图片描述

Map

在这里插入图片描述
在这里插入图片描述

回到泛型

普通数组工作方式

在这里插入图片描述

使用多态参数与泛型

在这里插入图片描述
思考:ArrayList参数可以接受ArrayList对象吗?
普通数组Animal[]可以传入Dog[]
在这里插入图片描述
大家动手试试的话,显然编译会报错?那么为啥呢,明明数组是可以的,集合咋就G了
——不妨反证,如果可以会怎样?

public void takeAnimal(ArrayList<Animal> animals) {
	animals.add(new Cat());
}

如上,cat加入ArrayList当然合理,但是你传入ArrayList给该方法,那么Cat就会混进去Dog的集合,编译器当然不会允许这种情况
结论:形式参数声明为ArrayList 只会取用 ArrayList 具体对象参数。

这时候就更奇怪了,那同理数组我也可以传个cat给dog数组

public void test() {
	Dog[] dogs = {new Dog()};
	takeAnimals(dogs);
}
public void takeAnimal(Animal[] ani) {
	ani[0] = new Cat();
}

确实可以通过编译,但运行期JVM会发现并丢出异常
结论:数组类型在JVM运行期间检查,集合的类型检查只在编译期间

泛型的万用字符

那么到底如何多态化集合参数呢?像普通数组那样传入猫狗猪,且能eat()——万用字符 ?

public void takeAnimal(ArrayList<? extends Animal> animals) {
	for (Animal a:animals) //可以通过
		a.eat();
	
	animals.add(new Cat());//不能通过编译,一旦使用万用字符,编译器阻止任何破坏 引用参数集合 的操作
}

使用万用字符,编译器只允许操作集合,不允许新增元素,避免 将猫加入狗集合 问题,保障执行期间安全

相同功能的语法:上一节提到,泛型方法 使用 未定义在泛型类的 形式参数

public <T extends Animal> void take(ArrayList<T> list)

一般如何选择呢?通常使用万用字符,除非如下更有效率
在这里插入图片描述

练习

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

【win10 文件夹数量和看到不一致查看隐藏文件已经打开,Thumb文件作妖】

目录 任务介绍&#xff1a;重命名规则修改前修改后 实现思路VB代码实现BUG犯罪现场&#xff08;眼见不一定为实&#xff09;破案1&#xff1a;抓顶风作案的反贼&#xff01;&#xff01;&#xff01;破案2&#xff1a;破隐身抓刺客&#xff01;&#xff01;&#xff01;杀器&am…

JavaWeb之Servlet(上)

前言 1. 什么是Servlet (1) Servlet介绍 (2) Servlet运行于支持Java的应用服务器中。 (3) Servlet工作模式&#xff1a; 2. Servlet API 3. 第一个Servlet (1) 创建一个类实现Servlet接口,重写方法。或继承HttpServlet亦可 (2) 在web.xml文档中配置映射关系 标签的执行…

书生浦语训练营第2期-第7节作业

一、基础作业 二、进阶作业

作为餐饮行业HR,怎么选择一套合适的HCM人事管理系统?

在餐饮业这个行业中&#xff0c;人员流动性较高&#xff0c;特别是对于服务员和厨师这类基层员工&#xff0c;招聘一直是一个难题。根据艾瑞数据测算&#xff0c;到2024年&#xff0c;中国餐饮行业的年收入将超过6万亿元&#xff0c;年复合增长率高达8.8%。作为餐饮企业的品牌战…

Vue从入门到实战Day03

一、生命周期 1. 生命周期四个阶段 思考&#xff1a; ①什么时候可以发送初始化渲染请求&#xff1f; 答&#xff1a;越早越好&#xff0c;在创建阶段后 ②什么时候可以开始操作DOM&#xff1f; 答&#xff1a;至少DOM得渲染出来&#xff0c;在挂载阶段结束后。 Vue生命周…

【用文本生成歌声】Learn2Sing 2.0——歌声转换算法即梅尔频谱详解

一. 频谱图与梅尔谱图的介绍 频谱图&#xff1a;频谱图可以理解为一堆垂直堆叠在一起的快速傅里叶变换结果。 1.1 信号 在进入频谱图模块之前&#xff0c;首先我们需要了解信号是什么。 信号就是某一特定量随时间变化&#xff0c;对于音频来说&#xff0c;这个特定的变化量就…

Django之创建Model以及后台管理

一&#xff0c;创建项目App python manage.py startapp App 二&#xff0c;在App.models.py中创建类&#xff0c;以下是示例 class UserModel(models.Model):uid models.AutoField(primary_keyTrue, auto_createdTrue)name models.CharField(max_length10, uniqueTrue, db…

HFSS学习-day3-HFSS的工作界面

工作界面也称为用户界面&#xff0c;是HFSS软件使用者的工作环境:了解、熟悉这个工作环境是掌握HFSS软件使用的第一步 HFSS工作环境介绍 1.HFSS工作界面简单的组成说明2.工作界面中各个工作窗口功能主菜单工具栏项目管理窗口属性窗口信息管理窗口进程窗口三维模型窗口 3.HFSS主…

【Lammps】lammps常用入门建模命令(一)

【Lammps】lammps常用入门建模命令 前言脚本总览1、units2、dimension3、boundary4、atom_style原子模型构建5、lattice6、region7、create_box8、creat_atoms1. 在盒子box内填充原子2.在指定区域&#xff08;region&#xff09;内填充原子3.生成单个原子4.随机生成原子 9、mas…

影视极品转场音效大全,经典获奖通用音效素材

一、素材描述 本套音效素材&#xff0c;大小15.02G&#xff0c;16个压缩文件。 二、素材目录 01-华纳兄弟电影音效库合辑&#xff08;2个压缩文件&#xff09; 02-影视极品转场音效&#xff08;2个压缩文件&#xff09; 03-好莱坞经典综合音效&#xff08;4个压缩文件&…

JMeter断言介绍

JMeter是一个功能强大的性能测试工具&#xff0c;它不仅可以模拟用户的行为&#xff0c;还可以对web应用程序的响应进行检测。其中断言就是JMeter中非常实用的功能之一。 断言是用于验证服务器响应是否正确的测试元素。它会检查服务器响应中的部分或全部内容&#xff0c;并在响…

使用GitLab自带的CI/CD功能在本地部署.Net8项目(二)

前置内容&#xff1a; 通过Docker Compose部署GitLab和GitLab Runner&#xff08;一&#xff09; 目录 一、创建代码仓库 二、创建GitLabRunner 三、注册Runner 四、配置Runner&#xff0c;绑定宿主Docker 五、创建.Net8WebApi项目进行测试 六、总结 一、创建代码仓库 …

达梦数据刷盘测试

达梦数据库为了保证数据故障恢复的一致性&#xff0c;REDO 日志的刷盘必须在数据页刷盘之前进行。 下面我们通过测试来验证是不是这样 执行我们事先准备的SHELL脚本 可以看到第一次strings文件没有输出&#xff0c;说明刚写的数据在数据库的BUFFER缓冲区内&#xff0c;还没有刷…

【C++】学习笔记——stack和queue

文章目录 九、stack和queue1. stack和queue的介绍2. stack和queue的使用3. stack和queue的模拟实现4. deque的简单了解 未完待续 九、stack和queue 1. stack和queue的介绍 stack 就是我们常说的 栈 &#xff0c;而 queue 就是 队列 。栈就是 后进先出 的数据结构&#xff0c;队…

Windows命令行一键安装、配置WSL的方法

本文介绍在Windows电脑中&#xff0c;通过命令行的方式&#xff0c;快速、方便安装适用于Linux的Windows子系统&#xff08;Windows Subsystem for Linux&#xff0c;WSL&#xff09;的方法。 WSL是由微软开发的一项功能&#xff0c;允许在Windows操作系统上运行Linux发行版系统…

【LLM 论文】Least-to-Most Prompting 让 LLM 实现复杂推理

论文&#xff1a;Least-to-Most Prompting Enables Complex Reasoning in Large Language Models ⭐⭐⭐ Google Research, ICLR 2023 论文速读 Chain-of-Thought&#xff08;CoT&#xff09; prompting 的方法通过结合 few-show prompt 的思路&#xff0c;让 LLM 能够挑战更具…

Re_Lasso

from sklearn.linear_model import LassoCV, Lasso import pandas as pd from sklearn.model_selection import train_test_split from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score from sklearn.model_selection import GridSearchCV# 读取数据…

极市平台 | 一文详解视觉Transformer模型压缩和加速策略(量化/低秩近似/蒸馏/剪枝)

本文来源公众号“极市平台”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;一文详解视觉Transformer模型压缩和加速策略(量化/低秩近似/蒸馏/剪枝) 作者丨Feiyang Chen等 来源丨AI生成未来 编辑丨极市平台 0 极市导读 本研究…

(24)实时采集微信消息(基于独立窗体)-微信UI自动化(.Net+C#)

整理 | 小耕家的喵大仙 出品 | CSDN&#xff08;ID&#xff1a;lichao19897314&#xff09; Q Q | 978124155 往期知识回顾 (1)开启探索微信自动化之路-微信UI自动化(.NetC#) (2)初始化微信窗体UI自动化实例-微信UI自动化(.NetC#) (3)采用热键终止微信采集任务-微信UI自动…

Linux网络部分——SSH远程访问及控制

目录 一、配置OpenSSH服务端【☆】 1. ssh服务端配置 vim /etc/ssh/sshd_config 2.客户端连接验证 二、使用SSH客户端程序 1.ssh 远程登录 2.scp 远程复制 3.sftp 安全FTP 三、SSH的验证方式 1. 密钥对验证【☆】 2. 如何实现免密登录 【拓展】免交互创建密钥对和免交…