# 阿里巴巴面试题
整理的70道阿里的Java面试题,都来挑战一下,看看自己有多厉害。 [toc]
# 1、java事件机制包括哪三个部分?分别介绍。
# 事件、事件监听器、事件源。
# 1. 事件。
一般继承自java.util.EventObject
类,封装了事件源对象及跟事件相关的信息。
package cn.qqhxj;
import java.util.EventObject;
/**
* 事件类,用于封装事件源及一些与事件相关的参数.
**/
public class MyEvent extends EventObject {
private static final long serialVersionUID = 1L;
/**
* 事件源
*/
private Object source;
public MyEvent(Object source) {
super(source);
this.source = source;
}
@Override
public Object getSource() {
return source;
}
public void setSource(Object source) {
this.source = source;
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# 2. 事件监听器
实现java.util.EventListener
接口,注册在事件源上,当事件源的属性或状态改变时,取得相应的监听器调用其内部的回调方法。
package cn.qqhxj;
import java.util.EventListener;
/**
* 事件监听器,实现java.util.EventListener接口。定义回调方法,将你想要做的事
* 放到这个方法下,因为事件源发生相应的事件时会调用这个方法。
*/
public class MyEventListener implements EventListener {
/**
* 事件发生后的回调方法
*
* @param e 事件
*/
public void fireCusEvent(MyEvent e) {
MyEventSource Object = (MyEventSource) e.getSource();
System.out.println("My name has been changed!");
System.out.println("The current name is " + Object.getName());
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 3. 事件源
事件发生的地方,由于事件源的某项属性或状态发生了改变(比如BUTTON被单击、TEXTBOX的值发生改变等等)导致某项事件发生。 换句话说就是生成了相应的事件对象。因为事件监听器要注册在事件源上,所以事件源类中应该要有盛装监听器的容器(List,Set等等)。
package cn.qqhxj;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class MyEventSource {
private String name;
/**
* 监听器容器
*/
private Set<MyEventListener> listener;
public MyEventSource() {
this.listener = new HashSet<MyEventListener>();
this.name = "defaultname";
}
/**
* 给事件源注册监听器
*
* @param cel 监听器
*/
public void addCusListener(MyEventListener cel) {
this.listener.add(cel);
}
/**
* 当事件发生时,通知注册在该事件源上的所有监听器做出相应的反应(调用回调方法)
*/
protected void notifies() {
MyEventListener cel = null;
Iterator<MyEventListener> iterator = this.listener.iterator();
while (iterator.hasNext()) {
cel = iterator.next();
cel.fireCusEvent(new MyEvent(this));
}
}
public String getName() {
return name;
}
/**
* 模拟事件触发器
* 当成员变量name的值发生变化时,触发事件。
*
* @param name name
*/
public void setName(String name) {
if (!this.name.equals(name)) {
this.name = name;
notifies();
}
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 测试主函数
package cn.qqhxj;
import cn.qqhxj.MyEvent;
import cn.qqhxj.MyEventListener;
import cn.qqhxj.MyEventSource;
public class Main {
public static void main(String[] args) {
MyEventSource object = new MyEventSource();
//注册监听器
object.addCusListener(new MyEventListener(){
@Override
public void fireCusEvent(MyEvent e) {
super.fireCusEvent(e);
}
});
//触发事件
object.setName("new name");
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 运行结果
My name has been changed!
The current name is new name
2
# 2.为什么要使用线程池?
为了减少创建和销毁线程的次数,让每个线程可以多次使用,可根据系统情况调整执行的线程数量,防止消耗过多内存,所以我们可以使用线程池.
# 3. 线程池有什么作用?
线程池作用就是限制系统中执行线程的数量。 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果;少了浪费了系统资源,多了造成系统拥挤效率不高。 用线程池控制线程数量,其他线程排队等候。一个任务执行完毕,再从队列的中取最前面的任务开始执行。 若队列中没有等待进程,线程池的这一资源处于等待。当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了;否则进入等待队列。
# 4. 说说几种常见的线程池及使用场景。
# 5. 线程池都有哪几种工作队列?
# 6. 怎么理解无界队列和有界队列?
# 7. 线程池中的几种重要的参数及流程说明。
# 8. 什么是反射机制?
# 9. 说说反射机制的作用。
# 10. 反射机制会不会有性能问题?
# 11. 你怎么理解http协议?
# 12. 说说http协议的工作流程。
# 13. http有哪些请求提交方式?
http 的提交方式
提交方式 | 说明 |
---|---|
get | 向特定资源发出请求(请求指定页面信息,并返回实体主体) |
post | 向指定资源提交数据进行处理请求(提交表单、上传文件),又可能导致新的资源的建立或原有资源的修改 |
delete | 请求服务器删除request-URL所标示的资源*(请求服务器删除页面) |
option | 返回服务器针对特定资源所支持的HTML请求方法 或web服务器发送*测试服务器功能(允许客户端查看服务器性能) |
head | 与服务器索与get请求一致的相应,响应体不会返回,获取包含在小消息头中的原信息(与get请求类似,返回的响应中没有具体内容,用于获取报头) |
Trace | 回显服务器收到的请求,用于测试和诊断 |
Connect | HTTP/1.1协议中能够将连接改为管道方式的代理服务器 |
put | 向指定资源位置上上传其最新内容(从客户端向服务器传送的数据取代指定文档的内容) |
http服务器至少能实现get
、head
、post
方法,其他都是可选的
# 14. http中的200,302,403,404,500,503都代表什么状态?
http状态码
状态码 | 说明 |
---|---|
200 | 请求成功 |
301 | 请求的页面已经转到新的URL(永久重定向) |
302 | 请求的页面临时转到新的URL(临时重定向) |
403 | 没有权限访问 (禁止访问) |
404 | 没有找到请求的内容 |
500 | 服务器出现错误 |
503 | 请求未完成,服务器过载 |
# 15. http get和post有什么区别?
区别
- get 请求只包含请求头,请求的参数放在URL上,有长度的限制。
- post 请求不仅包含请求头,还包括请求体,通过request body传递参数。可以传输更多的信息到服务器。
- GET请求会被浏览器主动cache,而POST不会,除非手动设置
- GET请求只能进行url编码,而POST支持多种编码方式。
- GET请求在URL中传送的参数是有长度限制的,而POST么有。
- 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
- GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
- GET在浏览器回退时是无害的,而POST会再次提交请求。
# 16. 你怎么理解cookie和session,有哪些不同点?
- cookie 是在浏览器段,保存用户信息的一种技术,
- session是在服务器端保存用户信息的技术,session的实现要依赖于Cookie技术
# 17. 什么是web缓存?有什么优点?
# 18. 什么是https,说说https的工作原理?
# 19. 什么是http代理服务器,有什么用?
# 20. 什么是虚拟主机及实现原理?
# 21. 什么是Java虚拟机,为什么要使用?
# 22. 说说Java虚拟机的生命周期及体系结构。
# 23. 说一说Java内存区域。
# 24. 什么是分布式系统?
# 25.分布式系统你会考虑哪些方面?
# 26. 讲一讲TCP协议的三次握手和四次挥手流程。
# 27. 为什么TCP建立连接协议是三次握手,而关闭连接却是四次握手呢?为什么不能用两次握手进行连接?
# 28. 为什么TCP TIME_WAIT状态还需要等2MSL后才能返回到CLOSED状态?
# 29. 什么是DoS、DDoS、DRDoS攻击?如何防御?
# 30. 描述一下Java异常层次结构。
# 31. 什么是检查异常,不受检查异常,运行时异常?并分别举例说明。
# 32. finally块一定会执行吗?
- 是的,不管在
try
语句中出现错误
# 33. 正常情况下,当在try块或catch块中遇到return语句时,finally语句块在方法返回之前还是之后被执行?
- 在return 前执行
# 34. try、catch、finally语句块的执行顺序。
首先执行try
语句,如果有错误,就结束执行try
语句,立即执行catch
语句,
最后执行finally
语句的内容。如果在try
或者 catch
语句中
有return
语句在return
语句前执行 finally
语句
# 35. Java虚拟机中,数据类型可以分为哪几类?
# 36. 怎么理解栈、堆?堆中存什么?栈中存什么?
# 37. 为什么要把堆和栈区分出来呢?栈中不是也可以存储数据吗?
38、在Java中,什么是是栈的起始点,同是也是程序的起始点?
39、为什么不把基本类型放堆中呢?
40、Java中的参数传递时传值呢?还是传引用?
41、Java中有没有指针的概念?
42、Java中,栈的大小通过什么参数来设置?
43、一个空Object对象的占多大空间?
44、对象引用类型分为哪几类?
45、讲一讲垃圾回收算法。
46、如何解决内存碎片的问题?
47、如何解决同时存在的对象创建和对象回收问题?
48、讲一讲内存分代及生命周期。
49、什么情况下触发垃圾回收?
50、如何选择合适的垃圾收集算法?
51、JVM中最大堆大小有没有限制?
52、堆大小通过什么参数设置?
53、JVM有哪三种垃圾回收器?
54、吞吐量优先选择什么垃圾回收器?响应时间优先呢?
55、如何进行JVM调优?有哪些方法?
56、如何理解内存泄漏问题?有哪些情况会导致内存泄露?如何解决?
57、从分布式系统部署角度考虑,分哪几层?
58、如何解决业务层的数据访问问题?
59、为了解决数据库服务器的负担,如何做数据库的分布?
60、什么是著名的拜占庭将军问题?
61、为什么说TCP/IP协议是不可靠的?
62、讲讲CAP理念。
63、怎么理解强一致性、单调一致性和最终一致性?
64、分布式系统设计你会考虑哪些策略?
65、最常见的数据分布方式是什么?
66、谈一谈一致性哈希算法。
67、paxos是什么?
68、什么是Lease机制?
69、如何理解选主算法?
# 70. OSI有哪七层模型?TCP/IP是哪四层模型。
OSI
- 物理层 建立、维护、断开物理连接。(由底层网络定义协议)
- 数据链路层 建立逻辑连接、进行硬件地址寻址、差错校验等功能。(由底层网络定义协议)
- 网络层 进行逻辑地址寻址,实现不同网络之间的路径选择。
- 传输层 定义传输数据的协议端口号,以及流控和差错校验。
- 会话层 建立、管理、终止会话。(在五层模型里面已经合并到了应用层)
- 表示层 数据的表示、安全、压缩。(在五层模型里面已经合并到了应用层)
- 应用层 网络服务与最终用户的一个接口。
TCP/IP协议(传输控制协议/互联网协议)不是简单的一个协议,而是一组特别的协议,包括:TCP,IP,UDP,ARP等,
Tcp/IP
- 链路层 链路层有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。
- 网络层 网络层处理分组在网络中的活动,例如分组的选路。
- 传输层 传输层主要为两台主机上的应用程序提供端到端的通信。在TCP/IP协议族中,有两个互不相同的传输协议:
TCP
,UDP
- 应用层 应用层负责处理特定的应用程序细节