阿里研发面试总结

1、             数据库范式

a)      1NF:属性不可分割成更小部分

b)     2NF:每个非主属性完全依赖于R的某个候选集

c)      3NF:非主属性不传递依赖R的候选集

d)     BCNF:每个属性不传递依赖R的候选集

2、             垃圾收集

Java使用垃圾收集器的技术监视Java程序,当对象不再使用的时候,就自动释放对象所使用的内存。垃圾收集器是自动运行的,一般情况下无须显示的请求垃圾收集器,程序运行时,垃圾收集器会不时检查对象的各个引用,并回收无引用对象所占的内存。可以使用静态方法gc进行垃圾回收,但不能保证立即回收。(引用为0的时候就是标记,引用次数。)

3、             抽象方法不能被那些关键字修饰

   final,private,static,protected(无法访问)

4、             堆栈区别

  堆是运行时数据区,类的对象从中分配空间,不需要程序员显式的释放,堆有垃圾回收负责。优势可以动态分布。缺点运行时分配内存,存取速度慢。

栈的优势存取速度比堆快,数据可以共存,但缺乏灵活性。栈中只能存放一些基本的数据类型变量

5、             Hasptable和hashmap区别

   Hashmap没有分类或排序,允许键值为null

Hashtabl不允许键值为空,是同步的,执行速度比较慢

Hashtable的方法是synchronize,而hashmap不是,因此多线程要用hashtable

6、             Hashmap如何实现同步的

Hashtable中的方法是同步的,而HashMap中的方法在缺省情况下是非同步的。即是说,在多线程应用程序中,不用专门的操作就安全地可以使用Hashtable了;而对于HashMap,则需要额外的同步机制。但HashMap的同步问题可通过Collections的一个静态方法得到解决:

Map Collections.synchronizedMap(Map m)

这个方法返回一个同步的Map,这个Map封装了底层的HashMap的所有方法,使得底层的HashMap即使是在多线程的环境中也是安全的。

7、             Hashmap如何实现

一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。

从上图中可以看出,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组。Table的每一项是Entry。

Entry就是数组中的元素,每个 Map.Entry 其实就是一个key-value对,它持有一个指向下一个元素的引用,这就构成了链表。

当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。

8、             Wait和sleep方法

sleep来自Thread类,和wait来自Object类

sleep是Thread的静态类方法,谁调用的谁去睡觉,即使在a线程里调用了b的sleep方法,实际上还是a去睡觉,要让b线程睡觉要在b的代码中调用sleep

最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。

sleep不出让系统资源;wait是进入线程等待池等待,出让系统资源,其他线程可以占用CPU。一般wait不会加时间限制,因为如果wait线程的运行资源不够,再出来也没用,要等待其他线程调用notify/notifyAll唤醒等待池中的所有线程,才会进入就绪队列等待OS分配系统资源。sleep(milliseconds)可以用时间指定使它自动唤醒过来,如果时间不到只能调用interrupt()强行打断。

Thread.Sleep(0)的作用是“触发操作系统立刻重新进行一次CPU竞争”。

使用范围:wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在任何地方使用

  synchronized(x){

      x.notify()

     //或者wait()

   }

sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

9、             Synchronized同步的方法

1  wait方法:

        该方法属于Object的方法,wait方法的作用是使得当前调用wait方法所在部分(代码块)的线程停止执行,并释放当前获得的调用wait所在的代码块的锁,并在其他线程调用notify或者notifyAll方法时恢复到竞争锁状态(一旦获得锁就恢复执行)。

        调用wait方法需要注意几点:

        第一点:wait被调用的时候必须在拥有锁(即synchronized修饰的)的代码块中。

        第二点:恢复执行后,从wait的下一条语句开始执行,因而wait方法总是应当在while循环中调用,以免出现恢复执行后继续执行的条件不满足却继续执行的情况。

        第三点:若wait方法参数中带时间,则除了notify和notifyAll被调用能激活处于wait状态(等待状态)的线程进入锁竞争外,在其他线程中interrupt它或者参数时间到了之后,该线程也将被激活到竞争状态。

        第四点:wait方法被调用的线程必须获得之前执行到wait时释放掉的锁重新获得才能够恢复执行。

 

2  notify方法和notifyAll方法:

        notify方法通知调用了wait方法,但是尚未激活的一个线程进入线程调度队列(即进入锁竞争),注意不是立即执行。并且具体是哪一个线程不能保证。另外一点就是被唤醒的这个线程一定是在等待wait所释放的锁。

       notifyAll方法则唤醒所有调用了wait方法,尚未激活的进程进入竞争队列。

 

3 synchronized关键字:

        第一点:synchronized用来标识一个普通方法时,表示一个线程要执行该方法,必须取得该方法所在的对象的锁。

        第二点:synchronized用来标识一个静态方法时,表示一个线程要执行该方法,必须获得该方法所在的类的类锁。

        第三点:synchronized修饰一个代码块。类似这样:synchronized(obj) { //code.... }。表示一个线程要执行该代码块,必须获得obj的锁。这样做的目的是减小锁的粒度,保证当不同块所需的锁不冲突时不用对整个对象加锁。利用零长度的byte数组对象做obj非常经济。

 

10、        Session和cookie

11、        http1.0和http1.1

HTTP 1.0 规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个 TCP 连接,服务器完成请求处理后立即断开 TCP 连接,服务器不跟踪每个客户也不记录过去的请求。

HTTP 1.1 支持持久连接,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建立和关闭连接的消耗和延迟

HTTP 1.1 还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。

HTTP 1.0 不支持 Host 请求头字段

HTTP 1.1 中增加 Host 请求头字段后, WEB 浏览器可以使用主机头名来明确表示要访问服务器上的哪个 WEB 站点,这才实现了在一台 WEB 服务器上可以在同一个 IP 地址和端口号上使用不同的主机名来创建多个虚拟 WEB 站点。

HTTP 1.1 还提供了与身份认证、状态管理和 Cache 缓存等机制相关的请求头和响应头 。

12、        项目难点

13、        系统架构

14、        数据库设计

15、        3个词形容自己的优缺点

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值