面试题总结6
介绍下项目
对于转语言你怎么看,是 倾向做后端还是客户端还是说无所谓,因为应届生决定未来技术栈是很庞杂的,不可能几年所有的东西都学完,所以现在决定了方向至少是 3-5 年的事情,除非你干了一年以后觉得不行立马转行
因为我的专业是软件工程嘛,主学的是 Java 开发 做了很多相关准备所以基础也比较扎实。但我对客户端也源于去了解和学习,因为作为应届生来说还是很渴望能接触到新的领域,我认为自己的学习能力还是很强的,能快速适应不用的技术栈。所以强调的还是更看重在公司能学习到新东西得到成长这是最重要的。无论是后端还是客户端,只要有发展的机会都会全力以赴。我也清楚一旦做出了某一个选择就要投如精力学习,我可以讲这 3-5 年看作是提升技能累计经验的时期,既然选择了肯定是要做出成果,可以拓宽视野对自己还是有帮助的。
讲一下虚拟机里面关于废弃对象的理解,什么节点可以充当 GCRoot
废弃对象属于 JVM 中执行引擎这一部分处理的,对象都是在堆中生成对的内存是有限的,不可能无限的生产对象,那他就得有一个对象回收的机制但是得区分哪些对象是可以回收哪些是不能回收,虚拟机有两种方法:引用计数法,如果对象被引用那虚拟机中的计数器会+1,但出现循环引用则没办法了,计数器永远不为 0 ;可达性分析算法:他利用了一个 GC Root 作为基准,看他引用了哪些对象利用关系向下搜索,知道到达某个对象没有任何链相连。剩余对象就可以被回收。GCROOT 可以是:本地变量表中的中引用的对象、静态变量、字符串常量池、本地方法引用的 u第项、Class 对象、系统类加载器、锁持有对象
说一些 Java 的容器
容器主要用来存储对象,从两部分来讲:单列集合 Collection ,下面还有一些子接口例如 Set 集合、List 队列、Queue 栈或队列,最常用的两个就是 ArrayList 和 LinkedList,ArrayList 内部基于动态数组实现,由于是数组所以是允许随机查找时间复杂度为 O1,但对于元素的插入和删除效率不高,并且有扩容机制当达到数组阈值就触发扩容,创建两倍大的数组复制元素到新数组,方法:add、get、set、remove; LinkedList 内部基于双向链表实现,由于是链表所以对于元素的插入和删除效率比较高时间复杂度为 O1,但查找元素只能是顺序查时间复杂度到 On ,方法:get、leftpush、rightpush、remove。双列集合顶层接口 Map 最常见的实现就是 HashMap 方法:add、get、remove、set,在 1.7 和 1.8 做出了改变,1.7 时底层使用数组+链表实现,插入元素先计算他的 hash 值映射到那个桶然后在这个链的头部插入元素。但为什么 1.8 要改变链表为红黑树呢我的理解是链表的查询效率比较于红黑树是很低的,所以树化。但另一种说法是能更好的检测攻击 一般情况下链表的查询效率是很高的 如果出现了树化那就代表有人在恶意攻击,树化是为了防止出现异常。1.8 的 hashMap 插入机制:先映射数组,在尾部插入链表如果链表长度到 8 先扩容数组为 2 倍,数组到了 64 后再选择树化。
进程和线程的区别-多个方面,线程之间怎么通信还有什么方法。
进程是程序的一次执行过程,有自己独立的内存空间和系统资源,线程就是进程中的执行单元。进程更独立,一个奔溃通常不影响其他进程。但是线程出问题可能影响其他线程。然后进程是并行处理任务的,线程是并发处理。线程的通信主要有三种:一共享内存 同一进程里的线程能读写共享变量来交流;二消息传递,像 java 里的阻塞队列;三管通信,不过多用于子父线程-线程内的线程。
String 类型有哪些操作
length 获取字符串长度、charAt 获取指定位置的字符、equals 比较两个字符、contains 包含字符、indexOf 首次出现的位置、subString 截取字符串
说一下 四次挥手,如果最后服务端没有收到 A 的 ack 会怎么样,三次握手不行吗。TCP 是一个双通信模型…你要考虑为什么四次、没有四次会怎么样、这个等待 2msl 是谁等待 、又比如没有断开会怎么样…
四次挥手:假设是 客户端向服务端发送断开请求,客户端开始第一次挥手发送一个 FIN 报文标识我想要断开连接,服务端接收到这个报文后就返回客户端一个 ACK 表示我知道你想要断开连接了这是第二次挥手,当服务端处理完所有的数据之后再给客户端发送一个 FIN 表示服务端准备好断开连接了这是第三次挥手,客户端收到后就给服务端发送 ACK 表示准备断开连接,客户端就会等待 2MSL,之后断开连接。为什么是 4 次挥手如果最后一次挥手没到怎么办:那么我站在服务端的角度来看,第四次挥手没有收到那么服务端会任务自己的 FIN 没送答,就会触发重试机制,刚刚说客户端会等待 2MSL 就是这种情况,等到服务端重发就好 了。
思维题:
思维题:小区内,你是共享单车的技术负责人,小区有用户反馈共享单车太多了,但也有人反馈单车完全不够用,你应该怎么去分析这个问题…(我们不需要定义他的可能性,主要关注如何去找到这类问题的原因。答:有的反馈多有的反馈少,作为程序员如何定义多和少的概念,首先要明白怎么样的用户反馈是有意义的,他是基于什么条件下定义的 ,可能说这个人只是刚好看到 3 部,他看的地方不一样或者说时间不一样。有人也会觉得小区内就不应该有这么多车,这些可能就是一些无效反馈。认知要拉齐,然后在定义问题,小问题小处理,具体问题具体定位。哪些问题可以通过加车还是通过系统调度解决。在思维上要发散)
看透问题的本质
算法:两个字符串 S、T。T 中的字符都是 S 打乱后的字符再添加的一个字符,如何找出 T 中多的字符。
利用字符的 ASCII 码,相减得出(考虑的有点多例如一个数可能有多种两数之和)。利用 HashMap 存元素出现的次数。