记面试中知识疑惑点

来源:互联网 发布:新东方网络视频哪里买 编辑:程序博客网 时间:2024/04/26 00:43

  1. Http协议与TCP协议
  Http协议是应用层协议,基于TCP协议实现。
  与TCP不同的是:Http是一个无状态的协议,其遵循请求应答模型,由客户端发起请求,然后服务器回应请求。每一个请求应答称为一个事务。无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。从另一方面讲,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。
  无状态的优缺点:
  优点:服务器不用为每个客户端连接分配内存来记忆大量状态,也不用在客户端失去连接时去清理内存,以更高效地去处理WEB业务。
  缺点:客户端的每次请求都需要携带相应参数,服务器需要处理这些参数。
  
  对于Connection:keep-alive的理解:在老的Http版本中,每个请求都将被创建一个新的客户端->服务器的连接,在这个连接上发送请求,然后接收请求。意味着每次请求服务器响应后即关闭连接。这种模式的优点是,它很简单,很容易理解和编程实现;缺点就是效率很低。因此Keep-Alive被提出用来解决效率低的问题
  HTTP/1.0
  在HTTP/1.0版本中,并没有官方的标准来规定Keep-Alive如何工作,因此实际上它是被附加到HTTP/1.0协议上,如果客户端浏览器支持Keep-Alive,那么就在HTTP请求头中添加一个字段 Connection: Keep-Alive,当服务器收到附带有Connection: Keep-Alive的请求时,它也会在响应头中添加一个同样的字段来使用Keep-Alive。这样一来,客户端和服务器之间的HTTP连接就会被保持,不会断开(超过Keep-Alive规定的时间,意外断电等情况除外),当客户端发送另外一个请求时,就使用这条已经建立的连接。
  HTTP/1.1
  在HTTP/1.1版本中,官方规定的Keep-Alive使用标准和在HTTP/1.0版本中有些不同,默认情况下所在HTTP1.1中所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection: Close,这也就是为什么Connection: Keep-Alive字段再没有意义的原因。
  Keep-Alive也不能保证客户端和服务器之间的连接一定是活跃的,唯一能保证的就是当连接被关闭时你能得到一个通知
  HTTP是一个无状态协议,这意味着每个请求都是独立的,Keep-Alive没能改变这个结果。
  
  客户机发起一次请求的时候:
  客户机会将请求封装成 http数据包–>封装成Tcp数据包–>封装成Ip数据包—>封装成数据帧—>硬件将帧数据转换成bit流(二进制数据)–>最后通过物理硬件(网卡芯片)发送到指定地点。
  服务器硬件首先收到bit流……. 然后转换成ip数据包。于是通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。

  2. 如何解决使用表单传输账号密码被窃取的危险
  这里就涉及到了HTTPS实现原理 。HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版。即HTTP下加入SSL层,HTTPS的安全基础是SSL。其所用的端口号是443。

SSL:安全套接层,是netscape公司设计的主要用于web的安全传输协议。这种协议在WEB上获得了广泛的应用。通过证书认证来确保客户端和网站服务器之间的通信数据是加密安全的。

  参考文章:http://www.cnblogs.com/softidea/p/4949589.html

这里写图片描述

图片来源
  

  3. Java中sleep()和wait()方法区别
  ① sleep()是Thread类的方法,而wait()是Object类的方法。
  ② sleep()方法需指定睡眠时间,wait()可指定也可不指定。
  ③ sleep()方法不会释放锁,而wait()方法会暂时释放锁。暂时释放后如何收回呢?第一种情况:wait()设置等待时间,当这个时间过后自动唤醒。第二种:未设置等待时间,其它线程对象调用notify()/notifyAll()方法唤醒。注意在第一种情况下,如果在设置时间前“用完锁”,则立即收回。
  ④ wait()方法只能是在同步块/方法中使用。
  
  Java中每一个对象均有一个锁来控制同步访问。那么当一个线程进入一个对象的一个synchronized方法(获取此对象锁)后,其他线程是否可以进入此对象的其他方法
  1. 其他方法前是否加了synchronized关键字,如果没加,则能。
  2. 如果这个方法内部调用了wait,则可以进入其他synchronized方法。因为执行完wait之后,释放了锁。
  3. 如果其他的方法都加了synchronized关键字,并且内部没有调用wait,则不能。
  4. 如果其他方法是static,它用的同步锁是当前类的字节码.class,与非静态的方法不能同步,因为非静态的方法用的同步锁是this。

  4. Java中的强引用、软引用、弱引用和虚引用
   Java使用的HotSpot虚拟机采用的是可达性分析算法来判断对象是否可回收。不采用引用计数算法的原因是,该方法很难解决循环引用的问题。
   采用可达性分析算法,那么确定“根节点”就很重要了,Java虚拟机规范确定了以下四个可作为GC root的对象:
   ① 虚拟机栈的栈帧中本地向量表中引用的对象。
   ② 类静态属性引用的对象。
   ③ 方法区中常量引用的对象。
   ④ 本地方法栈中引用的对象。
   无论是引用计数还是可达性分析都是通过引用来判断对象是否可回收,Java定义了四种引用类型。
    强引用:

StringBuffer buffer = new StringBuffer();

   虚拟机不会去回收通过强引用可达的对象,但是这也造成了如果内存中大量Bitmap对象是以强引用形式存在的话,很容易造成内存溢出。
   
    软引用:

SoftReference<Drawable> softReference = mImageCache.get(imageUrl);

   软引用所指向的对象是在内存溢出之前回收。
   
    弱引用:

WeakReference<Widget> weakWidget = new WeakReference<Widget>(widget); 

   弱引用只会生存一个“回收期”,即在下一次内存回收时,无论内存是否充足都会回收其指向对象。
   
    虚引用:

ReferenceQueue queue = new ReferenceQueue ();PhantomReference pr = new PhantomReference (object, queue);

   虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
   如果一个对象仅持有虚引用,那么它在任何时候都可能被回收。
   无法通过一个虚引用来获取对象实例。为一个对象设置虚引用的唯一目的就是当该对象被回收时收到一个系统通知。
   对象可及性判断:
   ◆单条引用路径可及性判断:在这条路径中,最弱的一个引用决定对象的可及性。
   ◆多条引用路径可及性判断:几条路径中,最强的一条的引用决定对象的可及性。

  判断一个对象是否依旧存活需要经历两次标记:首先进行可达性分析,若无法到达则会被第一次标记,然后进行一次筛选。筛选的条件是是否重写了finalize()方法。如果重写了且未执行过(该方法只会被调用一次)则该对象会被放入一个F-Queue队列中,由一个低优先级(不承诺会等待其执行结束)的线程去执行finalize()方法。

5. BroadcastReceiver杂记
  BroadcastReceiver通过封装一个Binder对象(内部含有Handler+Context+接收类型等信息)来注册到ActivityManagerService中。
  广播处理过程:
  ① ActivityManagerService接收到广播(Intent描述)后,先查找对应的接受者(通过Intent中的Action信息得到),然后将它们添加到广播调度队列中。
  ② 向ActivityManagerService所在线程的消息队列中发送一个消息(类型为BROADCAST_INTENT_MSG)。
  ③ 消息队列处理到该消息时便会去处理相应广播调度队列中的广播。
  ④ 广播到达广播接受者的进程中后,会将其封装成一个消息,挂到主线程消息队列中等待处理,处理时就会调用onReceive()方法。

  注:动态广播接受者的生命周期是跟随Activity的(onResume()中注册,onPause()中注销),故根据Activity生命周期的不同可能会收不到消息。
  
6. 检测单链表成环
  使用两个指针,一个指针一次走一步,一个指针一次走两步,若两个指针相遇,则说明成环了。
  
附:面试不止,本文更新不断。加油↖(^ω^)↗

2 0