校招:饿了么一面八股

文章目录

    • 1.new String(“abc”)存在哪里
    • 2.序列化和反序列化
    • 3.数据结构中堆和栈的区别
    • 4面向对象编程三大特征,分别说明
    • 5.子类继承类的方法,使用super调用父类的方法,输出的顺序
    • 6.多台
    • 7Mysql的存储引擎有什么
    • 8mysql中有哪些锁
    • 9myql常用的几种连接
    • 10Join和leftjoin什么区别
    • 11.Jvm的内存模型
    • 12线程死锁什么情况下造成

1.new String(“abc”)存在哪里

需要了解堆内存和字符串常量池。
使用new关键字的对象会存储到堆内存中,因此new string(“abc")也会在堆内存中新建一个字符串对象。

字符串常量池:
如果字符串常量池中已经存在相同值的字符串,则新创建的字符串对象可能会被重用,而不是在堆内存中创建新对象。这意味着,new String(“abc”) 的结果可能是在堆内存中创建一个新的对象,也可能是返回字符串常量池中现有的对象的引用。

2.序列化和反序列化

序列化和反序列化是计算机科学中常用的概念,用于在不同程序之间或在程序的不同执行阶段之间转换数据的格式。

序列化(Serialization):将数据结构或对象转换为可存储或传输的格式,通常是字节流或文本格式,以便在不同的系统之间传输或保存到持久存储器中。序列化的过程包括将数据转换为一种通用的格式,通常是二进制或文本。

反序列化(Deserialization):与序列化相反,反序列化是将序列化的数据重新转换回其原始的数据结构或对象的过程。这个过程涉及将序列化的数据重新解析为内存中的数据结构或对象。

序列化和反序列化通常用于分布式系统中,例如在不同的计算机或进程之间传输数据,或者在网络上发送数据时。常见的序列化格式包括JSON(JavaScript Object Notation)、XML(eXtensible Markup Language)、Protocol Buffers等。序列化和反序列化的正确实现是确保数据正确传输和存储的重要环节。

实现序列化需要类实现Serializbale接口才能被序列化。

3.数据结构中堆和栈的区别

堆和栈是两种常见的数据结构,它们在内存中分配和管理数据的方式有所不同。

栈(Stack):

栈是一种具有后进先出(LIFO)特性的数据结构,即最后进入栈的元素最先被访问或移除。
栈的操作通常包括压栈(push)和弹栈(pop)。压栈将元素添加到栈顶,弹栈则将栈顶元素移除。
栈的内存管理是自动的,由编译器或解释器负责。在函数调用时,局部变量和函数参数通常存储在栈上。当函数执行完毕时,这些数据将自动被销毁。
堆(Heap):

堆是一种动态分配内存的区域,用于存储程序运行时动态创建的数据。
堆的内存分配和释放不由编译器或解释器自动管理,而是由程序员显式地请求和释放内存。在大多数编程语言中,通过new和delete(或malloc和free)等关键字来进行堆内存的分配和释放。
堆的数据访问没有固定的顺序,程序可以动态地在堆上分配和释放内存,但这可能会导致内存泄漏或内存碎片问题。
主要区别:

栈的内存分配是静态的和自动的,而堆的内存分配是动态的和手动的。
栈通常用于存储局部变量和函数调用的上下文,而堆用于存储动态分配的数据结构,如对象或数组。
栈的内存管理由编译器或解释器自动处理,而堆的内存管理需要程序员手动控制。

4面向对象编程三大特征,分别说明

面向对象编程(Object-Oriented Programming,OOP)具有三大特征,它们是封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)。

封装(Encapsulation):

封装是将数据(属性)和操作(方法)封装在一个单元中,限制外部访问对对象内部数据的直接操作。
通过封装,对象对外部提供了一个统一的接口,隐藏了内部的实现细节,使得对象的使用者只能通过对象的公共接口来访问和操作对象。
封装提高了代码的安全性和可维护性,降低了代码的耦合度,使得对象的内部结构可以自由地修改而不影响外部代码的使用。
继承(Inheritance):

继承是一种代码复用的机制,允许一个类(子类)继承另一个类(父类)的属性和方法,并且可以扩展或修改父类的行为。
通过继承,子类可以重用父类的代码,减少了代码的重复性,提高了代码的可重用性和可维护性。
继承还支持类之间的层次关系,可以通过构建类的层次结构来模拟现实世界中的对象之间的分类和关联关系。
多态(Polymorphism):

多态是指同一个操作可以在不同的对象上产生不同的行为。它允许在编译时不确定具体对象类型的情况下调用相同的方法,而由运行时的对象类型决定实际执行的方法。
多态可以通过方法重写(Override)和方法重载(Overload)来实现。方法重写指子类重写了父类的方法,而方法重载指在同一个类中定义了多个同名但参数列表不同的方法。
多态提高了代码的灵活性和扩展性,使得程序可以更容易地适应变化和扩展,同时也提高了代码的可读性和可维护性。
这三大特征是面向对象编程的核心概念,通过它们可以实现代码的封装、复用、扩展和灵活性,使得程序具有更好的可维护性和可扩展性。

5.子类继承类的方法,使用super调用父类的方法,输出的顺序

当子类继承了父类的方法,并使用 super 关键字调用父类方法时,输出的顺序通常是先执行父类的方法,然后再执行子类的方法。这是因为 super 关键字用于显式地调用父类的方法,因此在执行子类的方法之前,会先执行父类的方法。

例如,假设有如下的父类 Parent 和子类 Child:

java
class Parent {
void display() {
System.out.println(“Parent’s display method”);
}
}

class Child extends Parent {
void display() {
super.display();
System.out.println(“Child’s display method”);
}
}
当创建 Child 类的实例并调用 display 方法时:

java
public class Main {
public static void main(String[] args) {
Child child = new Child();
child.display();
}
}
输出的顺序将会是:

Parent’s display method
Child’s display method
首先会执行父类 Parent 中的 display 方法,然后再执行子类 Child 中的 display 方法。

6.多台

多态是面向对象编程的重要特征之一,具体体现在以下几个方面:

方法重写(Override):

子类可以重写父类的方法,当子类对象调用这个方法时,实际执行的是子类中重写的方法,而不是父类中的方法。
这种情况下,同样的方法调用可以产生不同的行为,具体执行哪个方法由对象的实际类型决定,即多态的一种体现。
动态绑定(Dynamic Binding):

在多态的情况下,方法调用的绑定是在运行时而不是在编译时确定的。编译时会根据引用变量的类型来决定可用的方法,但具体执行哪个方法是在运行时确定的。
这使得程序能够适应对象的实际类型,实现了灵活性和扩展性。
接口和抽象类的使用:

接口和抽象类可以通过多态实现不同类的对象具有相同的行为。
当一个类实现了某个接口或者继承了某个抽象类时,可以将其对象存储在接口或者抽象类的引用变量中,从而实现统一的操作和行为。
向上转型(Upcasting):

向上转型是指将子类对象赋值给父类引用变量的过程。这样做可以隐藏对象的实际类型,但依然可以通过父类引用变量来访问子类对象的方法。
当使用父类引用变量调用被子类重写的方法时,实际执行的是子类中的方法,这也是多态的一种体现。
总的来说,多态使得程序能够以统一的方式处理不同类型的对象,提高了代码的灵活性、可扩展性和可维护性,是面向对象编程中非常重要的特征之一。

7Mysql的存储引擎有什么

MySQL拥有多种存储引擎,每种引擎都有其特点、优势和适用场景。以下是一些常见的 MySQL 存储引擎:

InnoDB:

InnoDB 是 MySQL 的默认存储引擎,它支持事务和行级锁定,提供了高度的并发性和事务的 ACID(原子性、一致性、隔离性、持久性)特性。
InnoDB 适用于大多数应用场景,特别是需要强调事务处理和数据完整性的应用。
MyISAM:

MyISAM 不支持事务,但具有较高的性能和较低的资源消耗。它适用于读密集的应用,如数据仓库和日志处理系统。
MyISAM 适用于静态或者少量更新的数据,不适合高并发和需要事务支持的应用。
MEMORY(或 HEAP):

MEMORY 存储引擎将数据存储在内存中,因此访问速度非常快,适用于对读写速度要求非常高的临时表或者缓存数据。
由于数据存储在内存中,数据库重启或者服务关闭时,数据会丢失。
CSV:

CSV 存储引擎以 CSV(逗号分隔值)格式存储数据,适用于导入和导出数据。
它不支持索引和事务,因此在需要索引或者事务支持的场景下使用有限。

8mysql中有哪些锁

MySQL中常见的锁包括以下几种:

行级锁(Row-level Locks):

行级锁是针对数据表中的行进行加锁的机制。它允许多个事务同时访问同一张表,但对于同一行的并发访问会进行锁定,以确保数据的一致性和完整性。
InnoDB 存储引擎默认使用行级锁。

表级锁(Table-level Locks):

表级锁是针对整个数据表进行加锁的机制。当一个事务对表进行操作时,会对整个表进行锁定,其他事务无法同时对该表进行写操作,但允许其他事务进行读操作。
MyISAM 存储引擎通常使用表级锁。

页级锁(Page-level Locks):

页级锁是针对数据表的页面(一页通常包含多行数据)进行加锁的机制。当事务对数据表的某一页进行操作时,会对该页进行锁定,其他事务无法同时对该页进行操作。
InnoDB 存储引擎在某些情况下会使用页级锁。

意向锁(Intention Locks):

意向锁是为了在表级别上提供额外的并发控制而设置的锁。它包括意向共享锁(IS)和意向排他锁(IX),用于指示一个事务打算在表级别上设置共享锁或排他锁。
意向锁不会阻止其他事务对数据行进
行操作,而是用于协调不同事务之间的锁定操作。
记录锁(Record Locks):

记录锁是针对数据表中的记录(行)进行加锁的机制。当一个事务对某行进行操作时,会对该行进行锁定,阻止其他事务对同一行进行写操作。
InnoDB 存储引擎使用记录锁来实现行级锁。

间隙锁(Gap Locks):

间隙锁是 InnoDB 存储引擎在行级锁的基础上引入的一种锁机制,用于锁定一个范围的键值之间的“间隙”,防止其他事务在该范围内插入新的键值。
间隙锁可以有效地避免幻读(Phantom Read)问题。
这些锁机制可以根据不同的场景和需求进行组合使用,以实现对数据的并发访问控制和事务管理。

9myql常用的几种连接

内连接(Inner Join):

内连接根据两个表之间的匹配条件,返回两个表中满足条件的行。如果两个表中的行在连接条件上没有匹配,则不会被包含在结果集中。
内连接使用 INNER JOIN 或者简写形式 JOIN 关键字来实现。
左连接(Left Join):

左连接返回左表中的所有行,以及右表中满足连接条件的行。如果右表中没有匹配的行,则在结果集中显示为 NULL 值。
左连接使用 LEFT JOIN 关键字来实现。
右连接(Right Join):

右连接返回右表中的所有行,以及左表中满足连接条件的行。如果左表中没有匹配的行,则在结果集中显示为 NULL 值。
右连接使用 RIGHT JOIN 关键字来实现。
全连接(Full Join):

全连接返回左表和右表中的所有行,如果某个表中的行在另一个表中没有匹配的行,则在结果集中显示为 NULL 值。
MySQL 并不直接支持全连接,但可以通过左连接和右连接的组合来模拟全连接。
交叉连接(Cross Join):

交叉连接返回两个表的笛卡尔积,即左表中的每一行与右表中的每一行组合在一起。
交叉连接使用 CROSS JOIN 关键字来实现。

10Join和leftjoin什么区别

在MySQL中,.Join 和 LEFT JOIN 是查询中常用的连接方式,它们之间的区别在于:

内连接(Inner Join):

内连接是通过比较两个表之间的连接条件,返回两个表中满足条件的行。
如果某行在一个表中没有与之匹配的行在另一个表中,则不会包含在结果集中。
左连接(Left Join):

左连接是从左表中选择所有行,并且对于右表中满足连接条件的行进行匹配。
如果右表中没有匹配的行,则在结果集中显示为 NULL 值。
举例来说,假设有两个表 A 和 B,其中表 A 包含列 a1、a2,表 B 包含列 b1、b2,连接条件是 A.a1 = B.b1:

如果使用内连接(Inner Join),只会返回表 A 和表 B 中满足连接条件的行。
如果使用左连接(Left Join),则会返回表 A 中的所有行,以及表 B 中与表 A 匹配的行,如果表 B 中没有匹配的行,则在结果中以 NULL 值显示。
总的来说,左连接会包含左表中的所有行,而内连接只返回符合连接条件的行。

11.Jvm的内存模型

Java虚拟机(JVM)的内存模型定义了Java应用程序在运行时所使用的内存结构,包括了堆(Heap)、方法区(Method Area)、栈(Stack)、程序计数器(Program Counter Register)和本地方法栈(Native Method Stack)等组件。

堆(Heap):

堆是Java虚拟机管理的最大的一块内存区域,用于存储对象实例和数组。
堆被所有线程共享,用于存放创建的对象实例。垃圾回收器负责在堆中进行对象的回收和内存的释放。
堆可以分为新生代(Young Generation)、老年代(Old Generation)和永久代(或元空间,PermGen)等部分,不同的对象会根据其生命周期被分配到不同的区域。
方法区(Method Area):

方法区用于存储类的结构信息、静态变量、常量以及编译器编译后的代码等数据。
方法区是所有线程共享的内存区域,它的大小在启动时就已经确定,并且可以通过设置 -XX:MaxMetaspaceSize 参数来调整。
栈(Stack):

栈用于存储每个线程的方法调用和局部变量,每个方法在执行时都会创建一个栈帧(Stack Frame)。
每个线程都有自己的栈,栈的大小在线程创建时就已经确定,包括了方法调用栈、本地方法栈和虚拟机栈。
程序计数器(Program Counter Register):

程序计数器是当前线程所执行的字节码的行号指示器,用于记录线程执行的位置和下一条要执行的指令。
程序计数器是线程私有的,每个线程都有自己的程序计数器。
本地方法栈(Native Method Stack):

本地方法栈用于执行本地方法(Native Method)的线程栈,与Java方法栈类似,但它是为Java调用本地方法服务的。
Java虚拟机的内存模型对于Java程序的运行具有重要的影响,合理地管理和优化内存使用可以提高程序的性能和稳定性。

12线程死锁什么情况下造成

线程死锁通常在多个线程同时持有资源并试图获取其他线程持有的资源时发生。造成线程死锁的常见情况包括以下几种:

互斥资源的竞争:多个线程同时持有了一些共享资源,并且每个线程都在等待其他线程释放它们所持有的资源。如果线程无法获得其他线程持有的资源,就会发生死锁。

循环等待:多个线程形成一个循环等待资源的环路。例如,线程A等待线程B持有的资源,线程B等待线程C持有的资源,而线程C又等待线程A持有的资源。这样的循环等待会导致所有线程都无法继续执行,从而发生死锁。

资源不可剥夺:线程持有的资源在未使用完之前不会被其他线程抢占或释放,从而导致其他线程无法获得这些资源,进而发生死锁。

资源竞争顺序不当:多个线程同时竞争多个资源,但是它们获取资源的顺序不同,导致每个线程都在等待其他线程释放自己需要的资源,从而形成死锁。

当系统中存在以上情况时,就可能触发线程死锁。因此,在编写多线程程序时,需要注意避免以上情况的发生,可以采用合理的资源分配和管理策略,以及避免循环等待等方法来预防死锁的发生。

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

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

相关文章

你会怎样爱别人

传统经济学中的纯粹利己模型假定人们试图最大化的效用函数不受其他人效用的影响,其他人的行为都是外生的,不用考虑,因此,是一种极为简化的模型,可以便于建模和运用,其功能与完全竞争模型有点像。 与传统经济…

消息队列面试题

目录 1. 为什么使用消息队列 2. 消息队列的缺点 3. 消息队列如何选型? 4. 如何保证消息队列是高可用的 5. 如何保证消息不被重复消费(见第二条) 6. 如何保证消息的可靠性传输? 7. 如何保证消息的顺序性(即消息幂…

总说上下文切换耗性能,那他到底耗了多少性能?

大家好,我是「云舒编程」,今天我们来聊聊上下文切换性能消耗。 文章首发于微信公众号:云舒编程 关注公众号获取: 1、大厂项目分享 2、各种技术原理分享 3、部门内推 一、前言 众所周知,操作系统是一个分时复用系统&…

.NET高级面试指南专题十九【 数据库设计-4范式】

数据库范式设计是关系数据库设计中的重要概念,旨在减少数据冗余和提高数据的一致性。 范式设计的目的是提高数据库的数据质量、一致性和可维护性。通过将数据结构化为不同的范式,可以降低数据冗余,减少数据更新异常,提高数据的可靠…

Java八股文(MyBatis Plus)

Java八股文のMyBatis Plus MyBatis Plus MyBatis Plus MyBatis Plus 是什么?它与 MyBatis 有什么区别? MyBatis Plus 是基于 MyBatis 进行扩展的一款持久层框架,它提供了一系列增强功能,简化了 MyBatis 的使用。 与 MyBatis 相比…

C++学习基础版(一)

目录 一、C入门 1、C和C的区别 2、解读C程序 3、命名空间 4、输入输出 (1)cout输出流 (2)endl操纵符 (3)cin输入流 二、C表达式和控制语句 1、数据机构 特别:布尔类型bool 2、算数运…

处理Centos 7 中buff/cache高的问题

在CentOS 7中,如果发现 buff/cache 栏目的值过高占用了大量内存,可以尝试以下方法来释放部分缓存: 清理页面缓存 Linux内核会缓存最近使用过的内存页面,以提高访问速度。你可以使用以下命令清理页面缓存: sudo sync && sudo echo 1 > /proc/sys/vm/drop_caches …

Leetcode 3082. Find the Sum of the Power of All Subsequences

Leetcode 3082. Find the Sum of the Power of All Subsequences 1. 解题思路2. 代码实现 题目链接:3082. Find the Sum of the Power of All Subsequences 1. 解题思路 这一题的话其实反而还好,就是一个比较常规的动态规划的题目。 我们首先需要想明…

数据结构的基本框架以及泛型

目录 集合框架复杂度大O的渐进表示法 装包(箱)或者拆包(箱)装包拆包 泛型泛型的上界泛型方法求最大值 集合框架 Java的集合框架,Java Collection Framework 又被称为容器container, 定义在java.util包下的一组 interfaces 和其实现类 classes interface: 接口 abstracb class…

【LeetCode热题100】24. 两两交换链表中的节点(链表)

一.题目要求 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。 二.题目难度 中等 三.输入样例 示例 1: 输入&am…

Docker 哲学 - 容器操作 (二)

命令行启动 参数键值之间可以使 " " 或者 空格 卷的挂载是在容器创建时指定的,不能在容器运行时再添加 当加上 --network-alias 设置同一网络下别名参数后 ,inspect 该容器发现 会同步到 容器信息中 2、给容器打日志 docker logs 【-…

深度学习_ResNet_5

ResNet学习目标 什么是ResNet为什么要引入ResNet?ResNet网络结构的特点利用ResNet完成图像分类 什么是ResNet? ResNet(Residual Network)是一种深度残差网络,由何凯明等人在2015年提出,是深度学习领域中一…

Leetcode 31. 删除无效的括号

心路历程: 一开始看到有点懵,后来发现有点像按照一定规则穷举所有可能情况,想到了排列组合问题,再结合问题长度不固定,无法用已知个for循环表示,从而想到了回溯。这个题相当于需要在一定规则下枚举。 按照…

力扣题目训练(22)

2024年2月15日力扣题目训练 2024年2月15日力扣题目训练563. 二叉树的坡度637. 二叉树的层平均值643. 子数组最大平均数 I304. 二维区域和检索 - 矩阵不可变154. 寻找旋转排序数组中的最小值 II 2024年2月15日力扣题目训练 2024年2月15日第二十二天编程训练,今天主要…

3月17日ACwing每日一题

1230. K倍区间 - AcWing题库 //超时写法 需要优化 //两个1e5嵌套 变成1e10了>1e8需要优化 #include <bits/stdc.h> using namespace std; const int N100007; int a[N]; int main(){int n,k;cin>>n>>k;for(int i1;i<n;i){cin>>a[i];a[i]a[i-1]…

web ui自动化测试--元素操作

一、介绍 什么是web ui自动化测试 1、通过代码来模拟人的手工操作,执行测试内容 2、自动化是为了代替重复的手工操作,提高测试效率 ui自动化的价值: 1、回归速度的对比,以前进行全量回归测试需要x天,现在有没有减少 2、负责功能测试的同事,是不是有更多的时间测试新需求…

Java面试题总结15之简述你对RPC,RMI的理解

RPC&#xff1a;在本地调用远程的函数&#xff0c;远程过程调用&#xff0c;可以跨语言实现&#xff0c;httpClient RMI&#xff1a;远程方法调用&#xff0c;Java中用于实现RPC的一种机制&#xff0c;RPC的Java版本是J2EE的网络调用机制&#xff0c;跨JVM调用对象的方法&…

Redis-2 Redis基础数据类型与基本使用

高级Redis应用进阶 一站式Redis解决方案-Redis-2 Redis基础数据类型与基本使用 源代码在GitHub - 629y/food-social-contact-parent: redis项目-美食社交APP 1. Redis基本数据类型 1.字符串&#xff08;strings&#xff09; set username zhangsan get username mset age 18 …

JAVA代理模式梳理

什么是代理模式 代理模式&#xff1a;为其他对象提供一种代理&#xff0c;用以控制对这个对象的访问&#xff1b; 我们使用代理对象&#xff0c;可以在不修改目标对象的基础上&#xff0c;增强主业务逻辑&#xff1b;比如说我们的系统中有一个登录接口&#xff0c;我们要对这个…

在数据对象中增加新的属性值,数据更新,视图不更新问题

一、原始数据 dataTable:[{aa:111} ]然后我需要再给他一个对象属性值&#xff0c;就会发现打印出来的数据是更新了&#xff0c;视图不更新&#xff0c;原因是在于在Vue实例创建时&#xff0c; dataTable.bb 并未声明&#xff0c;因此就没有被Vue转换为响应式的属性. this.dat…