下面要给大家分享一个阿里Java开发面经,里面包含了具体的问题,以及相关回答,主要包括了数据库、操作系统、项目相关、java基础、数据结构、计算机网络等内容。
一、数据库
1、为什么在项目中用MongoDB?
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案.......。
2、nosql和关系型数据库的区别是什么?
(1)存储方式
关系型数据库是表格式的,因此存储在表的行和列中。而Nosql数据库则与其相反,他是大块的组合在一起。
(2)存储结构
关系型数据库对应的是结构化数据,数据表都预先定义了结构(列的定义),结构描述了数据的形式和内容。而Nosql数据库基于动态结构,使用与非结构化数据。
(3)存储规范
关系型数据库的数据存储为了更高的规范性,把数据分割为最小的关系表以避免重复,获得精简的空间利用。而Nosql数据存储在平面数据集中,数据经常可能会重复。
(4)存储扩展
这可能是两者之间最大的区别,关系型数据库是纵向扩展,也就是说想要提高处理能力,要使用速度更快的计算机。而Nosql数据库是横向扩展的,它的存储天然就是分布式的,可以通过给资源池添加更多的普通数据库服务器来分担负载.......。
3、对于redis你了解多少?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API......。
4、mysql索引
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度......。
二、操作系统
1、中断的处理流程是怎样的?
中断处理过程 都要经历以下步骤: 请求中断→响应中断→关闭中断→保留断点→中断源识别→保护现场→中断服务子程序→恢复现场→中断返回。
2、死锁的四个必要条件是什么?
互斥条件、不可剥夺条件、请求与保持条件、循环等待条件。
3、进程通信方式是怎样的?
(1)管道:速度慢,容量有限,只有父子进程能通讯
(2)FIFO:任何进程间都能通讯,但速度慢
(3)消息队列:容量受到系统限制,且要注意第一次读的时候,要考虑上一次没有读完数据的问题
(4)信号量:不能传递复杂消息,只能用来同步
(5)共享内存区:能够很容易控制容量,速度快,但要保持同步,比如一个进程在写的时候,另一个进程要注意读写的问题,相当于线程中的线程安全,当然,共享内存区同样可以用作线程间通讯,不过没这个必要,线程间本来就已经共享了同一进程内的一块内存
4、进程与线程的区别与联系又是什么?
进程和线程都是一个时间段的描述,是CPU工作时间段的描述,不过是颗粒大小不同....。
三、项目相关
1、在项目中的职责是什么?
2、机器学习比赛中的模型设计、参数调优过程详细地解释一下。
3、目前项目的使用情况如何?
4、你认为的项目最大难点在哪里,有什么收获?
5、系统有哪些模块,怎么去优化系统性能?
四、java基础
1、线程池的参数有哪些,怎样设置?
corePoolSize核心线程数,指保留的线程池大小(不超过maximumPoolSize值时,线程池中最多有corePoolSize 个线程工作)。
maximumPoolSize指的是线程池的最大大小(线程池中最大有corePoolSize个线程可运行)。
keepAliveTime指的是空闲线程结束的超时时间(当一个线程不工作时,过keepAliveTime 长时间将停止该线程)。
unit是一个枚举,表示keepAliveTime的单位(有NANOSECONDS, MICROSECONDS, MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS,7个可选值)。
workQueue表示存放任务的队列(存放需要被线程池执行的线程队列)。
handler拒绝策略(添加任务失败后如何处理该任务)
.......。
2、 java中多线程同步的方式有哪些?
使用synchronized关键字、wait和notify、使用特殊域变量volatile实现线程同步、使用重入锁实现线程同步、使用局部变量来实现线程同步、使用阻塞队列实现线程同步、使用原子变量实现线程同步。
3、 java中有哪些以队列、链表为底层实现的数据结构?
4、hashMap的put流程是怎样的?
hash(key),取key的hashcode进行高位运算,返回hash值
如果hash数组为空,直接resize()
对hash进行取模运算计算,得到key-value在数组中的存储位置i
如果是红黑树,则判断TreeNode是否已存在,如果存在则直接返回oldnode并更新;不存在则直接插入红黑树,++size,超出threshold容量就扩容
如果是链表,则判断Node是否已存在,如果存在则直接返回oldnode并更新;不存在则直接插入链表尾部,判断链表长度,如果大于8则转为红黑树存储,++size,超出threshold容量就扩容
5、 jvm运行时数据区
6、java的垃圾回收机制
在平时的开发当中,有时候我们需要创建大量的对象,如果我们动态创建的对象没有得到及时回收,持续堆积,最后会导致内存被占满,造成溢出。因此Java 提供了一种垃圾回收机制,在后台创建一个守护进程。该进程会在内存紧张的时候自动跳出来,把内存的垃圾全部进行回收,从而保证程序的正常运行.....。
7、 Error和Exception的区别(举例)
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢等抄。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建百议让程序终止。
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意度终止异常.....。
8、值传递和引用传递
9、重载和重写的定义和区别是什么?
重载:表示在同一个作用域内,具有相同名字的函数,它们返回值相同,但参数列表个数不同(类型不同or个数不同)
重写:表示在不同类中(A,B类中,A属于基类,B属于子类)重写的前提条件是B必须继承基类AB想要使用基类A中的某个函数,但函数中功能有些改变,那么在继承了基类A后,可以在B类中用定义相同函数名,其中返回值,参数列表中类型个数必须相同,若不同则属于不同方法中的重载。
区别:重载的作用是对于不同类型,不同操作数欲实现类似操作的函数定义
重写的作用是对于某一个父类函数,子类欲在其自己类中继承不同操作的同一函数
10、创建线程的方式有哪些?
继承Thread类创建线程、实现Runnable接口创建线程、使用Callable和Future创建线程、使用线程池例如用Executor框架。
五、数据结构
1、详细解释数组和链表、队列和栈的区别?
数组是最最基本的数据结构,很多语言都内置支持数组。
链表是在非连续的内存单元中保存数据,并且通过指针将各个内存单元链接在一起,最有一个节点的指针指向NULL。链表不需要提前分配固定大小存储空间,当需要存储数据的时候分配一块内存并将这块内存插入链表中。
堆栈实现了一种后进先出的语义(LIFO)。可以使用数组或者是链表来实现它。对于堆栈中的数据的所有操作都是在栈的顶部完成的,只可以查看栈顶部的数据,只能够向栈的顶部压入数据,也只能从栈的顶部弹出数据。
队列实现了先入先出的语义(FIFO)。队列也可以使用数组和链表来实现。队列只允许在队尾添加数据,在队头删除数据。但是可以查看队头和队尾的数据。还有一种是双端队列,在两端都可以插入和删除。
2、栈的实际应用举例
3、快速排序和选择排序的原理以及时间空间复杂度
4、哪些排序算法是稳定及不稳定的?为什么不稳定?
六、计算机网络
1、TCP怎样保障可靠性?
TCP协议保证传输可靠的方法主要有:校验和,序列号,确认应答,超时重传,连接管理,流量控制,拥塞控制。
2、解释下你对TCP/IP协议的理解?
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC 793定义。
IP(Internet Protocol)协议,又称网际协议,它负责Internet上网络之间的通信,并规定了将数据从一个网络传输到另一个网络应遵循的规则,是TCP/IP协议的核心。
3、TCP、UDP的区别及各自的优缺点?
区别:
TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
TCP首部开销20字节;UDP的首部开销小,只有8个字节
TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道
优缺点:
TCP的优点: 可靠,稳定
TCP的缺点: 慢,效率低,占用系统资源高,易被攻击
UDP的优点: 快,比TCP稍安全
UDP的缺点: 不可靠,不稳定
4、TCP三次握手、四次挥手的原理,以及为什么三次和四次?
以上就是阿里Java开发面经分享啦,更多java面经,请继续关注本站了解。