阿里菜鸟内推一面+部分参考理解

时间: 47分23秒
个人开启了手机通话录音, 所以能清楚地写出这些问题!(最好也把这个功能打开, 事后可以总结呀!)
1. 自我介绍
2. 在学校里和实习公司里做项目用的什么技术
JSP 前后端分离(json) SpringBoot Vue 方便接口测试

Java基础
3. Java读取一个文件, 有哪些方法, 考虑性能, 用哪一个类(带缓冲的类, BufferedInputStream) 装饰者模式
BIO: 四大抽象类 + 一个File类 + 一个接口 Serializeable
大的方面: 两种
1、按字节读取文件内容 (常用于读二进制文件,如图片、声音、影像等文件)
FileInputStream read()
2、按字符读取文件内容 (常用于读文本,数字等类型的文件)
reader = new InputStreamReader(new FileInputStream(file));
3、按行读取文件内容 (以行为单位读取文件,常用于读面向行的格式化文件)

reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            int line = 1;
            // 一次读入一行,直到读入null为文件结束
            while ((tempString = reader.readLine()) != null) {
                // 显示行号
                System.out.println("line " + line + ": " + tempString);
                line++;
            }
            reader.close();
  1. BIO, NIO, AIO区别
    同步阻塞的BIO、同步非阻塞的NIO、异步非阻塞的AIO
    BIO是一个连接一个线程。
    NIO是一个请求一个线程。
    AIO是一个有效请求一个线程

阻塞和非阻塞关注的是程序在等待调用结果(消息,返回值)时的状态.

BIO (Blocking I/O):同步阻塞I/O模式,数据的读取写入必须阻塞在一个线程内等待其完成。这里使用那个经典的烧开水例子,这里假设一个烧开水的场景,有一排水壶在烧开水,BIO的工作模式就是, 叫一个线程停留在一个水壶那,直到这个水壶烧开,才去处理下一个水壶。但是实际上线程在等待水壶烧开的时间段什么都没有做。
对服务器资源要求比较高,并发局限于应用中
NIO (New I/O):同时支持阻塞与非阻塞模式,但这里我们以其同步非阻塞I/O模式来说明,那么什么叫做同步非阻塞?如果还拿烧开水来说,NIO的做法是叫一个线程不断的轮询每个水壶的状态,看看是否有水壶的状态发生了改变,从而进行下一步的操作。
连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中
AIO ( Asynchronous I/O):异步非阻塞I/O模型。异步非阻塞与同步非阻塞的区别在哪里?异步非阻塞无需一个线程去轮询所有IO操作的状态改变,在相应的状态改变后,系统会通知对应的线程来处理。对应到烧开水中就是,为每个水壶上面装了一个开关,水烧开之后,水壶会自动通知我水烧开了。
连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作

5. NIO的组件, Selector (这个忘记了, 一脸懵逼!)
三大组件: Channel Buffer Selector
基于块(Block)的,它以块为处理数据的基本单位
为所有的原始类型提供(Buffer)缓存支持
增加通道(Channel)对象,作为新的原始 I/O 抽象
提供了基于Selector的异步网络I/O

selector是一个选择器,它可以选择某一个Channel,然后做些事情。
一个线程可以对应一个selector,而一个selector可以轮询多个Channel,而每个Channel对应了一个Socket。
与上面一个线程对应一个Socket相比,使用NIO后,一个线程可以轮询多个Socket。
Selector(选择器)是Java NIO中能够检测到一到多个NIO通道,并能够知道通道是否为读写事件做好准备
https://juejin.im/entry/598da7d16fb9a03c42431ed3
http://www.importnew.com/21341.html
https://blog.csdn.net/yhl_jxy/article/details/79332092

6. 什么是序列化, IO的序列化方式, 为什么需要序列化(包括在网络传输的情况下)
将对象的状态信息转换为可以存储或传输的形式的过程(二进制形式(字节数组))
ObjectOutputStream的writeObject方法把一个对象进行持久化
XML JSON
网络传输、数据持久化
7. Error和Exception区别
8. RuntimeException和非RuntimeException区别
9. 什么叫线程安全, 保证线程安全的方法
10. 加锁的方式, synchronized作用在方法上和代码块区别
11. synchronized(this)和synchronized(Xx.class)区别

Web方面:
12. Spring AOP实现原理
13. 一个页面, 一个提交按钮, 如何防止重复提交, 我说验证码, 还有其它方式吗?
a. 表单提交后,redirect到一个倒计时页面,或者弹出信息提示页面,等有成功信息返回后,再跳转回之前页面。
b. js中设置标记变量来判断
14. ajax实现跨域请求(前端或者后台实现方法)
前端
添加响应头,允许跨域

  addHeader(‘Access-Control-Allow-Origin:*’);//允许所有来源访问 
  addHeader(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式

后台:
web.xml 添加

<!--跨域访问过滤器 -->
<filter>
<filter-name>accessControl</filter-name>
<filter-class>org.lxy.filter.AccessControlAllowOriginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>accessControl</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

15. cookie和session区别 (单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie)
16. forward和redirect区别 (页面URL的变化)

数据库(这个全程被怼, 看来这个要好好复习了):
这里还有几个问题, 没听清楚, 所以就没写了!
17. 你建过索引吗? 建索引的原则
1,确定针对该表的操作是大量的查询操作还是大量的增删改操作。
2,尝试建立索引来帮助特定的查询。检查自己的sql语句,为那些频繁在where子句中出现的字段建立索引,
在SQL语句中经常进行GROUP BY、ORDER BY的字段上建立索引。
3,尝试建立复合索引来进一步提高系统性能。修改复合索引将消耗更长时间,同时,复合索引也占磁盘空间。
4,对于小型的表,建立索引可能会影响性能
5,应该避免对具有较少值的字段进行索引。
6,避免选择大型数据类型的列作为索引。
7. 在经常用作过滤器的字段上建立索引;
8. 在不同值较少的字段上不必要建立索引,如性别字段;
9. 用于联接的列(主健/外健)上建立索引;
https://www.cnblogs.com/garfieldcgf/p/6378690.html
18. 索引的类型, 如主键索引
Mysql共支持五种索引类型:

PRIMARY KEY 主键索引
INDEX 普通索引
UNIQUE 唯一索引
FULLTEXT 全文索引
组合索引(较特殊)
https://www.cnblogs.com/cq-home/p/3482101.html
https://blog.csdn.net/xluren/article/details/32746183
19. 查看SQL执行计划
EXPALIN
20. 有十万条数据, 写SQL语句查询其中某字段较大值的几条数据
给ORDER BY 字段建立索引
SELECT id FROM person order by id limit 0, 10;
# 0.002s
# 0.05s

CREATE index index_person on person(id);
DROP index index_person on person;

  1. 子查询与关联查询的区别
    MSDN对子查询的定义是这样的:
    可以将一个查询的结果用作另一个查询的输入。
    https://blog.csdn.net/luckarecs/article/details/7165472
    子查询sql语句:select lo,la from track where lid in (select lid from line where lname like ‘%lname%’);
    关联查询sql语句:select lo,la from track,line where line.lname like ‘%lname%’ and line.lid=track.lid;
    子查询运行时间为5分48秒;而关联查询耗时不足一秒。事实胜于雄辩,关联查询的优势不言而喻。

JVM
22. 你用过的JVM命令有哪些
jps 一个显示当前所有java进程pid的命令
jstack [ option ] pid
当前java虚拟机内每一条线程正在执行的方法堆栈的集合; 线程间死锁、死循环、请求外部资源导致的长时间等待等
jconsole: (jvisualVM)
一个java GUI监视工具,可以以图表化的形式显示各种数据。并可通过远程连接监视远程的服务器VM
可以看到内存、线程、类及CPU使用的一些情况

  1. 如果一个程序发生OOM, 该怎么处理
    要dump堆的内存镜像,可以采用如下两种方式:
    设置JVM参数-XX:+HeapDumpOnOutOfMemoryError,设定当发生OOM时自动dump出堆信息。不过该方法需要JDK5以上版本。
    使用JDK自带的jmap命令。”jmap -dump:format=b,file=heap.bin ” 其中pid可以通过jps获取。
    jhat:JDK自带的java heap analyze tool,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等
    https://blog.csdn.net/zy512638348/article/details/79471880

  2. Java 类加载机制
    类加载的过程包括了加载、验证、准备、解析、初始化五个阶段
    验证的目的是为了确保Class文件中的字节流包含的信息符合当前虚拟机的要求,而且不会危害虚拟机自身的安全。不同的虚拟机对类验证的实现可能会有所不同,但大致都会完成以下四个阶段的验证:文件格式的验证、元数据的验证、字节码验证和符号引用验证。

准备
准备阶段是正式为类变量分配内存并设置类变量初始值的阶段,这些内存都将在方法区中分配。
进行内存分配的仅包括类变量(static)
实例变量会在对象实例化时随着对象一块分配在Java堆中
我们可以理解为static final常量在编译期就将其结果放入了调用它的类的常量池中

解析
解析阶段是虚拟机将常量池中的符号引用转化为直接引用的过程。

初始化
所以把value赋值为3的动作将在初始化阶段才会执行
https://blog.csdn.net/ns_code/article/details/17881581

  1. 为什么使用双亲委派模型
    加载用到了类加载器
    而是使用组合关系来复用父加载器中的代码

类随着它的类加载器一起具备了一种带有优先级的层次关系

  1. JVM内存模型
    Java线程之间的通信采用的是通过共享内存模型
    线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),
    本地内存中存储了该线程以读/写共享变量的副本。

https://blog.csdn.net/suifeng3051/article/details/52611310

  1. JDK7与JDK8的JVM内存模型区别 (内存区域的变化)
    JVM 内存共分为虚拟机栈(栈帧)、堆(堆内存是 JVM 所有线程共享的部分)、方法区
    (方法区也是所有线程共享。主要用于存储类的信息、常量池、方法数据、方法代码等)。方法区逻辑上属于堆的一部分,但是为了与堆进行区分,通常又叫“非堆”
    、程序计数器(每个线程都有自己的程序计数器, 当前执行的是 JVM 的方法,则该寄存器中保存当前执行指令的地址)、
    本地方法栈(与虚拟机用到的 Native 方法相关)五个部分

JDK 8 中永久代向元空间的转换
方法区与永久代的区别?
方法区只是JVM规范定义,而永久代为具体的实现,元空间也是方法区在jdk1.8中的一种实现。
为什么废除永久代?

网络:
28. HTTP1.0与HTTP1.1区别
HTTP 1.0需要使用keep-alive参数来告知服务器端要建立一个长连接,而HTTP1.1默认支持长连接
节约带宽
在http1.1中新增了一个Host头
Host的存在就是为了实现虚拟WEB服务器,我的理解就是实现负载均衡
https://blog.csdn.net/linsongbin1/article/details/54980801

  1. TCP与UDP区别
    1、TCP面向连接(如打电话要先拨号建立连接); UDP是无连接的,即发送数据之前不需要建立连接
    2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;
    UDP尽最大努力交付,即不保证可靠交付
    3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;
    UDP是面向报文的
    UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
    4、每一条TCP连接只能是点到点的; UDP支持一对一,一对多,多对一和多对多的交互通信
    5、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

最后
30. 你有哪些问题要问我的?
三个经典问题: 算法学习, 职业发展(如技术专家, 架构师, 产品经理), 实习困惑(天天CRUD, 技术得不到提升怎么办?)

个人总结:
1. 当时下午正在实习, 突然接到了杭州的电话, 话说阿里真效率, 应该是前天投的简历;
2. 问的都比较基础, 有好多问题, 我之前都复习过了, 没想到这么快就忘记了, 归根到底是没有深入理解其本质;
3. 事后发现自己回答地太快了, 有些东西没有说清楚, 估计是有点紧张啊;
4. 当时上海这边风真大, 有几个问题, 问了两遍, 硬是没有听清楚, 最后尴尬而不失礼貌地说了句”不知道”.

接下来, 好好复习, 继续总结, 加油!

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值