持续ing....
舍友阿里一面
1.同步与异步,阻塞和非阻塞
2.Linux下找a开头的文件
3.hashMap自己实现
4.使用IDEA遇到了什么问题
5.查询语句select怎么优化
6.HTTP协议的状态码
用友面试(2019.8.23):
以下问题排列与实际问答顺序没关系,只是我回想起来的问题
非技术:
问:自我介绍
问:你喜欢的课和不喜欢的课?
问:兴趣爱好?
问:你的优缺点?
问:你最成功的事,怎么做到的?(得好好准备一件事呢)
问:什么时候可以来实习?
问:还有什么要问的吗?
问了表现怎么样?后续面试什么时候通知?
技术:
分布式、中间件、排序、设计模式、Spring、SpringAOP自己实现
用友面试中问到的中间件,欠缺中间件理论知识,
问:项目描述?项目中的难点?学到了什么?(难点讲的不好,需要总结一下),JSON怎么做的?
问:数组和链表的区别?同时遍历大小一样的数组和链表哪个更快?为什么?
问:数据库隔离级别?Mysql默认级别?
问:现有一数据为10,A事务修改为5,B事务读取为5,属于哪个隔离级别?
是不可重复度,脑袋抽了说成可重复读。。。面试官让我在看看。。。
问:MySQL优化有哪些?
问:你了解哪些排序?哪些设计模式?
说了冒泡快排选择插入排序,单例、工厂、装饰、观察模式,又问还有吗?然后也没让具体讲。
问:说一下观察模式。
举例了公众号推送消息,应该详细说明一下概念和组件及实现过程的。。。忘记说了
问:说一下Spring?(没具体总结,讲的不好,需要背)
问:实现过SpringAOP吗?(没有。。。)
问:用户登录过程怎么实现的?Cookie和Session区别?如果现在有俩个服务器,怎么确保登录时查找到用户从而登录?
说了把session缓存,又问缓存到哪?没答出来,结果是缓存到redis,当时没理解问题
问:zookeeper知道吗,是干什么的?消息队列知道吗?你还了解其他中间件吗?
不了解。。。
问:关注过开源中间件吗?
另外:舍友绿盟现场面试题:
问:知道观察者模式吗?画一下UML图
问:有100万条数据,怎么找出前100条?假设数据有大小区别
应该还有其他问题,没录音不记得了。。。不过突然发现没问Java、操作系统、网络的东西
总结本次面试以下不足点:
1.你最成功的事,怎么做到的?
2.项目中的难点?学到了什么?
3.说一下Spring?SpringIOC和SpringAOP源码
4.redis集群问题,分布式开发怎么开发?
5.zookeeper、消息队列 等一些中间件原理及应用
算法
同学的百度一面或者二面
1.排序算法
2.将10进制转换为7进制
3.有一个数组,大小为100,元素为0~99,无序,现在将某一个元素修改为 -1,找出被修改的元素的值和下标
一、Java
阿里一面:
1.HashMap和TreeMap的区别?
HashMap:无序、哈希表、允许null作为key和value,key不可以重复,value允许重复,要求key必须重写equals和hashcode方法
TreeMap:有序、红黑树、不允许null,key不可以重复,value允许重复
2.ArrayList默认容量多大,扩容一次多大?
初始容量被设置为10。当ArrayList中的元素超过10个以后,会重新分配内存空间,使数组的大小增长到15(1.5倍)。
3.HashMap默认容量多大,扩容一次多大?
默认大小16,加载因子0.75,当占用了 16*0.75 即 12时,进行一次扩容,扩容翻倍16*2
4.讲一下volatile,以及什么时候使用?补充:synchronized方法和方法体?
把代码块声明为 synchronized,有两个重要后果,通常是指该代码具有 原子性(atomicity)和 可见性(visibility)。
原子性意味着这个时刻,只有一个线程能够执行一段代码,这段代码通过一个monitor object保护。从而防止多个线程在更新共享状态时相互冲突。( i++ 不是原子性操作)
可见性则更为微妙,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。 —— 如果没有同步机制提供的这种可见性保证,线程看到的共享变量可能是修改前的值或不一致的值,这将引发许多严重问题,如脏读。
Volatile 变量具有 synchronized
的可见性、指令有序性特性,但是不具备原子性
使用场景:
1.作为状态标志
2.多个线程读一个线程写,保证了可见性,写完立即可以被读取到
5.字节流已经可以读取文件了,为什么要用字符流?
不同文件的编码格式不同,操作系统通过字符流对字节码格式的封装,从而使用字符流不需要担心编码格式
----------------------------------------
6.StringBuffer的扩容?(腾讯)
空构造默认是16,字符串构造是字符串长度+16
扩容:将新容量扩为大小变成 2倍+2 if 判断一下 容量如果不够,直接扩充到需要的容量大小。
7.为什么集合类没有实现Cloneable和Serializable接口?
克隆(cloning)或者序列化(serialization)的语义和含义是跟具体的实现相关的。因此应该由集合类的具体实现类来决定如何被克隆或者序列化
8.Iterator和ListIterator的区别
1.ListIterator只能用于List,Iterator用于List和Set
2.Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法。
3. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
4. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
9.同步方法和同步代码块的区别?
同步方法默认用this或者当前类class对象作为锁;
同步代码块可以选择以什么来加锁,比同步方法要更细颗粒度,我们可以选择只发生同步问题的部分代码而不是整个方法;
同步方法使用关键字 synchronized修饰方法,而同步代码块主要是修饰需要进行同步的代码,用 synchronized(object){代码内容}进行修饰;
为何使用同步?
java允许多线程并发控制,当多个线程同时操作一个可共享的资源变量时(增删改查),将会导致数据的不准确,相互之间产生冲突。类似于在atm取钱,银行数据确没有变,这是不行的,要存在于一个事务中。因此加入了同步锁,以避免在该线程没有结束前,调用其他线程。从而保证了变量的唯一性,准确性。
同步是一种高开销的操作,因此应该尽量减少同步的内容。通常没有必要同步整个方法,使用synchronized代码块同步关键代码即可。
10.如何确保N个线程可以访问N个资源同时又不导致死锁
指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。(破坏了循环等待条件)
产生死锁的4个必要条件:互斥、不可抢占、请求保持、循环等待
11.在监视器(Monitor)内部,是如何做线程同步的?程序应该做哪种级别的同步?
在 java 虚拟机中, 每个对象( Object 和 class )通过某种逻辑关联监视器,每个监视器和一个对象引用相关联, 为了实现监视器的互斥功能, 每个对象都关联着一把锁.,一旦方法或者代码块被 synchronized 修饰, 那么这个部分就放入了监视器的监视区域, 确保一次只能有一个线程执行该部分的代码, 线程在获取锁之前不允许执行该部分的代码,另外 java 还提供了显式监视器( Lock )和隐式监视器( synchronized )两种锁方案
二、操作系统
阿里一面:
1.线程进程区别?有了进程了为什么还要用线程?线程使用场景?
区别:
- 地址空间:同一进程的线程共享本进程的地址空间,而进程之间则是独立的地址空间。
- 资源拥有:进程拥有系统资源,线程不拥有(有一点必要的),但是可以访问进程的资源。同一进程内的线程共享本进程的资源如内存、I/O、cpu等,但是进程之间的资源是独立的。
- CPU方面(系统开销):在进行进程切换时,涉及当前执行进程 CPU 环境的保存及新调度进程 CPU 环境的设置,而线程切换时只需保存和设置少量寄存器内容,开销很小。
为什么要用线程:
每个进程都有自己的地址空间,即进程空间,在网络或多用户换机下,一个服务器通常需要接收大量不确定数量用户的并发请求,为每一个请求都创建一个进程显然行不通(系统开销大响应用户请求效率低),因此操作系统中线程概念被引进。
进程、线程使用场景:
对资源的管理和保护要求高,不限制开销和效率时,使用多进程。
要求效率高,频繁切换时,资源的保护管理要求不是很高时,使用多线程。
2.什么是管道?管道如何进行通信?不同主机的进程用哪种方式来通讯?(补充:各种通信方法的使用场景)
不同主机如何通信:Socket
匿名管道:半双工通信,本质上是内核的一块缓冲区,面向字节流传输数据。在进程调用fork之后,通过fd[0]读,fd[1]写来进行通信,和文件操作的api一样,用于兄弟/父子进程间的通信
命名管道:相比匿名管道可以任意进程间通信
消息队列:消息的链接表 ,存放在内核中并由消息队列标识符标识。全双工通信,可读可写(可以发送数据,也可以接受数据)
内存共享:进程间最快通信,直接申请一块物理内存通过页表映射到虚拟地址空间中,操作虚拟地址空间,其实是操作同一块物理内存区域,因此进行数据传输时相较于其他通信方式
信号量:一个计数器,用于为多个进程提供共享数据对象的访问。进程间通信方式之一,用于实现进程间的同步与互斥,PV操作
同步:保证对临界资源访问的时序可控性(保证有序);
互斥:对临界资源同一时间的唯一访问性(保证安全)。
Socket:不同主机间进程通信
-------------------------------
3.用户态和内核态
系统态(也称为管态或核心态),操作系统在系统态运行——运行操作系统程序
用户态(也称为目态),应用程序只能在用户态运行——运行用户程序
三、网络
四、MySQL
持续中...
博主学识有限,如有错误之处,还望各位指出