一. 腾讯
二. 华为
三. 快手
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 种,反射、克隆以及序列化