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

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.mfbz.cn/a/607836.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android ViewFlipper

Android ViewFlipper 在很多APP都有如下的头条/热榜效果&#xff08;上下自动翻滚&#xff09; 这种效果可以使用很多方式实现&#xff0c;有一个简便的方式可以使用ViewFlipper控件实现&#xff0c;ViewFlipper控件继承结果如下&#xff1a; 可以看出ViewFlipper 继承自ViewA…

【混合轻量化】MobileNetV4 - Universal Models for the Mobile Ecosystem

MobileNetV4 - Universal Models for the Mobile Ecosystem MobileNetV4 - 移动生态系统的通用模型 论文链接&#xff1a;http://arxiv.org/abs/2404.10518 代码链接&#xff1a;https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobil…

LoRA的原理简介

在文章开始前先澄清一个概念&#xff0c;需要区分形近的单词"LoRa"&#xff08;long range&#xff09;&#xff0c;这是一项通信技术。熟悉物联网行业的朋友相对会比较熟悉LoRa这项技术&#xff0c;因为有些设备比如电梯的控制就使用了这个技术进行本地数据和命令的…

【Java】还不会数组?一文万字全搞定

前言&#xff1a;前面两章我们详细讲解了Java基本程序设计结构中的基本知识&#xff0c;&#xff0c;包括&#xff1a;一个简单的Java应用&#xff0c;注释&#xff0c;数据类型&#xff0c;变量与常量&#xff0c;运算符&#xff0c;字符串&#xff0c;输入输出&#xff0c;控…

冯喜运:5.10黄金反弹受阻,原油EIA库存激增引发市场情绪

【黄金消息面分析】&#xff1a;据最新市场数据显示&#xff0c;现货黄金在周四欧市早盘经历了显著下滑&#xff0c;价格一度跌破2310美元/盎司的关口&#xff0c;日内高点回落达10美元&#xff0c;截至发稿&#xff0c;黄金小幅反弹&#xff0c;交投于2312美元/盎司附近。此番…

网络新手如何上手水牛社软件?我的建议与看法

水牛社是一款专为电脑用户设计的软件&#xff0c;拥有明确的著作权&#xff0c;其核心功能在于发布和整合各类网络活动任务资源、教程等&#xff0c;内容多元且不设固定分类。其靠谱程度取决于你对软件的了解程度和个人需求的适配性。 软件内部包含五个主要栏目&#xff0c;大…

mysql: docker 异常 - mbind: Operation not permitted

mbind: Operation not permitted 前言&#xff1a;正文:结论 &#xff1a; 前言&#xff1a; 用数据库处理平台问题今天报错&#xff0c;mbind: Operation not permitted。 mbind 不允许操作&#xff0c;一头雾水这是什么意思。 网上找了很多资料大概意思是&#xff1a; 这个错…

SpringBoot中使用RocketMQ实现事务消息来保证分布式事务的一致性(有代码)

前言 分布式事务是分布式系统中非常常见的问题。是非常必要钱常见的。实现的方式也是多种多样。今天这个视频主要来分享一下RocketMQ实现事务消息来保证分布式事务的一致性。不知道大家使用过这种方式没有。这种分布式事务的原理其实和本地消息表一样。 本地消息表实现分布式…

1.基于python的单细胞数据预处理-质量控制

目录 质量控制过滤低质量细胞的指南双细胞过滤手动过滤低质量读数细胞自动过滤低质量读数细胞环境RNA校正 参考&#xff1a; [1] https://github.com/Starlitnightly/single_cell_tutorial [2] https://github.com/theislab/single-cell-best-practices 质量控制 原始的单细胞…

模拟实现链表的功能

1.什么是链表&#xff1f; 链表是一种物理存储结构上非连续存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 实际中链表的结构非常多样&#xff0c;以下情况组合起来就有8种链表结构&#xff1a; 单向或者双向 带头或者不带头 …

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎

猫头虎分享已解决Bug || Node.js安装失败Error: unable to connect to https://nodejs.org/猫头虎 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — …

活动回顾 |观测云 AI Agent 探索实践

亚马逊云科技“构建全球化软件和互联网新生态——ISV 行业”论坛上&#xff0c;观测云产品架构师刘锐发表了题为“AI Agent 可观测性探索与实践”的主题演讲&#xff0c;不仅展示了观测云在人工智能领域的前沿技术&#xff0c;更强调了在日益复杂的系统环境中&#xff0c;实现有…

autoware.universe 使用之Rosbag replay simulation放包仿真

本文将按照官方文档&#xff0c;通过播放rosbag录制包进行可视化模拟&#xff0c;中间也报了很多错误&#xff0c;特此记录下来&#xff0c;以免后续踩坑。 电脑配置如下&#xff1a;    ubuntu20.04    cuda: cuda-11.6    nvidia-driver 535    ros2: foxy 关于auto…

「MDN web 入门」学习笔记

目录 写在前面 1. MDN 简介 1.1 MDN 的主要特点 1.2 MDN 的主要功能 1.3 MDN 网页开发的指南 2. 安装基础软件 2.1 专业人士工具 2.2 初学者基本工具 3. 设计网站外观 3.1 计划 3.2 绘制草图 3.3 选定素材 3.4 文本 3.5 主题颜色 3.6 图像 3.7 字体 4. 处理文…

Redis(无中心化集群搭建)

文章目录 1.无中心化集群1.基本介绍2.集群说明 2.基本环境搭建1.部署规划&#xff08;6台服务器&#xff09;2.首先删除上次的rdb和aof文件&#xff08;对之前的三台服务器都操作&#xff09;1.首先分别登录命令行&#xff0c;关闭redis2.清除/root/下的rdb和aof文件3.把上次的…

认识卷积神经网络

我们现在开始了解卷积神经网络&#xff0c;卷积神经网络是深度学习在计算机视觉领域的突破性成果&#xff0c;在计算机视觉领域&#xff0c;往往我们输入的图像都很大&#xff0c;使用全连接网络的话&#xff0c;计算的代价较高&#xff0c;图像也很难保留原有的特征&#xff0…

oracle 数据库找到UDUMP的文件名称

oracle 数据库找到UDUMP的文件名称 select p.value||\||i.instance_name||_ora_||spid||.trc as "trace_file_name" from v$parameter p ,v$process pro, v$session s, (select sid from v$mystat where rownum1) m, v$instance i where lower(p.name)user_dump_…

Java_File

介绍&#xff1a; File对象表示路径&#xff0c;可以是文件&#xff0c;也可以是文件夹。这个路径可以是存在的&#xff0c;也可以是不存在的&#xff0c;带盘符的路径是绝对路径&#xff0c;不带盘符的路径是相对路径&#xff0c;相对路径默认到当前项目下去找 构造方法&…

英伟达推出视觉语言模型:VILA

NVIDIA和MIT的研究人员推出了一种新的视觉语言模型(VLM)预训练框架&#xff0c;名为VILA。这个框架旨在通过有效的嵌入对齐和动态神经网络架构&#xff0c;改进语言模型的视觉和文本的学习能力。VILA通过在大规模数据集如Coy0-700m上进行预训练&#xff0c;采用基于LLaVA模型的…

三.Django--ORM(操作数据库)

目录 1 什么是ORM 1.1 ORM优势 1.2ORM 劣势 1.3 ORM与数据库的关系 2 ORM 2.1 作用 2.2 连接数据库 2.3 表操作--设置字段 2.4 数据库的迁移 写路由增删改查操作 项目里的urls.py: app里的views.py: 注意点: 1 什么是ORM ORM中文---对象-关系映射 在MTV,MVC设计…
最新文章