leetcode java 大厂基础面试题附答案(二)

目录

1. GC root 有哪些?(华为)

2. 传统 I/O 跟 NIO 的区别?(华为)

3. KAFKA 是什么?主要应用场景有哪些?(腾讯)

4. MYSQL 索引分类?(腾讯)

5. 了解线程 & 进程的区别吗?(腾讯)

6. 常见分布式锁的几种实现方式?(腾讯)

7. 信号量与信号的区别?(腾讯)

8. 场景题:1 亿个数据取出最大前 100 个有什么方法?(腾讯)

9. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?(腾讯)

10. 谈谈你对 SQL 注入式攻击的理解?(腾讯)

11. CI 服务有什么用途?(腾讯)


1. GC root 有哪些?(华为)


• Thread-存活的线程。

• Java虚拟机栈中的引用的对象。

• 方法区中的类静态属性引用的对象。(一般指被static修饰的对象,加载类的时候就加 载到内存中。)
• 方法区中的常量引用的对象。本地方法栈中的JNI( native方法)引用的对象。Monitor Used-用于同步监控的对象。



2. 传统 I/O 跟 NIO 的区别?(华为)


所有I/O都被视为单个的字节的移动,通过一个称为Stream的对象一次移动一个字节。 流1/。用于与外部世界接触。它也在内部使用,用于将对象转换为字节,然后再转换回对 象。传统流IO的好处是使用简单,将底层的机制都抽象成流,但缺点就是性能不足。而 且IO的各种流是阻塞的。这意味着,当一个线程调用read()或write()时,该线程被阻 塞,直到有一些数据被读取,或数据完全写入。该线程在此期间不能再干任何事情了。原来的I/O库([在java.io](http://xn--java-ft4g.io/).*中)与NIO最重要的区别是数据打包和传输的方式。原来的 I/O以流的方式处理数据,而NIO以块的方式处理数据。NIO性能的优势就来源于缓冲的机制(buffer机制),不管是读或者写都需要以块的形 式写入到缓冲区中。NIO实际上让我们对IO的操作更接近于操作系统的实际过程。NIO作为非阻塞式的IO,它的优点就在于
1、它由一个专门的线程去处理所有的IO 事件,并负责分发;
2、事件驱动,只有事件到了才会触发,而不是同步的监听这个事件;
3、线程之间通过wait,notify等方式通讯。保证每次上下文切换都是有意义的。减少无谓 的线程切换。
• 当我们在执行持续性的操作(如上传下载)时,IO的方式是要优于NIO的。分清情况, 合理选用。NIO相对于IO流的优势:非阻塞buffer机制流替代块



3. KAFKA 是什么?主要应用场景有哪些?(腾讯)


Kafka是一个分布式流式处理平台。这到底是什么意思呢?
流平台具有三个关键功能:
• 消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是Kafka也被归类为消 息队列的原因。
• 容错的持久方式存储记录消息流:Kafka会把消息持久化到磁盘,有效避免了消息丢失 的风险。
• 流式处理平台:在消息发布的时候进行处理,Kafka提供了一个完整的流式处理类库。 Kafka主要有两大应用场景:
•消息队列:建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
•数据处理:构建实时的流数据处理程序来转换或处理数据流。



4. MYSQL 索引分类?(腾讯)


单列索引
• 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值 和空值,纯粹为了查询数据更快一点。
•唯一索引:索引列中的值必须是唯一的,但是允许为空值,
• 主键索引:是一种特殊的唯一索引,不允许有空值。
组合索引:
多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使 用,使用组合索引时遵循最左前缀集合。
全文索引:
只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文 索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个靓仔,靓女..."通过靓仔,可能就可以找到该条记录
空间索引:
空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种, GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用 SPATIAL 关 键字。要求,弓I擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。



5. 了解线程 & 进程的区别吗?(腾讯)


操作系统中可以拥有多个进程,一个进程里可以拥有多个线程,线程在进程内执行
进程和线程的区别
•容易创建新线程。创建新进程需要重复父进程
•线程可以控制同一进程的其他线程。进程无法控制兄弟进程,只能控制其子进程
•进程拥有自己的内存空间。线程使用进程的内存空间,且要和该进程的其他线程共享这个 空间;而不是在进程中给每个线程单独划分一点空间。
•(同一进程中的)线程在共享内存空间中运行,而进程在不同的内存空间中运行
• 线程可以使用wait(),notify(),notifyAll()等方法直接与其他线程(同一进程) 通信;而,进程需要使用“进程间通信”(IPC)来与操作系统中的其他进程通信。



6. 常见分布式锁的几种实现方式?(腾讯)


• 基于数据库实现分布式锁
• 基于缓存实现分布式锁
• 基于Zookeeper实现分布式锁



7. 信号量与信号的区别?(腾讯)


• 信号:(signal)是一种处理异步事件的方式。信号是比较复杂的通信方式,用于通知接 受进程有某种事件发生,除了用于进程外,还可以发送信号给进程本身。
• 信号量:(Semaphore)进程间通信处理同步互斥的机制。是在多线程环境下使用的一 种设施,它负责协调各个线程,以保证它们能够正确、合理的使用公共资源。 简单地说,信号就是一种异步通信,通知进程某种事件的发生;信号量是进程/线程同步与互 斥的一种机制,保证进程/线程间之间的有序执行或对公共资源的有序访问。



8. 场景题:1 亿个数据取出最大前 100 个有什么方法?(腾讯)


•最容易想到的方法是将数据全部排序,然后在排序后的集合中进行查找,最快的排序算法 的时间复杂度一般为O (nlogn),如快速排序。


•局部淘汰法,该方法与排序方法类似,用一个容器保存前10000个数,然后将剩余的所 有数字——与容器内的最小数字相比,如果所有后续的元素都比容器内的10000个数还 小,那么容器内这个10000个数就是最大10000个数。如果某一后续元素比容器内最 小数字大,则删掉容器内最小元素,并将该元素插入容器,最后遍历完这1亿个数,得 到的结果容器中保存的数即为最终结果了。此时的时间复杂度为O (n+mN),其中m 为容器的大小,即10000。


•分治法,将1亿个数据分成100份,每份100万个数据,找到每份数据中最大的 10000个,最后在剩下的10010000个数据里面找出最大的10000个。如果100 万数据选择足够理想,那么可以过滤掉1亿数据里面99%的数据。100万个数据里面 查找最大的10000个数据的方法如下:用快速排序的方法,将数据分为2堆,如果大 的那堆个数N大于10000个,继续对大堆快速排序一次分成2堆,如果大的那堆个 数N大于10000个,继续对大堆快速排序一次分成2堆,如果大堆个数N小于 10000个,就在小的那堆里面快速排序一次,找第10000-n大的数字;递归以上过程, 就可以找到第1w大的数。参考上面的找出第1w大数字,就可以类似的方法找到前 10000大数字了。此种方法需要每次的内存空间为10A64=4MB, —共需要101次这 样的比较。


• Hash法,如果这1亿个书里面有很多重复的数,先通过Hash法,把这1亿个数字 去重复,这样如果重复率很高的话,会减少很大的内存用量,从而缩小运算空间,然后通 过分治法或最小堆法查找最大的10000个数。


• 采用最小堆法,首先读入前10000个数来创建大小为10000的最小堆,建堆的时间复 杂度为0(mlogm)(m为数组的大小即为10000),然后遍历后续的数字,并于堆 顶(最小)数字进行比较。如果比最小的数小,则继续读取后续数字;如果比堆顶数字大, 则替换堆顶元素并重新调整堆为最小堆。整个过程直至1亿个数全部遍历完为止。然后 按照中序遍历的方式输出当前堆中的所有10000个数字。该算法的时间复杂度为O (nmlogm),空间复杂度是10000 (常数)。



9. 乐观锁和悲观锁的理解及如何实现,有哪些实现方式?(腾讯)


悲观锁:
总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会 上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多 这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里 面的同步原语synchronized关键字的实现也是悲观锁。


乐观锁:
顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更 新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适 用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制, 其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是 使用了乐观锁的一种实现方式CAS实现的。



10. 谈谈你对 SQL 注入式攻击的理解?(腾讯)


所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的输入域或页面请求的 查询字符串,欺骗服务器执行恶意的SQL命令。
如何防范SQL注入式攻击?
在利用表单输入的内容构造SQL命令之前,把所有输入内容过滤一番就可以了。过滤输入内 容可以按多种方式进行。
• 对于动态构造SQL查询的场合
a. 替换单引号,即把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义。
b. 删除用户输入内容中的所有连字符
c. 对于用来执行查询的数据库帐户,限制其权限。用不同的用户帐户执行查询、插入、更新、 删除操作。
• 用存储过程来执行所有的查询。
• 限制表单或查询字符串输入的长度。
• 检查用户输入的合法性。
• 将用户登录名称、密码等数据加密保存。
• 检查提取数据的查询所返回的记录数量。



11. CI 服务有什么用途?(腾讯)


CI (Continuous Integration)-- 持续集成服务 -- 主要用于整合团队开发 中不同开发者提交到开发仓库中的项目代码变化,并即时整合编译,检查整合 编译错误的服务。它需要一天中多次整合编译代码的能力,若出现整合错误, 可以优异地准确定位提交错误源。


参考:
链接:https://leetcode.cn/leetbook/read/da-han-hou-duan-gang-ti-mu-he-ji-shang/nir7kj/
 

你可能感兴趣的:(基础面试题,java,java,开发语言,面试)