Java面试题总结(其一)

2016年03月15日

Java面试题总结(其一)

  • 1、sleep和wait方法的区别
    • 这两个方法来自不同的类分别是Thread和Object
    • 最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
    • wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在 任何地方使用 synchronized(x){ x.notify() //或者wait() }
    • sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常

  • 2、重写equals()时一定要重写hashCode()方法
    • hashcode是用于散列数据的快速存取,如利用HashSet/HashMap/Hashtable类来存储数据时,都是根据存储对象的hashcode值来进行判断是否相同的。
    • 如果我们对一个对象重写了euqals,只要对象的成员变量值相等那么两个对象就相等,但不重写hashcode。例如:String a = “test”; String b = new String(“test”); a.equals(b)为true,但a.hashCode()不等于b.hashCode().
    • 当原对象.equals(新对象)等于true时,两者的hashcode却是不一样的,由此将产生了理解的不一致,如在存储散列集合时(如Set类),将会存储了两个值一样的对象,导致混淆。

  • 解决散列冲突的方法:
    • 开放地址法:开放地执法有一个公式:Hi=(H(key)+di) MOD m i=1,2,…,k(k<=m-1);
    • 再哈希法 :当发生冲突时,使用第二个、第三个、哈希函数计算地址,直到无冲突时。缺点:计算时间增加。
    • 链地址法:将所有关键字为同义词的记录存储在同一线性链表中;
    • 建立一个公共溢出区

  • Java实现多态的两种方式:继承和接口
    • 继承:基于继承的实现机制主要表现在父类和继承该父类的一个或多个子类对某些方法的重写,多个子类对同一方法的重写可以表现出不同的行为。
    • 接口:不同的类通过实现接口并覆盖接口中同一方法;
    • 方法的重写Overriding和重载Overloading是Java多态性的不同表现。重写Overriding是父类与子类之间多态性的一种表现,重载Overloading是一个类中多态性的一种表现。

  • Spring MVC中有哪些注解
    • @Controller负责注册一个bean 到spring 上下文中。
    • @RequestMapping注解为控制器指定可以处理哪些 URL 请求。
    • @ResponseBody该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
    • @RequestParam在处理方法入参处使用 @RequestParam 可以把请求参 数传递给请求方法。
    • @PathVariable绑定 URL 占位符到入参。
    • @ModelAttribute
      • 在方法定义上使用 @ModelAttribute 注解:Spring MVC 在调用目标处理方法前,会先逐个调用在方法级上标注了@ModelAttribute 的方法。
      • 在方法的入参前使用 @ModelAttribute 注解:可以从隐含对象中获取隐含的模型数据中获取对象,再将请求参数–绑定到对象中,再传入入参将方法入参对象添加到模型中。

  • GET和POST的区别:
    • 传统的答案(貌似是错的)
      • GET使用URL或Cookie传参。而POST将数据放在BODY中。
      • GET的URL会有长度上的限制,则POST的数据则可以非常大。
      • POST比GET安全,因为数据在地址栏上不可见。
    • 基于Http协议的解释:
      • GET一般用于获取/查询 资源信息;GET - 从指定的资源请求数据。
      • POST一般用于更新 资源信息;POST,一般用于将数据发给服务器之用。POST - 向指定的资源提交要被处理的数据。

  • TCP和UDP
    • TCP(Transmission Control Protocol,传输控制协议)
      • TCP协议是一种面向连接的、可靠的协议。
      • 它将源主机发出的字节流无差错地发送给互联网上的目标主机。在发送端,TCP协议负责把上层传送下来的数据分成报文段传递给下层。在接收端,TCP协议负责把接收到的报文进行重组传递给上层。
      • TCP协议还要处理端到端的流量控制,以避免接收速度缓慢的接收方没有足够的缓冲区来接收发送方发送的大量数据。
      • 应用层的许多协议,HTTP、FTP和TELNET协议等,都建立在TCP协议基础上。
      • TCP 用于应用程序之间的通信。当应用程序希望通过 TCP 与另一个应用程序通信时,它会发送一个通信请求。这个请求必须被送到一个确切的地址。在双方“握手”之后,TCP 将在两个应用程序之间建立一个全双工 (full-duplex) 的通信。这个全双工的通信将占用两个计算机之间的通信线路,直到它被一方或双方关闭为止。UDP 和 TCP 很相似,但是更简单,同时可靠性低于 TCP。
    • UDP(User Datagram Protocol,用户数据报协议)
      • UDP协议是一个不可靠的、无连接的协议,主要适用于不需要对报文进行排序和流量控制的场合。
      • UDP不能保证数据报的接收顺序同发送顺序相同,甚至不能保证它们是否全部到达目标主机。
      • 应用层的一些协议,如SNMP和DNS协议,就建立在UDP协议基础上。

  • 网络协议
    • TCP - 传输控制协议:TCP 用于从应用程序到网络的数据传输控制。TCP 负责在数据传送之前将它们分割为 IP 包,然后在它们到达的时候将它们重组。
    • IP - 网际协议:IP 负责计算机之间的通信。IP 负责在因特网上发送和接收数据包。
    • HTTP - 超文本传输协议:HTTP 负责 web 服务器与 web 浏览器之间的通信。HTTP 用于从 web 客户端(浏览器)向 web 服务器发送请求,并从 web 服务器向 web 客户端返回内容(网页)。

  • JQuery Ajax
  $.ajax({
    url:默认值: 当前页地址。发送请求的地址。
    type:请求方式 ("POST" 或 "GET"), 默认为 "GET"。
    async:默认值: true。默认设置下,所有请求均为异步请求。如果需要发送同步请求,请将此选项设置为 false。
    contentType:默认值: "application/x-www-form-urlencoded"。发送信息至服务器时内容编码类型。
    data:发送到服务器的数据。将自动转换为请求字符串格式。{a,b}
    error:默认值: 自动判断 (xml 或 html)。请求失败时调用此函数。
    success:请求成功后的回调函数。 
  });

  • HTTP请求:由三部分构成
    • 请求方式、URI、HTTP协议版本
    • 请求头(Request Header)
      • Accept-Language:浏览器所用的语言
      • Content-Type:正文类型
      • User-Agent:浏览器类型
      • Host:远程主机
      • Content-Length:正文长度。
    • 请求正文:HTTP协议规定,请求头和请求正文之间必须以空行分割,表示请求头已经结束。

  • Java创建对象实例的三种方法
    • new:通常都是使用java的关键字new来创建对象实例。
    • clone:JDK中Object# clone()方法:* protected native Object clone() throws CloneNotSupportedException;*
    #Object clone()方法修饰符是protected,而不是public。必需重写Object的clone方法后才能使用。
    public class Something implements Cloneable{  
      private Something obj;  
      public Something cloneSomething()  
      {  
          try {  
              obj = (Something)this.clone();  
            //obj = (Something)clone();  
          } catch (CloneNotSupportedException e) {  
              e.printStackTrace();  
          }  
          return obj;  
      }  
    }  
    
    • newInstance:利用java.lang.Class类的newInstance方法,则可根据Class对象的实例,建立该Class所表示的类的对象实例。
 #注意 :newInstance创建对象实例的时候会调用无参的构造函数,所以必需确保类中有无参数的构造函数,否则将会抛出java.lang.InstantiationException异常。无法进行实例化。
 somethingNew.getClass().newInstance().   
 Something instance = (Something) Class.forName("cn.softkid.test.Something").newInstance();  

  • ClassLoader类:程序在启动的时候,并不会一次性加载程序所要用的所有class文件,而是根据程序的需要,通过Java的类加载机制(ClassLoader)来动态加载某个class文件到内存当中的,从而只有class文件被载入到了内存之后,才能被其它class所引用。所以ClassLoader就是用来动态加载class文件到内存当中用的。
    • BootStrap ClassLoader:称为启动类加载器,是Java类加载层次中最顶层的类加载器,负责加载JDK中的核心类库,如:rt.jar、resources.jar、charsets.jar等
    • Extension ClassLoader:称为扩展类加载器,负责加载Java的扩展类库,默认加载JAVA_HOME/jre/lib/ext/目下的所有jar。
    • App ClassLoader:称为系统类加载器,负责加载应用程序classpath目录下的所有jar和class文件。

  • servlet/struts1/struts2/spring mvc 的线程安全问题
    • servlet:非线程安全
    • struts1:非线程安全
    • struts2:线程安全
    • spring mvc:非线程安全,spring的Controller默认是Singleton的,这意味着每个request过来,系统都会用原有的instance去处理
      • 1.Controller使用ThreadLocal成员变量。
      • 2.将spring mvc 的 Controller中声明 scope=”prototype”,每次都创建新的controller .

参考文档

1、java提高篇(四)—–理解java的三大特性之多态
2、GET和POST有什么区别?及为什么网上的多数答案都是错的。
3、HTTP 方法:GET 对比 POST
4、Java创建对象实例的三种方法
5、深入分析Java ClassLoader原理
6、wait()和sleep()的区别
6、servlet/struts1/struts2/spring mvc 的线程安全问题