面试题汇总

一. 腾讯

二. 华为

三. 快手

1. Long 的长度和范围,为什么要减 1 (Java基础)

像 byte、short、int、long能表示的最大正数都减 1 了。这是为什么呢?这是因为在二进制补码表示法中,最高位是用来表示符号的(0 表示正数,1 表示负数),其余位表示数值部分。所以,如果我们要表示最大的正数,我们需要把除了最高位之外的所有位都设为 1。如果我们再加 1,就会导致溢出,变成一个负数。

2. 线程池配置无界队列了之后,拒绝策略怎么搞,什么时候用到无界队列 (JUC并发)

线程池配置无界队列了之后,拒绝策略其实就失去了意义,因为无论有多少任务提交到线程池,都会被放入队列中等待执行,不会触发拒绝策略。不过,这样可能堆积大量的请求,从而导致 OOM。因此,一般不推荐使用无界队列。

四. 美团

五. 阿里

六. 百度

七. 字节

八. 大疆

1. 为什么创建进程开销比线程大? (操作系统)

添加链接描述

  • 线程的创建时间比进程快,因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;
  • 线程的终止时间比进程快,因为线程释放的资源相比进程少很多;
  • 同一个进程内的线程切换比进程切换快,因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,那么在切换的时候不需要切换页表。而对于进程之间的切换,切换的时候要把页表给切换掉,而页表的切换过程开销是比较大的;
  • 由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了,这就使得线程之间的数据交互效率更高了;

2. 物理地址和虚拟地址 (操作系统)

我们程序所使用的内存地址叫做虚拟内存地址(Virtual Memory Address)
实际存在硬件里面的空间地址叫物理内存地址(Physical Memory Address)
那么对于虚拟地址与物理地址的映射关系,可以有分段和分页的方式,同时两者结合都是可以的。

  • 虚拟内存的作用
    第一,虚拟内存可以使得进程对运行内存超过物理内存大小,因为程序运行符合局部性原理,CPU 访问内存会有很明显的重复访问的倾向性,对于那些没有被经常使用到的内存,我们可以把它换出到物理内存之外,比如硬盘上的 swap 区域。
    第二,由于每个进程都有自己的页表,所以每个进程的虚拟内存空间就是相互独立的。进程也没有办法访问其他进程的页表,所以这些页表是私有的,这就解决了多进程之间地址冲突的问题
    第三,页表里的页表项中除了物理地址之外,还有一些标记属性的比特,比如控制一个页的读写权限,标记该页是否存在等。在内存访问方面,操作系统提供了更好的安全性。

3. Synchronize给静态和非静态方法的区别 (JUC并发编程)

Synchronized修饰非静态方法,实际上是对调用该方法的对象加锁,俗称“对象锁”;
Synchronized修饰静态方法,实际上是对该类对象加锁,俗称“类锁”。
添加链接描述

4. 匿名内部类为什么可以访问外部类的对象 (Java基础)

  • 匿名内部类
class Test {
 
    public static void main(String[] args) {
        Thread thread = new Thread(
                // 匿名内部类
                new Runnable() {
                    @Override
                    public void run() {
                        System.out.println("Thread run");
                    }
                }
        );
    }
}

匿名内部类也是不能有访问修饰符和 static 修饰符
匿名内部类是唯一一种没有构造器的类。正因为其没有构造器,所以匿名内部类的使用范围非常有限,大部分匿名内部类用于接口回调
添加链接描述

5. 反转单链表有几种手段(数据结构与算法)

双指针,迭代法;
递归法;

6. Arrays.sort底层原理?快排如何优化?(数据结构与算法)

jdk1.8之前,Arrays.sort()方法使用的是传统快排的方式进行排序
jdk1.8后,Arrays.sort()方法使用的是双轴快排
添加链接描述
双轴快排(DualPivotQuicksort)的基本思想是:
顾名思义有两个轴元素pivot1,pivot2,且pivot ≤pivot2
将序列分成三段:x < pivot1、pivot1 ≤ x ≤ pivot2、x >pivot2
然后分别对三段进行递归
添加链接描述

7. ZGC垃圾回收器,染色指针和读屏障 (JVM)

添加链接描述

8. InnoDB 使用 B+ 树做索引,记录使用 bigint 作为主键,假定每条记录 1kb,三层 b+ 树可以表示多少条记录

添加链接描述
在这里插入图片描述

九. OPPO

1. 什么是操作系统,有什么组成 (操作系统)

  • 定义
    操作系统:负责管理计算机中各种软硬件资源控制各类软件运行(他是介于硬件和应用软件系统之间的软件,运行在逻辑上,是人与计算机通信的桥梁)
  • 操作系统的组成
    1、进程管理:系统资源的分配单位(基本单位使进程 重点区分一下CPU调度和分派的基本单位线程)
    2、存储管理:内存分配,存储保护,虚拟存储
    3、设备管理:管理外设和接口
    4、文件管理:保存程序和数据等软件信息
    5、程序接口:提供指令或函数的调用方式,使程序能够调用系统的服务
    6、用户界面:为用户提供操作环境

2. 文件系统,IO索引 (操作系统)

添加链接描述

  • 文件系统的作用
    存储管理:将文件数据存储到物理存储介质中,并且管理空间分配,以确保每个文件都有足够的空间存储,并避免文件之间发生冲突。
    文件管理:文件的创建、删除、移动、重命名、压缩、加密、共享等等。
    目录管理:目录的创建、删除、移动、重命名等等。
    文件访问控制:管理不同用户或进程对文件的访问权限,以确保用户只能访问其被授权访问的文件,以保证文件的安全性和保密性。
  • IO索引
    Linux 文件系统会为每个文件分配两个数据结构:索引节点和目录项,它们主要用来记录文件的元信息和目录层次结构。
    索引节点,也就是 inode,用来记录文件的元信息,比如 inode 编号、文件大小、访问权限、创建时间、修改时间、数据在磁盘的位置等等。索引节点是文件的唯一标识,它们之间一一对应,也同样都会被存储在硬盘中,所以索引节点同样占用磁盘空间。
    目录项,也就是 dentry,用来记录文件的名字、索引节点指针以及与其他目录项的层级关联关系。多个目录项关联起来,就会形成目录结构,但它与索引节点不同的是,目录项是由内核维护的一个数据结构,不存放于磁盘,而是缓存在内存
    在这里插入图片描述

3. 线程安全问题 (JUC并发)

synchronized方式
Lock接口下的类
threadLocal
乐观锁
Volatile

4. 对象加载过程,内存组成,访问方式 (JVM虚拟机)

在这里插入图片描述
加粗样式
在这里插入图片描述
在这里插入图片描述

5. 序列化使用场景 (Java基础)

  • 对象在进行网络传输(比如远程方法调用 RPC 的时候)之前需要先被序列化,接收到序列化的对象之后需要再进行反序列化;
  • 将对象存储到文件之前需要进行序列化,将对象从文件中读取出来需要进行反序列化;
  • 将对象存储到数据库(如 Redis)之前需要用到序列化,将对象从缓存数据库中读取出来需要反序列化;
  • 将对象存储到内存之前需要进行序列化,从内存中读取出来之后需要进行反序列化。

十. 招银科技

1. 金额、汇率怎么存?BigDecimal如何进行计算、怎么四舍五入 (java基础)

BigDecimal存浮点数 不会出现精度丢失
BigDecimal.setScale() 方法可以将 BigDecimal 对象四舍五入后保留指定小数位数,其中第一个参数表示小数点后保留的位数,第二个参数表示使用四舍五入策略。

2. .枚举对象都是单例的吗? (java基础,设计模式)

是。
添加链接描述
「 枚举」类型不能被实例化。
在单例模式的实现中,除去 枚举 方法实现的单例模式,其它的实现都可以利用反射构造新的对象,从而破坏单例模式,但是枚举就不行,下面说说原因:
破坏单例的方式有 3 种,反射、克隆以及序列化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值