蔚来Java实习一面总结

此文用于个人面经总结,答案可能存在出入,望理性食用~~

1. 分析时间复杂度的工具

2. 数组和链表的区别

数组:线性表,存储空间连续,可以通过下标直接访问元素,查找时间复杂度为O(1),插入的时间复杂度为O(n),需要预分配一定大小的内存空间,有时会造成空间资源的浪费。

链表:线性表,存储空间不连续,插入时间复杂度为O(1),查找的时间复杂度为O(n),每个节点需要额外的空间来存储指针,也会造成资源的浪费。

3. 数组和链表哪个是线性表

线性表是由相同的数据类型的元素组成的有序序列,这些元素按照一个确定的顺序依次排列,其中元素之间存在唯一的前驱和后继关系。

常见的线性表包括:

数组、链表、栈、队列。

4. sql场景题:

4.1. 现在要创建一张用户订单表,里面有四个字段,分别为主键id、订单id、订单来源和用户id,如果让你设计,每个字段会使用那种数据类型,大小是多少,为什么?

主键ID:INT或BIGINT,如果预定订单的数量不超过21亿(2^31),使用INT,如果预计数量会更多,可以使用BIGINT,因为主键是唯一的,并且需要自增,INT和BIGINT都满足这一点。

订单ID:VARCHAR或CHAR,如果订单ID是固定的,那么可以使用CHAR;如果长度可变,使用VARCHAR。通常订单ID的长度在10~50位之间。

订单来源:VARCHAR,订单来源通常是文本描述,VARCHAR可以根据实际内容动态分配空间,比CHAR更灵活且节省空间。

用户ID:INT或BIGINT,取决于用户表使用那个,因为用户ID通常与用户表的主键相对应,因此数据类型要保持一致。

4.2. 半年后,用户的数量达到一千万量级,现有两个场景:查询订单详情和统计用户下单平台喜好,针对上面建的数据库,有需要修改和优化的地方吗?

  1. 索引优化:
    • 对于查询订单详情,如果经常根据订单ID查询,确保订单ID字段上有索引。
    • 对于统计用户下单平台喜好,如果经常根据用户ID和订单来源进行查询和聚合操作,考虑为这两个字段添加索引,特别是如果它们是查询条件或聚合函数的一部分。
  1. 分区:
    • 考虑对用户订单表进行分区,以提高查询和维护的效率。分区可以基于时间(如按月或年分区)、用户ID范围或订单来源。
  1. 分库分表

4.3. 在社区系统查询信息的场景下,左模糊、右模糊和全模糊查询能否使用索引进行查询?

  1. 左模糊查询(LIKE '%value'):
    • 在MySQL的InnoDB存储引擎中,如果使用了全文索引,则左模糊查询可以利用索引,但是如果使用的是标准的B-tree索引,左模糊查询不能有效利用索引因为索引是按照字符串的开头部分创建的,而左模糊查询需要扫描整个列以找到匹配的行
  1. 右模糊查询(LIKE 'value%'):
    • 右模糊查询可以使用索引,因为大多数数据库的默认索引都是按照列值的升序排列的。这意味着索引已经按照查询模式排列好了,数据库可以快速定位到可能包含匹配项的区域。
  1. 全模糊查询(LIKE '%value%'):
    • 全模糊查询不能利用索引,因为它们需要检查列中的每个值以找到匹配项。这种查询模式相当于一个全表扫描,因为数据库无法预测匹配项可能出现的位置。

5. 为什么使用索引的效率高?

6. 索引的底层数据结构和查找原理

重难点:因为在MySQL中索引的数据结构为B+树,树中的节点就是索引页,索引的查找原理类似于AVL平衡二叉树的查找。在索引B+树中,每个结点存储索引的键(升序存储)和指针,用于指向其他结点,叶子结点存放具体的数据(主键索引则存放主键的值和其他所有字段的值,非聚族索引则存放的是普通索引的键值和它对应的主键id,用于回表查询)。在页目录查询过程中可以使用二分查找来提高查询结点的效率。

关键字:索引页、页目录、二分查找、全表扫描、数据页

示例:现有数据表test如下,含id、a、b、c三个字段,其中id为主键索引,a和b也有索引

要求:select * from test where c = 83

分析:因此c没有建立索引,因此需要进行全表查询,而a和b索引不是主键索引,其只存储了对应键值和主键id,因此需要去a索引中查询。a索引为主键索引,页内数据是根据主键id升序排序的,因此要查找c则需要先找到B+树最左边的叶节点,然后从左往右进行全表扫描。

要求2:select * from test where b = 94;

分析:最终要查询处理的结果为id,a,b,c,查询条件为b=94,而b是有索引的,则会根据b的值在索引表中查找其对应的数据页,找到b=94对应的id,然后通过该id回表查询主键索引,找到该id对应的数据页,然后因为主键索引存储了所有数据项,所有返回最终查询的结果id,a,b,c。

记录是如何排序的:

如果表有主键,会根据主键排序;没主键有唯一非空索引,会根据该索引排序;两者都没有,InnoDB会自动生成一个row_id列并根据该列进行排序。

什么是回表查询:

回表查询是指当通过非聚族索引来查询非主键信息时,需要先根据在非聚族索引中找到其对应的主键值,然后根据该主键值再来去主键索引中查询对应的数据,这个二次查询的操作就是回表。

避免回表查询的方法有:建立聚合索引、不随意使用select*、根据场景合理构建索引。

a索引表结构示例:

7. int和Integer的区别?

  • Integer是int的包装类;int是基本数据类型。
  • Integer变量必须实例化后才能使用;int变量不需要。
  • Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
  • Integer的默认值是null;int的默认值是0

8. int有默认值吗?什么情况下有默认值,什么情况下没有?

对于类的成员变量和全局变量有默认值,默认值为0,对于局部变量(在方法或块中定义的变量),没有默认值,在使用之前必须初始化。

9. Integer有默认值吗?什么情况下有默认值,什么情况下没有?

对于未初始化的对象引用及成员变量,Integer如果未显式初始化,会被赋予默认值null。

对于局部变量,不会初始化。

10. 原子类的功能和作用

11. 异常和error的区别

ExceptionError都是Throwable类的子类,它们的区别如下:

  1. 检查型异常(Checked Exceptions):
    • Exception分为检查型异常和非检查型异常。检查型异常是那些编译器要求必须处理的异常(通过throws声明或try-catch块),例如IOException
  1. 非检查型异常(Unchecked Exceptions):
    • 非检查型异常是那些编译器不强制要求处理的异常,通常是由于编程错误导致的,例如NullPointerExceptionArithmeticException
  1. 错误(Errors):
    • Error用于表示JVM无法处理的错误情况,通常是由于严重问题导致的,比如OutOfMemoryErrorStackOverflowError。这些通常是由于资源不足、约束失败或内部错误导致的。
  1. 恢复可能性:
    • Exception通常被认为是可以被应用程序捕获并恢复的异常情况。
    • Error通常表示严重问题,应用程序无法恢复或继续执行。
  1. 使用场景:
    • 异常(Exception)用于控制流中的异常情况,是程序正常运行时可能遇到的异常条件。
    • 错误(Error)通常用于指示不应该由应用程序捕获的严重问题,比如虚拟机的问题或系统问题。
  1. 处理方式:
    • 异常(Exception)应该被捕获并妥善处理,以避免程序异常终止。
    • 错误(Error)通常不被捕获,因为它们通常指示了无法恢复的情况。即使捕获了,通常也只是记录日志或做一些清理工作。

手撕题:

解答:

public class OrderServiceTest {
    //订单服务类
    class OrderService {
        private HashMap<OrderType, DiscountStrategy> discountStrategies = new HashMap<>();

        public OrderService() {
            //注册不同的折扣策略
            discountStrategies.put(OrderType.NORMAL, new NormalOrder());
            discountStrategies.put(OrderType.GROUPON, new GroupOder());
            discountStrategies.put(OrderType.PROMOTION, new PromotionOder());
        }

        public double discount(Order order) {
            DiscountStrategy discountStrategy = discountStrategies.get(order.getType());
            return discountStrategy.caculateDiscount(order);
        }
    }

    //订单抽象策略
    interface DiscountStrategy {
        double caculateDiscount(Order order);
    }

    //普通订单具体策略类
    class NormalOrder implements DiscountStrategy {
        @Override
        public double caculateDiscount(Order order) {
            //普通订单折扣计算算法
            return 0.0;
        }
    }

    //团购订单具体策略类
    class GroupOder implements DiscountStrategy {
        @Override
        public double caculateDiscount(Order order) {
            //团购订单折扣计算算法
            return 0.0;
        }
    }

    //促销订单具体策略类
    class PromotionOder implements DiscountStrategy {
        @Override
        public double caculateDiscount(Order order) {
            //团购订单折扣计算算法
            return 0.0;
        }
    }
}

反问:自身的不足和缺点?

答:深度不够,停留在表面,很多细节的地方一笔带过。

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

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

相关文章

前端Vue组件化实践:打造自定义等宽tabs标签组件

在前端开发的世界里&#xff0c;随着业务复杂度的提升和需求的多样化&#xff0c;传统的整体式开发方式已经难以满足快速迭代和高效维护的需求。组件化开发作为一种重要的解决方案&#xff0c;正逐渐受到广大开发者的青睐。本文将结合Vue框架&#xff0c;探讨如何通过组件化开发…

Linux 网络配置与连接

一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…

数据驱动未来,Xinstall全渠道统计方案引领行业变革

在这个信息爆炸的时代&#xff0c;App市场的竞争日益激烈。对于每一个开发者或营销人员来说&#xff0c;掌握准确、全面的数据分析能力&#xff0c;是提升产品竞争力、优化营销策略的关键。然而&#xff0c;面对投放渠道的分散、数据打通的困难以及作弊流量的困扰&#xff0c;许…

CentOS7.X系统部署Zabbix6.0版本(可跟做)

文章目录 一、部署环境说明二、基本环境部署步骤1、环境初始化操作2、部署并配置Nginx3、部署并配置PHP4、测试NginxPHP环境5、部署并配置MariaDB 三、Zabbix-Server部署步骤1、编译安装Zabbix-Server2、导入Zabbix初始化库3、配置Zabbix前端UI4、启动Zabbix-Server5、WEB页面配…

大厂必争之地!AI搜索产品万字长文分析

多年以前&#xff0c;百度、谷歌等就在开始做智能搜索&#xff0c;但彼时的智能搜索只是对搜索结果的简单整理归纳&#xff0c;效果并不如人意。当前AI爆火&#xff0c;在AI的加持下&#xff0c;搜索会不会更强大一些呢&#xff1f;其实并不是&#xff0c;至少当前AI搜索的使用…

【Linux杂货铺】期末总结篇2:文件操作命令 | 目录操作命令

&#x1f308;个人主页&#xff1a;聆风吟_ &#x1f525;系列专栏&#xff1a;Linux实践室、网络奇遇记 &#x1f516;少年有梦不应止于心动&#xff0c;更要付诸行动。 文章目录 第四章4.1 ⛳️Linux与windows的文件系统差别4.2 ⛳️目录相关的常用术语4.3 ⛳️Linux文件类型…

环境配置|PyCharm——Pycharm本地项目打包上传到Github仓库的操作步骤

一、Pycharm端的设置操作 通过Ctrl+Alt+S快捷组合键的方式,打开设置,导航到版本控制一栏中的Git,在Git可执行文件路径中,输入Git.exe。 按照下图顺序,依次点击,完成测试。输出如图标④的结果,即可完成测试。 输出下图结果,配置Git成功,如本地未安装Git,需自行安装。

机器学习 | 深入理解激活函数

什么是激活函数&#xff1f; 在人工神经网络中&#xff0c;节点的激活函数定义了该节点或神经元对于给定输入或一组输入的输出。然后&#xff0c;将此输出用作下一个节点的输入&#xff0c;依此类推&#xff0c;直到找到原始问题的所需解决方案。 它将结果值映射到所需的范围…

Java的数组

概念&#xff1a;用于存储同一数据类型的多个元素[容器] 声明格式&#xff1a;数据类型[] 变量名&#xff1b; 初始化&#xff1a; 1. 静态初始化 数据类型[] 数组名 new 数据类型[]{元素一,元素二,元素三....}简化格式: 数据类型[] 数组名 {元素一,元素二,元素三....} 简…

phenocycler发现免疫治疗反应关键的肿瘤微环境区域

T 细胞介导的抗原特异性反应对于有效的免疫监视至关重要。然而T细胞如何进入肿瘤微环境并操纵局部组织微环境来实现效应器功能&#xff0c;以及这些局部的细胞结构如何对T细胞疗法或者其他免疫治疗做出反应仍然不清楚。近期来自斯坦福大学的研究者利用小鼠模型和临床患者样本&a…

【LeetCode力扣】006. Z 字形变换(Python)

最快解法 参考了运行时间最短的代码&#xff0c;其使用的思路就是按列排序后连接。 class Solution:def convert(self, s: str, numRows: int) -> str:if numRows < 2 : # numRows1时候&#xff0c;对应输出为原字符串return sn len(s)lst [ for _ in range(numRows…

数据库:redis练习题

1、安装redis&#xff0c;启动客户端、验证。 redis-server redis-cli 2、string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; set mykey "haha" &#xff08;2&#xff09; 读取键值&#xff1a; get mykey &#xff08;3&…

深度学习 | CNN 基本原理

目录 1 什么是 CNN2 输入层3 卷积层3.1 卷积操作3.2 Padding 零填充3.3 处理彩色图像 4 池化层4.1 池化操作4.2 池化的平移不变性 5 全连接层6 输出层 前言 这篇博客不够详细&#xff0c;因为没有介绍卷积操作的具体计算&#xff1b;但是它介绍了 CNN 各层次的功能…

ubantu22.04安装OceanBase 数据库

1、管理员启动cmd,运行 sudo bash -c "$(curl -s https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/download-center/opensource/service/installer.sh)" 2、提示如下代表安装完成 3、修改数据库配置文件的密码 sudo vim /etc/oceanbase.cnf 然后保存退…

【B树、B-树、B+、B*树】

目录 一、B-树&#xff08;即B树&#xff09;的定义及操作1.1、定义1.2、操作1.2.1、查找1.2.2、插入1.2.3、删除 二、B树的定义及操作2.1、定义2.2、操作2.2.1、查找2.2.2、插入2.2.3、删除 三、B*树 一、B-树&#xff08;即B树&#xff09;的定义及操作 1.1、定义 B-tree即…

SpringBoot使用Redis(事务异步add + 更新)

1&#xff0c;简单介绍redis Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的内存中数据结构存储系统。 主要特点&#xff1a; 内存存储&#xff1a; Redis 主要将数据存储在内存中&#xff0c;因此读写速度非常快&#xff0c;适合需要高性能的应用场景。…

整洁架构SOLID-里氏替换原则(LSP)

文章目录 定义LSP继承实践正例反例 LSP软件架构实践反例 小结 定义 1988年&#xff0c;Barbara Liskov在描述如何定义子类型时写下了这样一段话&#xff1a; 这里需要的是一种可替换性&#xff1a;如果对于每个类型是S的对象o1都存在一个类型为T的对象o2&#xff0c;能使操作T…

牛客TOP101:合并k个已排序的链表

文章目录 1. 题目描述2. 解题思路3. 代码实现 1. 题目描述 2. 解题思路 多个链表的合并本质上可以看成两个链表的合并&#xff0c;只不过需要进行多次。最简单的方法就是一个一个链表&#xff0c;按照合并两个有序链表的思路&#xff0c;循环多次就可以了。   另外一个思路&a…

PySide(PyQt),csv文件的显示

1、正常显示csv文件 import sys import csv from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QWidgetclass CSVTableWidgetDemo(QMainWindow):def __init__(self):super().__init__()# 创建显示控件self.widget QWidget(self)sel…

improve-前端运行项目内存溢出解决

1.场景 运行项目时&#xff0c;out of memory&#xff0c;内存溢出。导致前端运行需要重启项目。 2.解决 2.1删除缓存 删除依赖包中的cacle临时缓存 2.2 更改项目配置 "scripts": {"serve": "node --max_old_space_size5120 node_modules/vue/cli-s…