腾讯面试整理

java相关:

JDK中哪一些是线程安全的集合类?是怎么保证安全的?

早在jdk的1.1版本中,所有的集合都是线程安全的。但是在1.2以及之后的版本中就出现了一些线程不安全的集合,为什么版本升级会出现一些线程不安全的集合呢?因为线程不安全的集合普遍比线程安全的集合效率高的多。随着业务的发展,特别是在web应用中,为了提高用户体验减少用户的等待时间,页面响应速度(也就是效率)是优先考虑的。而且对线程不安全的集合加锁以后也能达到安全的效果(但是效率会低,因为会有锁的获取以及等待)。其实在jdk源码中相同效果的集合线程安全的比线程不安全的就多了一个同步机制,但是效率上却低了不止一点点,因为效率低,所以已经不太建议使用了。

Vector:就比Arraylist多了个同步化机制(线程安全)。

Hashtable:就比Hashmap多了个线程安全。

hashtable是线程安全的,即hashtable的方法都提供了同步机制;hashmap不是线程安全的,即不提供同步机制 ;hashtable不允许插入空值,hashmap允许!

ConcurrentHashMap:是一种高效但是线程安全的集合。

Stack:栈,也是线程安全的,继承于Vector。

2.什么是线程安全?线程安全问题是由什么引起的?什么是死锁?

线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。

线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。

线程安全问题都是由全局变量及静态变量引起的。

若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁。

死锁产生有四个必要条件,打破任意一个,就能打破死锁状态: 1 互斥条件 2 请求与保持 3 不剥夺 4 循环等待

互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某 资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。

请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源 已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。

不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能 由获得该资源的进程自己来释放(只能是主动释放)。

循环等待条件:若干进程间形成首尾相接循环等待资源的关系。

3.你了解哪些数据结构?栈这种数据结构能应用在哪些场景中?举几个例子说明一下栈的实际应用场景?栈的特点是什么?

栈这种结构的特点:栈只能从表的一端存取数据,另一端是封闭的。在栈中,无论是存数据还是取数据,都必须遵循”先进后出”的原则,即最先进栈的元素最后出栈。

  1. 使用栈进行符号的逆序输出:栈最大的特点是先进后出,所以逆序输出是栈经常用到的一个应用场景。首先把所有元素依次入栈,然后把所有元素出栈并输出,这样就实现了逆序输出。
  1. 计算后缀表达式,碰见数字就入栈,碰见符号出栈运算运算。遇见数字就入栈,遇见符号就出栈,然后把结果再入栈
  1. 语法检测,匹配括号是否成对出现:凡是遇到括号的前半部分,即把这个元素入栈,凡是遇到括号的后半部分就比对栈顶元素是否该元素相匹配,如果匹配,则前半部分出栈,否则就是匹配出错。
  1. 什么是中缀表达式?

​ 中缀表达式利于人的理解,但不便于计算机的处理。因此需要将中缀表达式转换成后缀表达式,以方便计算机处理。所谓后缀表达式就是将运算符放在运算数之后。后缀表达式也称为逆波兰表达式。

5.hashMap这种数据结构,假如让你自己去实现一个hashMap这种数据结构你会怎么去设计实现?(hashMap就是散列表,同一种说法)

主要还是考的是hash表的结构,哈希表综合了数组和链表的优点,是一种寻址容易而且插入也相对容易的数据结构,哈希表既满足了数据查找方便,同时还不占用太多的内存空间,使用十分方便,哈希表有多种不同的实现方法,我们可以使用一种最常用的实现方法—拉链法来实现哈希表,这个哈希表可以理解为链表的数组。

哈希表是由数组+链表组成的,在数组中每个元素存储的是一个链表的头结点,数据存储在链表中,那么是按照怎么样的规则来进行存储的呢?一般的情况下是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。

hashMap其实是一个线性的数组实现的,所有可以理解为其存储数据的容器就是一个线性数组。

6. 算法方面了解哪些算法?排序算法中,选择排序和冒泡排序算法的区别在哪里?排序算法的稳定性是指什么?选择排序和冒泡排序的时间复杂度是多少?

选择排序:是一种最简单直观的排序算法,它的工作原理是每一次从待排序的数据元素中选出最小或者是最大的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完,选择排序是不稳定的排序方法。

冒泡排序:基本思想是将数组中的每个相邻元素进行两两比较,按照小元素在前(或大元素在前)的原则确定是否进行交换。这样每一轮执行之后,最大(或最小)的元素就会被交换到了最后一位。完成一轮之后,我们可以再从头进行第二轮的比较,直到倒数第二位(因为最后一位已经是被排序好的了)时结束。这样一轮之后,第二大(或第二小)的元素就会被交换到了倒数第二位。同样的过程会依次进行,直到所有元素都被排列成预期的顺序为止。

选择排序和冒泡排序算法的区别主要在于:两种排序比较的次数是相同的,但是交换的次数,选择排序是更少的,但是通常选择排序可能更快一点,冒泡排序是每一次都可能要交换,而选择排序是比较时记下a[i]的位置,最后用来交换的。交换过程是不一样的,但是查找过程是一样的。

时间复杂度:

冒泡排序时间复杂度:

N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次,所以可以用双重循环语句,外层控制循环多少趟,内层控制每一趟的循环次数

综上所述:冒泡排序总的平均时间复杂度为:O(n2)

选择排序时间复杂度:

选择排序空间复杂度也是O(1),是一种原地排序算法。

它的最好情况时间复杂度、最坏情况和平均情况时间复杂度都为 O(n^2)。

选择排序不是稳定的排序算法,因为它每次都要找出剩余未排序元素中的最小值,并和前面的元素交换位置,这样就破坏了稳定性。冒泡排序是一种稳定的排序算法。

7. 排序的稳定性是指什么?冒泡排序是稳定的排序算法,你这么证明,就是如果采用数据推导的方式去证明,你会如何证明是稳定的?

稳定排序是指原来相等的两个元素前后相对位置在排序后依然不变。

即在原序列中,r[i] = r[j],且 r[i] 在 r[j] 之前,而在排序后,r[i] 仍在 r[j] 之前,则称这种排序算法是稳定的,否则称为不稳定的。

操作系统:

在操作系统中,实现多进程间通信有哪些方式?信号量是什么? 能举几个具体的使用信号量的例子吗?

进程和线程的关注点是不一样的,进程是资源分配的基本单位,进程间资源是独立的,关注的是进程通信问题,线程间资源是共享的,关注的是安全问题。

操作系统进程间通信的方式有哪些?

管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用,进程的亲缘关系指的是父子进程关系。

消息队列(message queue):消息队列是消息的链表,存在在内核中并由消息队列表示符标示,消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限制等缺点。

共享内存:共享内存就是映射一段内被其它进程所访问的内存,共享内存是由一个进程创建,但是多个进程都可以访问,共享内存是最快的进程间通信方式,它是针对其它进程通信方式运行效率低而专门设计的,它往往与其它通信机制,如信号量配置使用,来实现进程间的同步和通信。

套接字(socket):套接字也是进程间的通信机制,与其它通信机制不同的是,它可以用于不同机器间的进程通信。

信号:信号是一种比较复杂的通信方式,用于通知接受进程某个时间已经发生。

信号量:信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它常作为一种锁的机制,防止某进程正在访问共享资源时,其他进程也访问该资源,因此它主要作为不同进程或者同一进程之间不同线程之间同步的手段。

数据库:

数据库的事务中,事务有原子性、一致性等等,他们都是什么?那么一致性是指什么?如果保证了原子性就一定能保证一致性吗?如果我的每个操作都是原子的那么是不是数据肯定能保证是一致的?不能保证,理由是什么?说出理由?

原子性:事务是数据库的逻辑工作单位,事务中的操作要么全做,要么不做。

一致性:事务执行的结果必须是使数据库从一个一致性变到另一个一致性。最常见的例子是转帐。例如从帐户A转一笔钱到帐户B上,如果帐户A上的钱减少了,而帐户B上的钱却没有增加,那么我们认为此时数据处于不一致的状态。

隔离性:一个事务的执行不能干扰其他事物。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能相互干扰。

持久性:一个事务一旦提交,他对数据库中的数据的改变应该是永久性的。接下来的其它操作或者故障不应该对其执行结果有任何影响。

原子性和一致性的关系是什么?

在事务处理的ACID属性中,一致性是最基本的属性,其他的三个属性都为了保证一致性而存在的。原子性并不能保证一致性,在多个事务并行进行的情况下,即使保证了每一个事务的原子性,仍然可能导致数据不一致的结果。为了保证并发情况下的一致性引入了隔离性,即保证每一个事务能够看到的数据总是一致的,就好像其他并发事务并不存在一样,用术语来说,就是多个事务并发执行后的状态,和它们串行执行后的状态是等价的。怎么实现隔离性呢?可以通过锁机制,悲观锁和乐观锁。

10. MySQL中有哪些方式可以提高数据的查询速度或者是效率的?

索引:索引是数据库中重要的数据结构,它的根本目的就是为了提高查询速度,对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。

索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

11.Hadoop的架构是怎么样的? Hadoop是怎么保证数据是一致的,是怎么保证数据完整性的?

Hadoop由HDFS、MapReduce、Yarn(资源调度)、辅助工具(HBase、Hive和ZooKeeper等)成员组成,其中最基础最重要元素为底层用于存储集群中所有存储节点文件的文件系统HDFS(Hadoop Distributed File System)来执行MapReduce程序的MapReduce引擎。

12.你熟悉MapReduce框架吗?

13.你现在在做哪些工作?是如何存储的?你的优点在哪里?如果我把不同来源的数据导入spark或者是hive中,是不是也可以呢?

14. 网络方面。TCP和UDP的区别是什么?TCP为什么是安全的?三次握手是什么?三次握手之后,我再发如果断了,会怎么办?

  1. 连接方面区别:TCP是面向连接的,发送数据之前需要建立连接,UDP是无连接的,即发送数据之前不需要建立连接。
  1. 安全方面的区别:TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复且按序到达,UDP尽最大努力交付,即不保证可靠交付。
  1. 传输效率的区别:TCP传输效率相对较低,UDP传输效率高,适用于对高速传输和实时性有较高要求的通信或者广播通信。
  1. 链接对象数量的区别:TCP链接只能是点到点,一对一的,UDP支持一对一、一对多、多对一和多对多的交互通信。

15. 什么是滑动窗口,滑动窗口是用来干什么的?

滑动窗口本质上是描述接受方(本地)的TCP数据报缓冲区大小的数据,发送方根据这个数据来计算自己最多能发送多长的数据。如果发送方收到接受方的窗口大小为0的TCP数据报,那么发送方将停止发送数据,等到接受方发送窗口大小不为0的数据报的到来。

滑动窗口协议(Sliding Window Protocol)属于TCP协议的一种应用,用于网络数据传输时的流量控制,以避免拥塞的发生。

tcp采用滑动窗口机制来实现流量控制!

16. 操作系统Linux有了解吗?怎么看正在使用CPU的一个线程命令是什么?Linux的常用命令?

17. 你看过哪些开源的底层代码?你经常访问的开源的网站是什么?

本文标题:腾讯面试整理

文章作者:雷凯博

发布时间:2020年06月08日 - 20:06

最后更新:2021年05月17日 - 10:05

原始链接:http://yoursite.com/2020/06/08/%E8%85%BE%E8%AE%AF%E9%9D%A2%E8%AF%95%E6%95%B4%E7%90%86/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

坚持原创技术分享,您的支持将鼓励我继续创作!
-------------本文结束感谢您的阅读-------------
0%