Java八股-3

news2024/12/23 18:25:18

面向对象基础

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

面向过程把解决问题的过程拆解成一个个方法,通过一个个方法的执行来解决问题。

面向对象会先抽象出对象,再用对象执行方法的方式来解决问题。

面向对象开发的程序一般更易维护、易复用、易扩展。

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

new运算符,对象实例存在于堆内存中,对象引用指向对象实例,对象引用存放在栈内存中。

一个对象引用可以指向0或1个对象(一个绳系一个气球

一个对象可以有n个引用指向它(一个气球可以有多个绳系着

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

对象的相等一般是比较内存中存放的内容是否相等

引用的相等一般比较的是他们指向的内存地址是否相等

==比较的是引用是否相等(内存地址

equals()比较的是内容是否相等

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

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

如果一个类没有声明构造方法也可以正常执行,因为java会提供默认的无参构造方法。如果我们自己添加了类的构造方法(无论是否有参),java就不会提供默认构造方法。

如果我们重载了有参构造方法,一定要把无参构造方法写出来,不然会编译出错。

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

名字与类名相同

没有返回值,但是不能用void声明构造方法

生成类的对象时,自动执行,不用调用

不能被重写(override),但是可以被重载overload)

面向对象三大特征?

封装

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

继承

是使用已存在的类的定义作为基础建立新的类,新的类可以增加新的属性或者新的功能,也可以用父类的功能,但是不能选择性的继承父类。

通过继承,可以快速创建新的类,提高代码的重用,程序的可维护性,节省创建新类的时间,提高开发效率。

关于继承:

子类拥有父类的所有属性和方法(包括私有属性、方法),但是父类的私有属性、方法子类不能访问,只是拥有。

子类可以拥有自己的属性、方法,即子类可以对父类进行扩展。

子类可以用自己的方式实现父类的方法。

多态

就是指一个对象具有多种状态,具体表现为父类的引用指向子类的对象。

特点:

对象类型和引用类型之间具有继承(类)关系/实现(接口)关系

引用类型变量发出的方法调用的到底是哪个类中的方法,必须在程序运行期间才能确定

多态不能调用只在子类存在但在父类不存在的方法

如果子类重写了父类的方法,真正执行的是子类覆盖的方法,如果没有覆盖父类方法,执行的是父类的方法

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

共同点:

都不能被实例化

都可以包含抽象方法

都可以有默认实现的方法

区别:

接口主要是对类的行为进行约束,你实现了某个接口就具有了对应的行为

抽象类主要用于代码复用,强调的是所属关系

一个类只能继承一个类,但可以实现多个接口

接口中的成员变量必须是public static final类型的,不能被修改且必须有初始值

抽象类的成员变量默认是default,可以在子类中被重新定义,也可以重新赋值

深拷贝和浅拷贝了解吗?什么是引用拷贝?

2f13c9043b16403281bf085eff00956a.png

浅拷贝:会在堆上创建一个新的对象,不过如果原来对象的内部属性是引用类型的话,浅拷贝会直接复制内部对象的地址,就是说“浅拷贝对象和原对象共用一个内部对象”

深拷贝:会完全复制整个对象,包括原对象所包含的内部对象

引用拷贝:就是两个不同的引用,指向同一个对象

Object

 Object类的常见方法有哪些?

Object类是一个特殊的类,是所有类的父类。

主要提供了以下11个方法:

/**
* native 方法,用于返回当前运行时对象的 Class 对象,使用了 final 关键字修饰,故不允
许子类重写。
*/
public final native Class<?> getClass() /**
* native 方法,用于返回对象的哈希码,主要使用在哈希表中,比如 JDK 中的HashMap。
*/
public native int hashCode() /**
* 用于比较 2 个对象的内存地址是否相等,String 类对该方法进行了重写以用于比较字符串的 值是否相等。
*/
public boolean equals(Object obj) /**
* native 方法,用于创建并返回当前对象的一份拷贝。
*/
protected native Object clone() throws CloneNotSupportedException /**
* 返回类的名字实例的哈希码的 16 进制的字符串。建议 Object 所有的子类都重写这个方法。
*/
public String toString() /**
* native 方法,并且不能重写。唤醒一个在此对象监视器上等待的线程(监视器相当于就是锁的 概念)。如果有多个线程在等待只会任意唤醒一个。
*/
public final native void notify() /**
* native 方法,并且不能重写。跟 notify 一样,唯一的区别就是会唤醒在此对象监视器上等 待的所有线程,而不是一个线程。
*/
public final native void notifyAll() /**

* native方法,并且不能重写。暂停线程的执行。注意:sleep 方法没有释放锁,而 wait 方 法释放了锁 ,timeout 是等待时间。
*/
public final native void wait(long timeout) throws InterruptedException /**
* 多了 nanos 参数,这个参数表示额外时间(以纳秒为单位,范围是 0-999999)。 所以超时 的时间还需要加上 nanos 纳秒。。
*/
public final void wait(long timeout, int nanos) throws InterruptedException /**
* 跟之前的2个wait方法一样,只不过该方法一直等待,没有超时时间这个概念
*/
public final void wait() throws InterruptedException /**
* 实例被垃圾回收器回收的时候触发的操作
*/
protected void finalize() throws Throwable { }

==和equals()的区别?

对于基本数据类型,==比较的是值

对于引用数据类型,==比较的是对象的地址值

(因为java只有值传递,所以不管是基本数据类型还是引用数据类型,==本质比较的都是值,只是引用数据类型变量存的值是对象的地址值)

equals()不能判断基本数据类型的变量,只能判断两个对象是否相等。

equals()方法存在于Object类中,而Object是所有类的直接或者间接父类,所以所有的类都有equals()方法。

存在两种情况:

类没重写equals()方法:等同于==比较两个对象地址是否相同

类重写了equals()方法:比较两个对象的属性是否相同

hashCode()有什么用?

hashCode()用来获取哈希码(int整数),也称为散列码。

哈希码作用是确定该对象在哈希表中的索引位置。

hashCode()定义在Object类中,java中所有类都拥有hashCode()方法,这个方法是用C语言或者C++实现的。

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

为什么要有hashCode()?

因为当我们把对象加入HashSet时,会用到hashCode。首先要计算出对象的hashCode值,来判断对象加入的位置,同时也会拿这个值与已经加入的对象的hashCode值作比较,如果没有相符的hashCode值,就假设对象没有重复出现。但是如果发现有相同的hashCode值的对象,这时就会调用equals()方法来检查这两个hashCode值相等的对象是否真的相同。如果两者相同,hashSet就不会让这个对象加入,如果不同,就会重新散列到其他位置,这样就大大减少了equals的次数,相应的提高了执行速度。

如果hashSet在对比的时候,同样的hashCode有多个对象,它会继续用equals()来判断是否真的相同。所以hashCode()缩小了查找成本。

其实equals()和hashCode()都是用于比较两个对象是否相等。

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

这是因为在一些容器中(比如hashMap、hashSet)中,有了hashCode()之后,判断元素是否在容器中的效率会更高。

那为什么不只提供hashCode()方法呢?

因为两个对象的hashCode值相同不代表两个对象就相等。

那为什么两个对象有相同的hashCode值,它们也不一定相等呢?

因为hashCode()所使用的哈希算法也许刚好会让多个对象传回相同的哈希值。

越糟糕的哈希算法越容易碰撞(所谓的哈希碰撞就是指不同的对象得到相同的hashCode值)。

总结:

如果两个对象的hashCode值相等,那这两个对象不一定相等(哈希碰撞)

如果两个对象的hashCode值相等,并且equals()方法也返回true,才认为这两个对象相等

如果两个对象的hashCode值不相等,可以直接认为这两个对象不相等

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

因为两个相等的对象的hashCode值必须是相等的,也就是说如果equals方法判断这个两个对象相等,那么这两个对象的hashCode值也要相等。

如果只重写了equals()方法,可能会导致equals()方法判断是相等的两个对象,它们的hashCode值不同。

思考:重写equals()没重写hashCode(),使用hashMap会出现什么问题?

String

 String、StringBuffer、SyringBuilder的区别?

可变性:

String是不可变的。

StringBuffer和StringBuilder都继承自AbstractStringBuilder类,在AbstractSyringBuilder中也是使用字符数组保存字符串,不过没有使用final和private修饰,AbstractStringBuilder还提供了很多修改字符串的方法,比如append、insert、indexOf、expandCapacity方法。

线程安全性:

String中的对象是不可变的,也就可以理解为常量,线程安全。

StringBuffer对方法加了同步锁,或者对调用的方法加了同步锁,所以线程安全。

StringBuilder没有对方法加同步锁,所以线程不安全。

性能:

每次对String类型进行改变的时候,都会生成一个新的String对象,然后将指针指向新的String对象。
StringBuffer每次会对StringBuffer对象本身进行操作,而不是生成新的对象并改变对象引用。

相同情况下,使用StringBuilder相比使用StringBuffer仅能获得10%-15%左右的性能提升,却要冒多线程不安全的风险。

总结:

操作少量数据:String

单线程操作字符缓冲区下操作大量数据:StribgBuilder

多线程操作字符缓冲区下操作大量数据:StringBuffer

 String为什么是不可变的?

String类中使用final关键字修饰字符数组来保存字符串,并且是私有的,也没有提供修改这个字符串的方法,而且String类被final修饰也不可继承。

Java9为什么要将String的底层实现由char[]改成了byte[]?

节省内存空间。(Latin-1编码方案下,byte占一个字节(8位),char占两个字节(16位)

字符串拼接用“+”还是String Builder?

Java语言本身并不支持运算符重载,“+”“+=”是专门为String类重载过的运算符,也是Java中仅有的两个重载过的运算符。

a6cc18cf9ffa42c09a3b0d953016c119.png

可以看出,字符串对象通过+的字符串拼接方式,实际上是通过StringBuilder调用append()方法实现的,拼接完成之后调用toString()得到一个String对象。 

不过,在循环内用+进行字符串拼接的话,会有个缺陷:编译器不会创建单个StringBuilder然后复用,就会导致创建过多的StringBuilder对象。

如果直接使用StringBuilder对象进行字符串拼接就不会存在这个问题。

99096f8bb5544119bccc7a9e5836733f.png

String的equals()和Object的equals()有什么区别?

String中的equals方法是被重写过的,比较的是String字符串的值是否相等。

Object的equals方法是比较对象的内存地址。

字符串常量池的作用了解吗?

字符串常量池是JVM为了提升性能和减少内存消耗针对字符串(String类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。

String s = new String("abc") 创建了几个字符串对象?

一个或者两个。

如果字符串常量池中不存在字符串对象"abc"的引用,那么会在堆上创建两个字符串对象,其中一个字符串对象的引用会被保存在字符串常量池中。

e11f0c88203d477e897afa6c5ea3d438.png

如果字符串常量池中已经存在字符串对象"abc"的引用,就只会创建一个字符串对象"abc"。

aeb60ce4f477430f95794edd35cb0646.png

String的intern()方法有什么用?

String.intern()是一个native(本地)方法,作用是将指定的字符串对象的引用保存在字符串常量池中。

有两种情况:

如果字符串常量池中保存了对应的字符串对象的引用,就直接返回该引用

如果字符串常量池中没有保存对应的字符串对象的引用,那就在常量池中创建一个指向该字符串对象的引用并返回

String类型的变量和常量做“+”运算时发生了什么?

两种情况:

有final修饰:

2c7fa19f1f554c4c8963d0a12627f976.png

无final修饰: 41932b913ed14deb8b59a081072c1aa1.png

 “+”实际上是通过StringBuilder调用append()方法实现拼接,然后再调用toString()得到新的String对象。

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

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

相关文章

linux内核驱动-在内核代码里添加设备结点

linux中&#xff0c;一切皆文件 我们在用户层用一些系统函数&#xff08;如&#xff1a;fopen等等&#xff09;时&#xff0c;会进入内核&#xff0c;内核会在字符注册了的设备号链表中查找。如果找到就运行我们写的设备文件的&#xff08;驱动&#xff09;函数 我们在前面已经…

1.2.4 采用Java配置类管理Bean

本实战将演示如何使用Java配置类管理Bean&#xff0c;实现基于注解的IoC容器的配置。 创建新包 在net.huawei.spring根包里创建day04子包。 创建杀龙任务类 在day04子包里创建SlayDragonQuest类。在该类上不添加Component注解。 创建勇敢骑士类 在day04子包里创建BraveKnight…

07 Php学习:运算符

PHP 算术运算符 在 PHP 中&#xff0c;算术运算符用于执行基本的数学运算&#xff0c;包括加法、减法、乘法、除法、取余数&#xff0c;负数运算、取反和并置运算。以下是这些运算符的详细解释和示例&#xff1a; 加法运算符 &#xff1a;用于将两个数值相加。 $a 5; $b 3;…

【复现】用友NC-Cloud文件上传漏洞_70

目录 一.概述 二 .漏洞影响 三.漏洞复现 1. 漏洞一&#xff1a; 四.修复建议&#xff1a; 五. 搜索语法&#xff1a; 六.免责声明 一.概述 用友NC Cloud大型企业数字化平台&#xff0c;深度应用新一代数字智能技术&#xff0c;完全基于云原生架构&#xff0c;打造开放、…

【Qt 学习笔记】Qt信号和槽的其他说明及Lambda表达式

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt信号和槽的其他说明及Lambda表达式 文章编号&#xff1a;Qt 学习笔记…

团结引擎+OpenHarmony 2 xlua编译篇

文章目录 前言一、下载 xlua 源码二、OpenHarmony SDK三、开干 前言 提示&#xff1a;我们的 app 鸿蒙化过程 需要用到 xlua ,目前没有适配 OpenHarmony 平台&#xff0c;所以需要重新编译一下。编译有多种方式&#xff0c;但是我只会这一种 就是使用 cmake。 一、下载 xlua 源…

【UE5 C++】访问修饰符public/protected/private继承

限制类与类之间访问级别的方法 public 在类中创建一个public的部分&#xff0c;即" public: "&#xff0c;public之下的所有内容都是公共的,可以在类之间访问 private&#xff08;最常见&#xff09; 如若没有指明修饰符&#xff0c;则默认为private 不能在类的外…

如何保证消息不丢失?——使用rabbitmq的死信队列!

如何保证消息不丢失?——使用rabbitmq的死信队列&#xff01; 1、什么是死信 在 RabbitMQ 中充当主角的就是消息&#xff0c;在不同场景下&#xff0c;消息会有不同地表现。 死信就是消息在特定场景下的一种表现形式&#xff0c;这些场景包括&#xff1a; 消息被拒绝访问&am…

what is tty?

waht is tty? 黑话&#xff1a;TTY 为什么使用Linux的时候CtrlC就会终止一个命令运行,ta是如何设置的? stty -a 桌面切换 CTRL ALT F1 – 锁屏 CTRL ALT F2 – 桌面环境 CTRL ALT F3 – TTY3 CTRL ALT F4 – TTY4 CTRL ALT F5 – TTY5 CTRL ALT F6 – TTY6

《C++程序设计》阅读笔记【7-堆和拷贝构造函数】

&#x1f308;个人主页&#xff1a;godspeed_lucip &#x1f525; 系列专栏&#xff1a;《C程序设计》阅读笔记 本文对应的PDF源文件请关注微信公众号程序员刘同学&#xff0c;回复C程序设计获取下载链接。 1 堆与拷贝构造函数1.1 概述1.2 分配堆对象1.3 拷贝构造函数1.3.1 默…

python画图Matplotlib和Seaborn

python画图Matplotlib和Season 一、Matplotlib1、介绍2、安装3、内容二、Seaborn1、介绍2、安装3、内容一、Matplotlib Matplotlib官网 1、介绍 Matplotlib 是一个 Python 的绘图库,用于创建高质量的二维图表和一些基本的三维图表。它广泛应用于科学计算、数据分析、工程学和…

面试经典算法系列之双指针1 -- 合并两个有序数组

面试经典算法题1 – 合并两个有序数组 LeetCode.88 公众号&#xff1a;阿Q技术站 问题描述 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中&#…

LangChain入门:17.使用 ConversationChain实现对话记忆功能

在默认情况下&#xff0c;无论是 LLM 还是代理都是无状态的&#xff0c;每次模型的调用都是独立于其他交互的。也就是说&#xff0c;我们每次通过 API 开始和大语言模型展开一次新的对话&#xff0c;它都不知道你其实昨天或者前天曾经和它聊过天了。 你肯定会说&#xff0c;不可…

全新智慧公厕解决方案,一键查看附近公厕情况

随着城市化进程的不断加快&#xff0c;人口密集地区的公共厕所需求日益增长&#xff0c;而传统的公厕管理方式已经无法满足人们对卫生、便利的需求。为了提升公共卫生设施的管理水平和服务质量&#xff0c;一家智能科技公司近日推出了全新智慧公厕解决方案&#xff0c;通过手机…

Cohere推出全新升级版RAG大型AI模型:支持中文,搭载1040亿参数,现开源其权重!

4月5日&#xff0c;知名类ChatGPT平台Cohere在其官方网站上发布了一款全新的模型——Command R。 据官方消息&#xff0c;Command R拥有1040亿个参数&#xff0c;并且支持包括英语、中文、法语、德语在内的10种语言。这一模型的显著特点之一在于其对内置的RAG&#xff08;检索增…

【日期】获取当天以及未来三天的日期和周几

// 获取当天以及未来三天的日期和周几getDates() {const today new Date();const dayOfWeek ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];const todayDate today.toDa…

FreeRTOS任务切换学习

FreeRTOS任务切换学习 所谓任务切换&#xff0c;就是CPU寄存器的切换。假设当由任务A切换到任务B时&#xff0c;主要分为两步&#xff1a; 1&#xff1a;需暂停任务A的执行&#xff0c;并将此时任务A的寄存器保存到任务堆栈&#xff0c;这个过程叫做保存现场&#xff1b; 2&am…

Git 安装和配置

下载 Git 网址: https://git-scm.com/download 安装 Git 双击安装包, 开始安装. 修改安装路径, 选择非中文无空格路径: 开始安装: 安装成功: 配置 Git 安装完成后, 在任意文件夹内, 右键, 可以显示两个 Git 选项, 就说明安装成功了.

浅聊java集合框架中的java.util.LinkedList

java集合框架总览 Java集合框架是一个用来代表和操纵集合的统一架构&#xff0c;它为管理和组织对象的集合提供了一组类和接口。这个框架包含三个主要部分&#xff1a;接口、实现和算法。 接口&#xff1a; Collection&#xff1a;这是集合框架的根接口&#xff0c;定义了集…

1.2.3 利用注解配置类取代Spring配置文件

本实战将演示如何使用注解配置类取代Spring配置文件&#xff0c;实现基于注解的IoC容器的配置。 创建新包 在net.huawei.spring根包里创建day03子包。 拷贝类和接口 将day02子包里的类和接口拷贝到day03子包。 创建注解配置类 在day03子包里创建SpringConfig类。在该类上添加…