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.mzph.cn/web/40575.shtml

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

相关文章

乞丐传武功

题目 你施舍给了路边的乞丐两个馒头,谁料这个乞丐其实是隐士高人。为了回报你的善心,只见他缓缓从怀中掏出了数本武功秘籍,让你从中挑选一本。你珍重地接过这些秘籍,目光扫过每本封面,降龙十八掌、神照经、易筋经、凌…

[FreeRTOS 基础知识] 互斥量 概念

文章目录 基础知识互斥量互斥量与信号量区别优先级反转优先级继承小结 基础知识 [FreeRTOS 基础知识] 信号量 概念 互斥量 互斥量(Mutex,全称:Mutual Exclusion),在计算机科学中,是一种用于防止多个进程同…

科研绘图系列:R语言实验结果组图(linechart + barplot)

介绍 实验结果的多样性意味着每个结果都可能揭示研究的不同方面或角度。在科学研究和数据分析中,通常我们会收集一系列数据点,每个数据点都对应着实验的一个特定变量或条件。为了全面理解这些数据,我们可能会采用多种可视化技术来展示它们。 将多个结果分别可视化,可以让…

亲子时光里的打脸高手,贾乃亮与甜馨的父爱如山

贾乃亮这波操作,简直是“实力打脸”界的MVP啊! 7月5号,他一甩手,甩出张合照, 瞬间让多少猜测纷飞的小伙伴直呼:“脸疼不?”带着咱家小甜心甜馨, 回了哈尔滨老家,这趟亲…

Nginx(http配置、https配置)访问Spring Boot 项目

前文 记录一下在linux服务器下配置nginx中nginx.conf文件代理访问springboot项目 1. spring boot.yml配置 其他mysql,redis,mybatis等之类的配置就不一一列出了 # 自定义配置 为了等下验证读取的配置文件环境 appName: productserver:port: 8083 # 应用服务 WEB 访问端口s…

SQL窗口函数详解

详细说明在sql中窗口函数是什么,为什么需要窗口函数,有普通的聚合函数了那窗口函数的意义在哪,窗口函数的执行逻辑是什么,over中的字句是如何使用和理解的(是不是句句戳到你的痛点,哼哼~&#x…

C语言编译和编译预处理

编译预处理 • 编译是指把高级语言编写的源程序翻译成计算机可识别的二进制程序(目标程序)的过程,它由编译程序完成。 • 编译预处理是指在编译之前所作的处理工作,它由编译预处理程序完成 在对一个源程序进行编译时,…

全国青少年软件编程等级考试-四级-奇偶之和(真题)

题目:奇偶之和 1.准备工作 (1)保留舞台中的小猫角色; 2.功能实现 (1)分别计算1~100中,奇数之和,偶数之和; (2)说出奇数之和,偶数之和。 讲解: 1、如何判断奇偶数 奇数是指除以2有…

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组,而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

在x86/amd64的机器上使用Docker运行arm64v8/ubuntu并安装ROS1

一、准备工作 主要是因为国内网络的问题,可能导致镜像拉取失败,解决办法参考:镜像加速 二、安装运行过程 2.1拉取镜像: sudo docker pull arm64v8/ubuntu:20.04这个是ubuntu的拉取指令,其他的也是类似。 2.2 运行…

【DevOps】运维过程中经常遇到的Http错误码问题分析(一)

一、解决HTTP 408错误:上传3M文件时请求超时的问题 在开发Web应用程序时,遇到HTTP 408状态码(请求超时)是常见的问题。特别是在上传大文件时,这种情况更容易发生。本文将探讨在上传一个3M文件时,Web服务器…

LeetCode题练习与总结:排序链表--148

一、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4]示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例 3&am…

封锁-封锁模式(共享锁、排他锁)、封锁协议(两阶段封锁协议)

一、引言 1、封锁技术是目前大多数商用DBMS采用的并发控制技术,封锁技术通过在数据库对象上维护锁来实现并发事务非串行调度的冲突可串行化 2、基于锁的并发控制的基本思想是: 当一个事务对需要访问的数据库对象,例如关系、元组等进行操作…

【嵌入式开发 Linux 常用命令系列 1.6 -- grep 过滤指定的目录】

请阅读【嵌入式开发学习必备专栏 】 文章目录 grep 过滤指定目录 grep 过滤指定目录 在Linux中使用grep搜索字符串并希望排除特定目录时,可以使用--exclude-dir参数。这个参数允许你指定一个或多个目录名称来排除它们的内容不被grep搜索。这对于忽略一些常见的临时…

LLM - 词向量 Word2vec

1. 词向量是一个词的低维表示,词向量可以反应语言的一些规律,词意相近的词向量之间近乎于平行。 2. 词向量的实现: (1)首先使用滑动窗口来构造数据,一个滑动窗口是指在一段文本中连续出现的几个单词&#x…

llamaindex实战-使用本地大模型和数据库对话

概述 本文使用NLSQLTableQueryEngine 查询引擎来构建SQL的自然语言处理查询。 请注意,我们需要指定要与该查询引擎一起使用的表。如果我们不这样做,查询引擎将提取所有架构上下文,这可能会溢出 LLM 的上下文窗口。 在以下情况都可以使用NL…

如何用Java写一个整理Java方法调用关系网络的程序

大家好,我是猿码叔叔,一位 Java 语言工作者,也是一位算法学习刚入门的小学生。很久没有为大家带来干货了。 最近遇到了一个问题,大致是这样的:如果给你一个 java 方法,如何找到有哪些菜单在使用。我的第一想…

线程中如何有效避免死锁问题

1. 理解死锁形成的原因 互斥条件:一个资源每次只能被一个线程使用。 请求与保持条件:线程因请求资源而阻塞时,对已获得的资源保持不放。 不剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。 循环…

c++ primer plus 第15章友,异常和其他:15.1.3 其他友元关系

c primer plus 第15章友,异常和其他:15.1.3 其他友元关系 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 15.1.3 其他友元关系 提示:写完文章后,目录可以自动生成,如何生成可…

整洁架构SOLID-单一职责原则(SRP)

文章目录 定义案例分析重复的假象代码合并解决方案 小结 定义 SRP是SOLID五大设计原则中最容易被误解的一个。也许是名字的原因,很多程序员根据SRP这个名字想当然地认为这个原则就是指:每个模块都应该只做一件事。 在历史上,我们曾经这样描…