大厂面试官问我:为什么 Object 有 wait ,为什么不全在 Thread 类上写?【后端八股文十六:Java基础合集】

本文为【Java基础 合集】初版,后续还会进行优化更新,欢迎大家关注交流~

hello hello~ ,这里是绝命Coding------老白~💖💖 ,欢迎大家点赞🥳🥳关注💥💥收藏🌹🌹🌹

💥个人主页绝命Coding-CSDN博客

💥 所属专栏后端技术分享

这里将会不定期更新有关后端、前端的内容,希望大家多多点赞关注收藏💖
更多历史精彩文章(篇幅过多,不一一列出):

(简历相关)

求职经验分享(1):一份合格的简历应该如何写?-CSDN博客(推荐)

求职经验分享(2):简历如何优化以及如何应对面试【后端篇】-CSDN博客

(项目亮点相关)

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(1):Redis篇】-CSDN博客

大厂面试官赞不绝口的后端技术亮点【后端项目亮点合集(2)】-CSDN博客

(八股文)
大厂面试官问我:Redis处理点赞,如果瞬时涌入大量用户点赞(千万级),应当如何进行处理?【后端八股文一:Redis点赞八股文合集】_java中redis如何实现点赞-CSDN博客

大厂面试官问我:布隆过滤器有不能扩容和删除的缺陷,有没有可以替代的数据结构呢?【后端八股文二:布隆过滤器八股文合集】_布隆过滤器不能扩容-CSDN博客

.........

(算法篇)
大厂面试:算法考前必看汇总(全)_大厂面试算法题-CSDN博客

为什么 Object 有 wait ,为什么不全在 Thread 类上写?/ 为什么wait()、notify()、notifyAll()被定义在Object类中而不是在Thread类中?

  1. 对象锁的概念:
    • Java 的并发控制机制是建立在对象锁的概念之上的。每个 Java 对象都有一个相关联的监视器(monitor),用于线程间的同步和通信。
    • 当一个线程需要访问一个对象时,它必须先获取该对象的锁。因此,线程的等待和通知操作都是针对特定对象的,而不是线程本身。
  1. 可重用性:
    • 将这些方法定义在 Object 类中,使得所有的对象都具有这些等待和通知的能力,提高了代码的可重用性。
    • 如果放在 Thread 类中,则每个线程对象才拥有这些能力,使用起来会更加不方便。
  1. 线程状态与对象状态的关系:
    • wait()notify()notifyAll()方法是用于协调线程对共享资源的访问,这种协调是建立在对象状态的基础之上的。
    • 一个线程可能需要等待某个对象进入特定的状态,才能继续执行。因此,这些方法的定义放在 Object 类中更加合适。
  1. 与锁机制的集成:
    • Java 的同步机制是基于对象锁的。当一个线程获取了一个对象的锁时,它就拥有了对该对象进行wait()notify()notifyAll()操作的能力。
    • 将这些方法定义在 Object 类中,可以很好地与 Java 的锁机制相集成。

Condition 类和 Object 类锁方法区别

Condition 类是 Java java.util.concurrent 包中的一个接口,它提供了比 Object 类的 wait()notify()notifyAll() 方法更丰富和灵活的线程同步机制。

  1. 更细粒度的线程同步控制:
    • Condition 接口可以和 Lock 接口配合使用,提供了更细粒度的线程同步控制能力。
    • 一个 Lock 对象可以关联多个 Condition 对象,线程可以针对特定的 Condition 进行等待和唤醒操作。
  1. 更灵活的等待条件:
    • Object 类的 wait() 方法只能针对整个对象的状态进行等待不同, Condition 接口可以让线程等待特定的条件变量。
    • 线程可以使用 await() 方法等待特定的条件,当条件满足时,其他线程可以使用 signal()signalAll() 方法来唤醒等待的线程。
  1. 更丰富的等待和唤醒方式:
    • Condition 接口提供了 await(long time, TimeUnit unit), awaitUntil(Date deadline) 等方法,允许线程在指定的时间内等待或者等待到指定时间。
    • 相比于 Object 类的 notify()notifyAll() 方法, Condition 接口提供了 signal()signalAll() 方法来唤醒等待的线程。

Java的基本数据类型都是从object中继承的是吗?

不是的,Java 的基本数据类型并不是从 Object 类继承的。

泛型

"参数化类型 "

泛型就是将类型参数化,其在编译时候才能确定具体的参数

引出泛型的原因:每次使用都需要强制转换成想要的类型;在编译时编译器不知道类型转换是否正常,运行时候才知道是否安全

泛型只存在于编译阶段,而不存在于运行阶段,class文件中没有泛型这个概念

原理

类型擦除

编译器在生成字节码 时会将泛型类型信息擦除,使得泛型类型在运行时不可见。这是为了保持与旧版Java代码的兼容性。

在编译时,对于泛型类或泛型方法,编译器会将泛型类型参数用实际类型 进行替换

类型擦除的结果是,编译后的字节码中不再包含泛型的类型信息。在运行时,无法获取泛型类型的具体信息,只能看到原始类型。

(类型擦除是编译器在编译过程中把泛型的类型信息删除,只保留原始类型,这样在运行时就无法知道具体的泛型类型了。例如,一个泛型类List<T>,在编译后的字节码中会变成List,无法知道原来是哪种类型。这是为了保证与之前的非泛型代码的兼容性,但也意味着在运行时无法获取泛型的具体类型,只能操作原始类型的对象。)

应用场景

好处

泛型的主要目标是提高java程序的类型安全

泛型的一个附带好处是使用时候直接得到目标类型,消除许多强制类型转换

由于泛型的实现方式,支持泛型不需要JVM或类文件更改

java中所有类都是基于object,那为什么还要使用泛型,有什么好处?/ 说一说java泛型,泛型的数据类型全部换成object行不行

Java中所有类都是基于Object类的,但是使用泛型可以让我们更好地限制容器内元素的类型,提高程序的安全性和可读性。对于一些特殊的应用场景,单纯使用Object类可能无法满足需求。

完全可以使用Object类替代泛型,但这样会带来一些问题:

1)失去编译时类型检查的优势,增加运行时出错的可能性;

2)需要大量的强制类型转换,代码可读性会下降;

3)无法利用泛型带来的语法糖,如更简洁的集合初始化等。

模版和泛型的区别 / java是伪泛型,cpp泛型怎么实现的

  • 模板是C++的一种预处理机制,在编译期展开生成具体的代码;而Java的泛型是伪泛型,在编译后会执行类型擦除,生成普通的字节码。
  • 模板可以实现真正的泛型,没有类型擦除;而Java泛型是通过类型擦除来实现的,会丢失一部分类型信息。

extends和super在泛型使用的区别

  • extends用于上界限定,限定泛型类型必须是指定类型或其子类。
  • super用于下界限定,限定泛型类型必须是指定类型或其父类。

java程序编译之后会有什么?泛型会在字节码文件中存在吗?

  • 编译后的Java字节码文件中,不会保留任何原始的泛型信息。
  • 编译器会执行"类型擦除"操作,将所有泛型类型参数替换为它们的第一个上界(通常是Object)。
  • 为了维持多态性,编译器可能会生成一些桥接方法。
  • 由于泛型信息被擦除,编译器有时需要插入强制类型转换来确保类型安全。
  • 总的来说,Java中的泛型是编译时的语法糖,但在字节码层面是不存在的。

泛型通配符及其之间的区别,类型擦除

  • ?:表示所有类型
  • ? extends E: 表示E的子类型
  • ? super E: 表示E的父类型
  • 类型擦除会导致通配符丢失部分类型信息,需要谨慎使用。

泛型实现机制是什么

泛型的实现机制是基于类型擦除,编译器在编译时会将泛型转换为原始类型(通常是Object),然后进行强制类型转换。这样既能保证泛型的兼容性,又能最大限度地利用现有的面向对象技术。

泛型理解吗,有什么功能,除了限制所放容器的数据类型还有什么功能?

1)限制容器元素类型,提高安全性;

2)消除强制类型转换,提高代码可读性;

3)配合通配符实现灵活的类型参数绑定。除此之外,泛型还可以用于方法、接口、类的定义,提高代码的复用性和灵活性。

泛型在哪些地方不适用

1)基本数据类型,因为基本类型无法作为类型参数;

2)创建泛型数组,数组协变特性与泛型不兼容;

3)异常处理,异常类型无法作为类型参数。

如何分别处理不同的泛型

可以通过类型参数限定(如T extends Number)、通配符(如? extends Number)等方式来处理不同的泛型。

泛型如何被创建,我们怎么去定义这些泛型

泛型的定义方式是在类、接口或方法声明时添加类型参数,如 public class GenericClass<T>{}。

泛型的上下界如何界定,什么时候用什么?

  • 上界限定(extends关键字)用于限制类型参数的范围,确保类型参数是指定类型或其子类。
  • 下界限定(super关键字)用于限制类型参数的范围,确保类型参数是指定类型或其父类。

如果有两个方法,方法签名一样,然后参数是List的不同泛型,那请问他是方法重载吗?

如果两个方法签名完全一致,但参数列表的泛型类型不同,这就是方法重载。

java泛型与泛型擦除以及使用场景、具体注意事项

Java的泛型是伪泛型,在编译后会执行类型擦除,生成普通的字节码。

使用泛型的主要好处是:

1)增强代码的类型安全性,

2)消除强制类型转换,

3)提高代码的可读性。

使用时需要注意类型擦除带来的一些限制,如不能创建泛型数组等。

JAVA的数据类型

分为数据类型和引用类型

(1)基本类型8个

整数 byte/short/int/long

浮点 float/double

字符 char

布尔 boolean

int 为 4字节 (32位),float一样,其他除以2的倍数或乘2的倍数

(2)引用类型

数组,类,接口

两者区别(扩展)

(1)存储位置

C语言与JAVA的区别

(跨平台,操作内存,指针)

C语言 JAVA

(1)C语言编译型,代码在编译时候会被转换成机器码,直接在计算机上运行;Java是一种解释型语言,它的源代码需要经过解释器转为机器码才能运行

(2)C语言可以直接操作内存,JAVA不行

(C语言支持低级别的内存管理和指针操作;JAVA提供了更多面向对象特性,如封装,继承和多态,还支持自动内存管理和安全机制)

(3)C语言不容易跨平台 ,Java跨平台

(4)C语言有指针,Java没有指针

C++与JAVA的区别

(支持面向对象,跨平台,指针,垃圾回收,多重继承)

(与C语言的差不多)

(1)Java是纯粹的面向对象语言,所有的对象都继承自Object C++兼容C,不但支持面向对象也支持面向过程

(2)Java通过虚拟机从而实现跨平台特性 C++依赖于特定的平台

(3)Java没有指针,他的引用可以理解成安全指针 C++具有和C一样的指针

(4)Java支持自动垃圾回收 C++需要手动回收(C++允许直接访问和操作内存)

(5)Java不支持多重继承,只能通过实现多个接口来达到相同目的 C++支持多重继承

解释下什么是面向对象?面向对象和面向过程的区别?

(1)面向对象:

"万物皆对象"

现实任何物体都可以归为一类事物

每一个个体都是一类事物的实例

以对象为中心

以消息为驱动

(2)区别

①编程思路:

函数 对象

(面向过程是以过程为中心,强调的是过程的执行顺序;面向对象是一种以数据为中心,强调的是数据的抽象和封装)

②封装性:

功能 数据和功能

(面向过程没有封装机制,程序代码和数据是混合在一起的;面向对象数据和代码分开存储,并通过对象的方法来访问和修改数据)

③继承和多态

(在面向过程编程中,程序代码以过程的形式来实现特定的功能;每个过程都是一段独立的代码,可以被多个过程调用。面向对象编程则是以对象的形式来实现功能。每个对象都是一个独立的实体,包含了数据和操作数据的方法。对象之间可以通过方法来互相调用)

static的作用

Static的特点

1、static是一个修饰符,用于修饰成员

2、static修饰的成员被所有的对象所共享

3、static优先于对象存在,因为static的成员随着类的加载就已经存在了

4、static修饰的成员多了一种调用方式,即可以直接被类名调用。类名.静态变量

5、static修饰的数据是共享数据,对象中的存储的是特有数据

static修饰的东西,提前加载内存中

/

两个基本的用法:静态变量和静态方法

也就是被static所修饰的变量或者方法都属于类的静态资源,类实例所共享

static也用于静态代码块,多用于初始化操作

static也多用于修饰内部类,此时称之为静态内部类

最后一种用法是静态导包,即 import static 是在JDK 1.5之后引入的新特性,可以用来指定导入某个类中的静态资源,并且不需要使用类名,可以直接使用资源名

静态字段存储在类的方法区 中,它们在类加载时被初始化,并且在整个程序运行期间存在。

后期新的八股文合集文章会继续分享 ,感兴趣的小伙伴可以点个关注~

更多精彩内容以及免费资料请关注公众号:绝命Coding

相关推荐
儿时可乖了6 分钟前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
ruleslol7 分钟前
java基础概念37:正则表达式2-爬虫
java
I_Am_Me_13 分钟前
【JavaEE进阶】 JavaScript
开发语言·javascript·ecmascript
重生之我是数学王子23 分钟前
QT基础 编码问题 定时器 事件 绘图事件 keyPressEvent QT5.12.3环境 C++实现
开发语言·c++·qt
xmh-sxh-131424 分钟前
jdk各个版本介绍
java
Ai 编码助手25 分钟前
使用php和Xunsearch提升音乐网站的歌曲搜索效果
开发语言·php
学习前端的小z29 分钟前
【前端】深入理解 JavaScript 逻辑运算符的优先级与短路求值机制
开发语言·前端·javascript
神仙别闹36 分钟前
基于C#和Sql Server 2008实现的(WinForm)订单生成系统
开发语言·c#
XINGTECODE37 分钟前
海盗王集成网关和商城服务端功能golang版
开发语言·后端·golang
天天扭码43 分钟前
五天SpringCloud计划——DAY2之单体架构和微服务架构的选择和转换原则
java·spring cloud·微服务·架构