Java对象

面向对象和面向过程的区别

两者的主要区别在于解决问题的方式不同
面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。
面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。
另外,面向对象开发的程序一般更易维护、易复用 易扩展。

创建一个对象用什么运算符?对象实体与对象引用有何不同?

new运算符,new创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)
一个对象引用可以指向0个或1个对象(一根绳子可以不系气球,也可以系一个气球)一个对象可以有n个引用指向它(可以用n条绳子系住一个气球)。

对象的相等和引用相等的区别

对象的相等一般比较的是内存中存放的内容是否相等
引用相等一般比较的是他们指向的内存地址是否相等

类的构造方法的作用是什么

沟造方法是一种特殊的方法,主要作用是完成对象的初始化工作。

如果一个类没有声明构造方法, 该程序能正确执行吗?

如果一个类没有声明构造方法,也可以执行! 因为一个类即使没有声明构造方法也会有默认的不带参数的构造方法。如果我们自己添加了类的构造方法(无论是否有参),ava就不会再添加默认的
无参数的构造方法了,我们一直在不知不觉地使用构造方法,这也是为什么我们在创建对象的时候
后面要加一个括号(因为要调用无参的构造方法)。如果我们重载了有参的构造方法,记得都要把无参的构造方法也写出来(无论是否用到),因为这可以帮助我们在创建对象的时候少踩。

沟造方法有哪些特点? 是否可被override

构造方法特点如下:
名字与类名相同
没有返回值,但不能用void声明构造函数
生成类的对象时自动执行,无需调用
构造方法不能被override (重写),但是可以overload (重载)所以你可以看到一个类中有多个构造函数的情况

面向对象的三大特征

封装

封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的为部信息。但是可以提供一些可以被外界访问的方法来操作属性。

继承

不同类型的对象,相互之间经常有一定数量的共同点。

接口和抽象类有什么共同点和区别

共同点:
都不能被实例化
都可以包含抽象方法
都可以有默认实现的方法(java8可以用 default 关键字在接口中定义默认方法)
区别:
接口主要用于对类的行为进行约束,你实现了某个接口就具有了对应的行为。抽象类主要用于
代码复用,强调的是所属关系
一个类只能继承一个类, 但是可以实现多个接口
接口中的成员变量只能是 public static final 类型的,不能被修改且必须有初始值,而抽
象类的成员变量默认default, 可在子类中被重新定义,也可被重新赋值。

深接贝和浅贝区别了解吗?什么是引用贝?

关于深贝和浅贝区别,我这里先给结论
浅拷贝:浅贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内
部的属性是引用类型的话,浅贝会直接复制内部对象的引用地址,也就是说贝对象和原对象共用同一个内部对象
深拷贝:深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。

Object类的常见方法有哪些?

Object类是一个特殊的类,是所有类的父类。它主要提供了以下11个方法

== 和equals的区别

对于基本类型和引用类型的作用效果是不同的:
对于基本数据类型来说, 比较的是值。
对于引用数据类型来说, 比较的是对象的内存地址,
因为java只有值传递,所以,对于==来说,不管是比较基本数据类型,还是引用数据类型的变量,其本质比较的都是值,只是引用类型变量存的值是对象的地址
equals) 不能用于判断基本数据类型的变量,只能用来判断两个对象是否相等。 equals()方法存在于bject类中,而object类是所有类的直接或间接父类,因此所有的类都有equalsC)方法。
Object类 equalsC) 方法:

equals) 方法存在两种使用情况:
类没有重写 equas()方法:通过equals()比较该类的两个对象时,等价于通过 == 比较
这两个对象,使用的默认是 object类equals()方法
类重写了 equals()方法: 般我们都重写 equas()方法来比较两个对象中的属性是否柜等;若它们的属性相等,则返回true(即,认为这两个对象相等)
举个例子 (这里只是为了举例。 实际上, 你按照下面这种写法的话,像IDEA这种比较智能的IDEA 都会提示你将 == 换成 equals()。

String 中的 equals 方法是被重写过的,因为 Object 的 equals 方法是比较的对象的内存
地址,而 String 的 equals 方法比较的是对象的值
当创建 String 类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同
的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个 String 对象。
String类equals()方法:

hashCodeO有什么用?

hashcodeC 的作用是获取哈希码(int整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置
hashcode()定义在DK的 Object 类中,这就意味着java中的任何类都包含有
hashcode() 函数。另外需要注意的是:Object的hashcode()方法是本地方法,也就是用C语言或c++实现的,该方法通常用来将对象的内存地址转换为整数之后返回。

散列表存储的是键值对(key-value),它的特点是:能根据键“快速的检索出对应的值”。这其中就利用到了散列码! (可以快速找到所需要的对象)

为什么要有hashCode?

我们以HashSet 如何检查重复为例子来说明为什么要有 hashcode
下面这段内容摘自我的Java启蒙书 《HeadFirst java》:
当你把对象加入 HashSet 时, HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode值作比较,如果没有相符的 hashcode
HashSet 会假设对象没有重复出现。但是如果发现有相同hashcode 值的对象,这时会调用equals) 方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。这样我们就大大减少了
equals 的次数,相应就大大提高了执行速度。
其实, hashcodeC) 和 equals)都是用于比较两个对象是否相等

那为什么JDK还要同时提供这两个方法呢?

这是因为在一些容器(比如 HashMap、 HashSet)中,有了 hashcodeC)之后,判断元素是否在对应容器中的效率会更高 (参考添加元素进HashSet的过程)
我们在前面也提到了添加元素进Hashset的过程,如果HashSet在对比的时候,同样的
hashcode 有多个对象,它会继续使用 equals) 来判断是否真的相同。也就是说 hashcode
帮助我们大大缩小了查找成本。

那为什么不只提供 hashcodeO 方法呢?
这是因为两个对象的hashcode 值相等并不代表两个对象就相等
那为什么两个对象有相同的 hashcode 值,它们也不一定是相等的?
因为 hashcodeC 所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。越糟糕的哈希算法越容易碰撞,但这也与数据值域分布的特性有关 (所请哈希碰撞也就是指的是不同的对象得到柜同的 hashcode)
总结下来就是:
如果两个对象的hashcode 值相等,那这两个对象不一定相等(哈希碰撞)。
如果两个对象的hashcode 相等并且equals()方法也返回 true,我们才认为这两个对象
相等。
如果两个对象的hashcode 值不相等,我们就可以直接认为这两个对象不相等
相信大家看了我前面对 hashcodeO) 和equalsO 的介绍之后, 下面这个问题已经难不倒你们
了。

为什么重写equals() 时必须重写hashCode() 方法?

因为两个相等的对象的 hashcode 值必须是相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashcode 值也要相等,
如果重写 equals) 时没有重写 hashcode() 方法的话就可能会导致 equals 方法判断是相等的两个对象, hashcode 值却不相等
思考:重写 equals) 时没有重写 hashcode) 方法的话,使用 HashMap 可能会出现什么问
题。
总结:
equals 方法判断两个对象是相等的,那这两个对象的 hashcode 值也要相等
两个对象有相同的 hashcode 值,他们也不一定是相等的(哈希碰撞)

String

String、 StringBuffer、StringBuilder的区别?
可变性
String 是不可变的
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在
AbstractStringBuilder 中也是使用字符数组保存字符串,不过没有使用final和
private 关键字修饰,最关键的是这个 AbstractstringBuilder 类还提供了很多修改字符串的方法比如 append 方法。
线程安全性
String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractstringBuilder是StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如
expandcapacity、 append、insert、indexOf 等公共方法。 StringBuffer对方法加了司步锁或者对调用的方法加了同步锁,所以是线程安全的。 StringBuilder并没有对方法进行加同步锁,所以是非线程安全的。
性能
每次对String 类型进行改变的时候,都会生成一个新的 String对象,然后将指针指向新的String对象。 StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用StringBuilder 相比使用 StringBuffer仅能获得10%~15%左右的性能提升,但却要冒多线程不安全的风险。
对于三者使用的总结:
1操作少量的数据:适用String
2单线程操作字符串缓冲区下操作大量数据:适用 StringBuilder
3多线程操作字符串缓冲区下操作大量数据:适用 StringBuffer

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

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

相关文章

优雅谈大模型:揭开计算机视觉任务神秘面纱

人工智能在第四次工业革命发挥着至关重要的作用,它广泛的融入日常生活,例如Google助手、Siri、智能手机摄像头、社交媒体过滤器、自动标记、医疗成像、导航等,所有这些技术都切实的改进和增强日常活动的便利性和习惯。 大模型技术发展到现在…

【致知功夫 各随分限】成长需要时间,助人须考虑对方的承受程度

帮助他人需考虑各人的分限所能及的,初学圣学需时间沉淀,存养心性 任何人都应该受到教育,不应受到贫富、贵贱的差异而排除在教育之外,对于不同材质的学生,需要因材施教; 每天都有新的认知,大我…

蓄势高飞逐“新”空,卓翼飞思助力打造低空经济产业领域人才智库

2024年,“低空经济”首次写入政府工作报告,掀开新兴产业的崭新一页,而后迅速在全国各地呈现如火如荼的发展态势。这片蕴藏着巨大潜力和产业的蓝海,正蓄势聚能、乘势而起,站在发展的新风口上,面对新前景和新…

【文献解析】Voxelmap——一种自适应体素地图

Efficient and Probabilistic Adaptive Voxel Mapping for Accurate Online LiDAR Odometry 论文地址:https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber9813516 代码:GitHub - hku-mars/VoxelMap: [RA-L 2022] An efficient and probabili…

2024年7月6日 (周六) 叶子游戏新闻

自动电脑内部录音器AutoAudioRecorder: 是一款免费的自动音频录制软件,可直接将电脑内部所有的声音录制成 mp3/wav 文件,包括音乐、游戏直播、网络会议、聊天通话等音频源。 卸载工具 HiBitUninstaller: Windows上的软件卸载工具 《不羁联盟》制作人&…

Java中的日期时间类详解(Date、DateFormat、Calendar)

1. Date类 1.1 概述 java.util.Date类表示特定的瞬间,精确到毫秒。Date类的构造函数可以把毫秒值转成日期对象。 继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数 1.2 Date类构造…

【踩坑】探究PyTorch中创建稀疏矩阵的内存占用过大的问题

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 目录 问题复现 原因分析 解决方案 碎碎念 问题复现 创建一个COO格式的稀疏矩阵,根据计算公式,他应该只占用约5120MB的内存&…

54、一维和二维自组织映射(matlab)

1、一维和二维自组织映射原理 一维和二维自组织映射(Self-Organizing Maps, SOM)是一种无监督的机器学习算法,通过学习输入数据的拓扑结构,将高维输入数据映射到低维的网格结构中,使得相似的输入数据点在映射空间中也…

win7系统快速安装python

下载安装包 建议选择python3.8左右的,我下载的是3.7.8,最新版本的pythonwin7可能不支持 python网址 下拉寻找 安装python 1.双击安装包 更换完地址选择安装(install) 安装完成后点击close即可 测试是否安装成功 1.winr快捷键打开黑窗口输入cmd …

七大排序-冒泡排序,插入排序,希尔排序(一)

目录 排序冒泡排序插入排序冒泡排序和插入排序的对比希尔排序 排序 先写单趟,再写多趟,这样比较好写 排序可以理解为对商品价格的排序,对数字大小的排序,排序再生活中随处可见 冒泡排序 冒泡排序就是两个相邻的数交换&#xff…

跨界客户服务:拓展服务边界,创造更多价值

在当今这个日新月异的商业时代,跨界合作已不再是新鲜词汇,它如同一股强劲的东风,吹散了行业间的壁垒,为企业服务创新开辟了前所未有的广阔天地。特别是在客户服务领域,跨界合作正以前所未有的深度和广度,拓…

mysql 9 新特新

mysql9新特性 新特性Audit Log NotesC API NotesCharacter Set SupportCompilation NotesComponent NotesConfiguration NotesData Dictionary NotesData Type NotesDeprecation and Removal NotesEvent Scheduler NotesJavaScript ProgramsOptimizer NotesPerformance Schema …

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多,也很琐碎,特别是一些位、寄存器以及相关作用等,非常难以记忆。因此复习时将知识点整理在了一起做成思维导图,希望对大家有所帮助。内容不是很多,可能有些没覆盖全&…

Python人形机踊跃跨栏举重投篮高维数动作算法模型

🎯要点 🎯运动功能: 1 m / s 1 m / s 1m/s上台阶、站立平衡、 1 m / s 1 m / s 1m/s行走、坐椅子、 5 m / s 5 m / s 5m/s跑步、 1 m / s 1 m / s 1m/s爬行、穿越森林、取物、穿越迷宫、 1 m / s 1 m / s 1m/s上滑梯、 5 m / s 5 m / s 5m/s…

iOS多target时怎么对InfoPlist进行国际化

由于不同target要显示不同的App名称、不同的权限提示语,国际化InfoPlist文件必须创建名称为InfoPlist.strings的文件,那么多个target时怎么进行国际化呢?步骤如下: 一、首先我们在项目根目录创建不同的文件夹对应多个不同的targe…

自然之美无需雕琢

《自然之美,无需雕琢 ”》在这个颜值至上的时代,但在温馨氛围中,单依纯以一种意想不到的方式,为我们诠释了自然之美的真谛。而医生的回答,如同一股清流耳目一新。“我说医生你看我这张脸,有没有哪里要动的。…

09 docker 安装tomcat 详解

目录 一、安装tomcat 1. tomcat镜像的获取 2. docker创建容器实列 3. 访问测试 404错误 4. 解决方案 5. 使用免修改版容器镜像 5.1. 运行实列的创建 5.2. 出现问题及解决: 6. 验证 OK 一、安装tomcat 1. tomcat镜像的获取 docker search tomcat #docker …

最灵活且易用的C++开源串口通信调试软件

这款C开源串口调试软件,集成了丰富的功能,为用户提供高效、便捷的串口通信调试体验。以下是其核心功能亮点: 基础功能: 数据交互自如:支持串口数据的轻松读取与发送,让数据交换变得简单直接。 灵活配置参…

【后端面试题】【中间件】【NoSQL】MongoDB查询优化3(拆分、嵌入文档,操作系统)

拆分大文档 很常见的一种优化手段,在一些特定的业务场景中,会有一些很大的文档,这些文档有很多字段,而且有一些特定的字段还特别的大。可以考虑拆分这些文档 大文档对MongoDB的性能影响还是很大的,就我个人经验而言&…

【TB作品】基于ATmega48的开机登录程序设计

使用Proteus仿真软件设计一个开机登录程序,单片机选用ATmegga48. 基础要求: 1.程序启动后在LCD1602液晶屏上提示用户通过独立按键输入密码(6位)。 2.密码输入错误则在屏幕上提示密码错误,密码输入正确则在屏幕上提示密 码正确后等待约3秒后进入主界面,在屏幕中央显示HelloWorld…