【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.hqwc.cn/news/682048.html

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

相关文章

Agent AI智能体的未来:无限可能

文章目录 终结者智能体正反影响自我意识开放心态 终结者 还记得那场人类与天网之间的史诗般的战斗吗&#xff1f;-- 《终结者》系列电影。 《终结者》系列电影是一部标志性的科幻动作系列&#xff0c;以紧张刺激的情节、令人难忘的角色和开创性的视觉效果而闻名。 电影探讨了…

数学建模资料|历年数维杯数学建模竞赛真题及获奖论文汇总

2024年第九届数维杯大学生数学建模挑战赛&#xff1a;2024年5月10日08:00-5月13日09:00举行&#xff0c;为了更好的帮助参赛同学了解竞赛的赛制及赛题特点&#xff0c;数乐君今天给大家整理了历年数维杯国赛真题及优秀论文&#xff0c;方便同学们赛前巩固训练&#xff0c;掌握解…

独家新闻:CSCWD 2024会议现场即时报道 天津之眼夜色如梦

会议之眼 快讯 备受瞩目的第27届国际计算机协同计算与设计大会&#xff08;CSCWD 2024&#xff09;于2024年5月8日在中国天津梅江中心皇冠假日酒店盛大开幕&#xff01;来自世界各地的专家学者齐聚一堂&#xff0c;共同探讨和分享在智能设计、制造和协同工作领域的最新研究成果…

堆的应用1——堆排序

一&#xff0c;堆排序 堆排序是一种基于比较的排序算法&#xff0c;它利用堆这种数据结构所设计。 堆是一个近似完全二叉树的结构&#xff0c;并同时满足堆积的性质&#xff1a;即子结点的键值或索引总是小于&#xff08;或者大于&#xff09;它的父结点。 堆排序可以分为两…

52. 【Android教程】网页视图:WebView

在前面的章节我们所围绕的全部都是纯客户端开发&#xff0c;我们叫 Native 开发。这样的好处就是体验和性能会非常好&#xff0c;但是在实际的使用中我们会发现存在大量的 H5 页面。这样就可以结合 Native / H5 双端的优势完成一个混合开发&#xff0c;而在这种开发模式中首当其…

[华为OD] B卷 树状结构查询 200

题目&#xff1a; 通常使用多行的节点、父节点表示一棵树&#xff0c;比如 西安 陕西 陕西 中国 江西 中国 中国 亚洲 泰国 亚洲 输入一个节点之后&#xff0c;请打印出来树中他的所有下层节点 输入描述 第一行输入行数&#xff0c;下面是多行数据&#xff0c;每行以空…

Sarcasm detection论文解析 |基于语义知识和辅助信息增强讽刺检测方法

论文地址 论文地址&#xff1a;https://www.sciencedirect.com/science/article/abs/pii/S0306457322000139?via%3Dihub 论文首页 笔记框架 基于语义知识和辅助信息增强讽刺检测方法 &#x1f4c5;出版年份:2022 &#x1f4d6;出版期刊:Information Processing & Managem…

【独家】武汉市中级职称申报基本条件大揭秘,你符合吗?

【独家】武汉市中级职称申报基本条件大揭秘&#xff0c;你符合吗&#xff1f; 2024年申报武汉市的中级职称条件欠缺看看周边地级市的 2024年4月底在武汉人事考试院发布了关于“武汉市若干专业技术职务水平能力测试报名工作的通知”。武汉市建筑类职称水平能力测试要开始了。 武…

Windows平台PyCharm之PySide6开发环境搭建与配置

PySide6 是一个用于创建跨平台 GUI 应用程序的库&#xff0c;它是 Qt for Python 的官方库。Qt 是一个跨平台的 C 应用程序框架&#xff0c;用于开发具有图形用户界面&#xff08;GUI&#xff09;的应用程序。PySide6 允许开发者使用 Python 语言访问 Qt 的功能&#xff0c;从而…

8、基本数据类型转换(自动转换和强制转换)

基本类型转换 1、自动类型转换2、强制类型转换 1、自动类型转换 定义&#xff1a;当Java程序在进行赋值或者运算时&#xff0c;精度小的类型会自动转换成精度大的数据类型&#xff0c;这个就是自动类型转换。&#xff08;自动小转大&#xff09; 背多芬&#xff1a; 这里要明…

探讨关于AutoPSA里CII算法的结构荷载

UKP3D,AutoPDMS导出应力计算文件至管道应力分析软件分析&#xff0c;如下图AutoPSA.用户咨询如图 1.如果计算时考虑水重&#xff0c;把工况中的w改为ww&#xff1b; 2.CAD表格中结构荷载不是单纯的1.5倍&#xff0c;是参照仿GLIF的算法&#xff0c;计算了水重的&#xff08;根…

Abp框架,EF 生成迁移文件时,自动添加表和字段注释内容

在使用 abp 框架&#xff0c;或者ef 的时候都会遇到一个问题&#xff0c;就是建实体后要将实体描述生成到数据库中&#xff0c;就需要手动去添加 [Comment("注释内容")] 注解&#xff0c;这样相当于手动写两次注释&#xff08;即使你是 Ctrl C&#xff09;&#x…