# 阿里巴巴面试题

整理的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;
    }
}
1
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());
    }
}
1
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();
        }
    }
}
1
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");
    }
}
1
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
1
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服务器至少能实现getheadpost方法,其他都是可选的

# 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
  • 应用层 应用层负责处理特定的应用程序细节