Java 面试题 本身写的答案

基本概念javascript

 

  • 操做系统中 heap 和 stack 的区别
    栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方。
    与C++不一样,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
    当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的做用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间能够当即被另做他用。
    堆内存用来存放由new建立的对象和数组,
    在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
    在堆中产生了一个数组或对象后,还能够在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
    引用变量就至关因而为数组或对象起的一个名称,之后就能够在程序中使用栈中的引用变量来访问堆中的数组或对象。
    Java中变量在内存中的分配: 
      一、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期–一直持续到整个”系统”关闭。 
      二、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不必定是连续的空间分配给变量(好比说类实例),而后根据零散的堆内存地址,经过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”。
       实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并非立刻就释放堆中内存。 
      三、局部变量:局部变量,由声明在某方法,或某代码段里(好比for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离做用域,内存当即释放。 
       详细请看:http://www.javashuo.com/article/p-bvgdhxuz-eh.html

 

  • 什么是基于注解的切面实现
    首先解释下AOP :在程序运行时,动态的将代码切入到类的指定方法、指定位置上的编程思想就是面向切面编程
    基于注解的切面实现目前有两种方式 spring xml配置方式 spring boot集成方式
    面试时答:在spring.xml里面开启扫描bean component-scan跟开启aop注解aspectj-autoproxy
    
    spring xml配置方式:
    在spring.xml文件中声明
    <context:component-scan base-package="demo.spring"/>使用@Component自动发布bean,须要配置这个元素
    <aop:aspectj-autoproxy /> 使用@AspectJ及其它AOP注解须要配置,不然没法使用注解;@AspectJ注解,将@Component自动发布出来的"interceptor" bean转换为一个aspectj切面,而@Pointcut、@Before、@After、@Around等注解,功能与在xml文件中配置是同样的
    
      注解只能使用在能活的源码的场景,若是不能获取源码,则只能经过xml配置的形式,将制定的对象配置成拦截器,对指定目标进行拦截;所以,经过xml文件配置,而不是注解,是更加通用的方式。
    
    详细请看:http://www.javashuo.com/article/p-atxrazhm-er.html

     

  • 什么是 对象/关系 映射集成模块
    所谓对象关系映射(Object Relational Mapping,简称ORM)是经过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另一种形式。
    详细一点,是 面向对象编程中的 对象(Object)
    和关系数据库的 关系(Relation)  
    的一个映射(Mapping)。
    面试的时候一句话:
    对象关系映射是 在关系型数据库和业务实体对象之间作一个映射,这样,在具体的操做业务对象的时候,就不须要再去和复杂的SQL语句打交道了,只要像平时操做对象同样就能够了
    详细请看:http://www.javashuo.com/article/p-bdaktdwr-ey.html

     

  • 什么是 Java 的反射机制
    Java 反射机制是在运行状态中,对于任意一个类,都可以得到这个类的全部属性和方法,对于任意一个对象都可以调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。
    面试的时候一句话
    java反射机制在运行的时候能够经过反射机制得到任意一个类的全部属性跟方法,也能够调用它的属性跟方法.
    想再得到点分数 能够接着说
    Spring 中的 IOC 的底层实现原理就是反射机制,Spring 的容器会帮咱们建立实例,该容器中使用的方法就是反射,经过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理建立配置文件里类的实例对象,存入到Spring的bean容器中。
    详细请看:http://www.javashuo.com/article/p-nmtcgtev-ge.html

     

  • 什么是 ACID
    事务(Transaction)是由一系列对系统中数据进行访问与更新的操做所组成的一个程序 执行逻辑单元(Unit)。
    狭义上的事务特指数据库事务。一方面,当多个应用程序并发访问数据库时,事务能够在这些应用程序之间提供一个隔离方法,以防止彼此的操做互相干扰。
    另外一方面,事务为数据库操做序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即便在异常状态下仍能保持数据一致性的方法。
    事务具备四个特征,分别足原子性(Atomicity )、一致性(Consistency )、隔离性(Isolation) 和持久性(Durability),简称为事务的ACID特性。
    详细请看:http://www.javashuo.com/article/p-vusgxext-et.html

     

  • BS与CS的联系与区别
    bs是浏览器(browser)和服务器(server) 
    cs是静态客户端程序(client)和服务器(server)
    区别在于,虽然一样是经过一个程序链接到服务器进行网络通信,可是bs结构的,客户端运行在浏览器里,好比你看百度,就是经过浏览器.还有一些bs结构的应用,好比中国电信,以及一些电子商务平台.
    用bs结构的好处是,没必要专门开发一个客户端界面,可用asp,php,jsp等比较快速开发web应用的程序开发. cs结构的,要作一个客户端.网络游戏基本上大可能是cs结构,好比你玩传奇,要专门开个传奇程序;玩冒险岛,要专门开个冒险岛...... cs结构的优势是能够定作不少外观,能够作不少安全措施,能够补充浏览器没有的功能.缺点是开发速度比较慢,一个功能比较完善的客户端比较难作.
    详细请看:http://www.cnblogs.com/songanwei/p/9387641.html
     

     

  • Cookie 和 Session的区别

    一、cookie数据存放在客户的浏览器上,session数据放在服务器上。php

    二、cookie不是很安全,别人能够分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。html

    三、session会在必定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。前端

    四、单个cookie保存的数据不能超过4K,不少浏览器都限制一个站点最多保存20个cookie。java

    五、能够考虑将登录信息等重要信息存放为session,其余信息若是须要保留,能够放在cookie中。react

    详细请看:http://www.javashuo.com/article/p-ekqmmpvp-en.html

     

  • fail-fast 与 fail-safe 机制有什么区别
    快速失败(fail—fast)在用迭代器遍历一个集合对象时,若是遍历过程当中对集合对象的内容进行了修改(增长、删除、修改),则会抛出Concurrent Modification Exception。
    java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程当中被修改)。 安全失败(fail—safe)采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。 java.util.concurrent包下的容器都是安全失败,能够在多线程下并发使用,并发修改。
    详细请看:http://www.javashuo.com/article/p-gmconpul-ed.html

     

  • get 和 post请求的区别
    面试回答:
    
    GET请求在URL中传送的参数是有长度限制的,而POST没有。
    
    GET比POST更不安全,由于参数直接暴露在URL上,因此不能用来传递敏感信息。
    
    GET参数经过URL传递,POST放在Request body中。
    
    GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
    
    GET请求只能进行url编码,而POST支持多种编码方式。
    
    GET请求会被浏览器主动cache,而POST不会,除非手动设置。
    
    GET产生的URL地址能够被Bookmark,而POST不能够。
    
    GET在浏览器回退时是无害的,而POST会再次提交请求。
    
    答上几条就好了。
    加分项:
    GET和POST还有一个重大区别,简单的说:
    
    GET产生一个TCP数据包;POST产生两个TCP数据包。
    
    长的说:
    
    对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
    
    而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
    详细请看:http://www.javashuo.com/article/p-mywlgliu-co.html

     

  • Interface 与 abstract 类的区别
    先从整体解释抽象类和接口的基本概念,而后再比较二者的语法细节,最后再说二者的应用区别。
    
    比较二者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展示本身深厚的技术功底。

    抽象类(abstract)程序员

     
        

    含有abstract修饰符的class即为抽象类,abstract 类不能建立的实例对象。web

     
        

    含有abstract方法的类必须定义为abstract class,abstract class类中的方法没必要是抽象的。面试

     
        

    abstract class类中定义抽象方法必须在具体(Concrete)子类中实现,因此,不能有抽象构造方法或抽象静态方法。ajax

     
        

    若是的子类没有实现抽象父类中的全部抽象方法,那么子类也必须定义为abstract类型。

     
        

    接口(interface)

     
        

    interface 能够说成是抽象类的一种特例,接口中的全部方法都必须是抽象的。

     
        

    接口中的方法定义默认为public abstract类型,接口中的成员变量类型默认为public static final

     
        

    下面比较一下二者的语法区别:

     
        

    1.抽象类能够有构造方法,接口中不能有构造方法。

     
        

    2.抽象类中能够有普通成员变量,接口中没有普通成员变量

     
        

    3.抽象类中能够包含非抽象的普通方法,接口中的全部方法必须都是抽象的,不能有非抽象的普通方法。

     
        

    4. 抽象类中的抽象方法的访问类型能够是public,protected和(默认类型,虽然eclipse下不报错,但应该也不行),但接口中的抽象方法只能是public类型的,而且默认即为public abstract类型。

     
        

    5. 抽象类中能够包含静态方法,接口中不能包含静态方法

     
        

    6. 抽象类和接口中均可以包含静态成员变量,抽象类中的静态成员变量的访问类型能够任意,但接口中定义的变量只能是public static final类型,而且默认即为public static final类型。

     
        

    7. 一个类能够实现多个接口,但只能继承一个抽象类。

     

     
        
    详细请看:http://www.javashuo.com/article/p-cjpaszxy-dw.html
     

     

  • IOC的优势是什么
    先把IOC的概念说出来
    
    依赖注入和控制反转
    
    所谓的依赖注入是甲方开放接口,在它须要的时候,可以将乙方传递进来(注入);所谓的控制反转,甲乙双方不相互依赖,交易活动的进行不依赖于甲乙任何一方,整个活动的进行由第三方负责管理。这就是spring IoC的思想所在。
    
    而后说优缺点
    
    IOC的优势:实现组件之间的解耦,提升程序的灵活性和可维护性。
    IOC的缺点:
    1、建立对象的步骤变复杂了,不直观,固然这是对不习惯这种方式的人来讲的。
    2、由于使用反射来建立对象,因此在效率上会有些损耗。但相对于程序的灵活性和可维护性来讲,这点损耗是微不足道的。
    三、缺乏IDE重构的支持,若是修改了类名,还需到XML文件中手动修改,这彷佛是全部XML方式的缺憾所在。
    详情查看:http://www.cnblogs.com/songanwei/p/9389109.html

     

  • IO 和 NIO的区别,NIO优势
    IO是面向流的,NIO是面向缓冲区的
    Java IO面向流意味着每次从流中读一个或多个字节,直至读取全部字节,它们没有被缓存在任何地方;
    NIO则能先后移动流中的数据,由于是面向缓冲区的
    IO流是阻塞的,NIO流是不阻塞的
    Java IO的各类流是阻塞的。这意味着,当一个线程调用read() 或 write()时,该线程被阻塞,直到有一些数据被读取,或数据彻底写入。该线程在此期间不能再干任何事情了
    Java NIO的非阻塞模式,使一个线程从某通道发送请求读取数据,可是它仅能获得目前可用的数据,若是目前没有数据可用时,就什么都不会获取。NIO可以让您只使用一个(或几个)单线程管理多个通道(网络链接或文件),但付出的代价是解析数据可能会比从一个阻塞流中读取数据更复杂。 
    非阻塞写也是如此。一个线程请求写入一些数据到某通道,但不须要等待它彻底写入,这个线程同时能够去作别的事情。
    选择器
    Java NIO的选择器容许一个单独的线程来监视多个输入通道,你能够注册多个通道使用一个选择器,而后使用一个单独的线程来“选择”通道:这些通道里已经有能够处理的输入,或者选择已准备写入的通道。这种选择机制,使得一个单独的线程很容易来管理多个通道。
    NIO的优点:
    1.优点在于一个线程管理多个通道;可是数据的处理将会变得复杂;
    2.若是须要管理同时打开的成千上万个链接,这些链接每次只是发送少许的数据,采用这种;
    传统IO的优点:
    1.适用于一个线程管理一个通道的状况;由于其中的流数据的读取是阻塞的;
    2.若是须要管理同时打开不太多的链接,这些链接会发送大量的数据;
    详细请看:http://www.javashuo.com/article/p-oncyysuj-dd.html

     

  • Java 8 / Java 7 为咱们提供了什么新功能
    Java 7 的7个新特性
    
    1.对集合类的语言支持;
    
    2.自动资源管理;
    
    3.改进的通用实例建立类型推断;
    
    4.数字字面量下划线支持;
    
    5.switch中使用string;
    
    6.二进制字面量;
    
    7.简化可变参数方法调用。
    
     
    
    JAVA8 新特性
    
    Lambda 表达式 − Lambda容许把函数做为一个方法的参数(函数做为参数传递进方法中。
    
    方法引用 − 方法引用提供了很是有用的语法,能够直接引用已有Java类或对象(实例)的方法或构造器。与lambda联合使用,方法引用可使语言的构造更紧凑简洁,减小冗余代码。
    
    默认方法 − 默认方法就是一个在接口里面有了一个实现的方法。
    
    新工具 − 新的编译工具,如:Nashorn引擎 jjs、 类依赖分析器jdeps。
    
    Stream API −新添加的Stream API(java.util.stream) 把真正的函数式编程风格引入到Java中。
    
    Date Time API − 增强对日期与时间的处理。
    
    Optional 类 − Optional 类已经成为 Java 8 类库的一部分,用来解决空指针异常。
    
    Nashorn, JavaScript 引擎 − Java 8提供了一个新的Nashorn javascript引擎,它容许咱们在JVM上运行特定的javascript应用。
    详细请看:https://www.cnblogs.com/songanwei/p/9389663.html
     

     

  • 什么是竞态条件? 举个例子说明。
    当两个线程竞争同一资源时,若是对资源的访问顺序敏感,就称存在竞态条件。
    
    致使竞态条件发生的代码区称做临界区。
    
    在临界区中使用适当的同步就能够避免竞态条件。
    
    临界区实现方法有两种,一种是用synchronized,一种是用Lock显式锁实现。
    class Counter {  
        protected long count = 0;  
        public void add(long value) {  
            this.count = this.count + value;  
        }  
    }  
     
        

    观察线程A和B交错执行会发生什么,两个线程分别加了2和3到count变量上,两个线程执行结束后count变量的值应该等于5。然而因为两个线程是交叉执行的,两个线程从内存中读出的初始值都是0。而后各自加了2和3,并分别写回内存。最终的值并非指望的5,而是最后写回内存的那个线程的值,上面例子中最后写回内存的是线程A,但实际中也多是线程B。若是没有采用合适的同步机制,线程间的交叉执行状况就没法预料。
    add()方法就是一个临界区,它会产生竞态条件。

    引用:http://cuisuqiang.iteye.com/blog/2020152

     

  • JRE、JDK、JVM 及 JIT 之间有什么不一样
    java虚拟机(JVM)
        使用java编程语言的主要优点就是平台的独立性。
    你曾经想知道过java怎么实现平台的独立性吗?对,就是虚拟机,它抽象化了硬件设备,开发者和他们的程序的得以操做系统。
    虚拟机的职责就是处理和操做系统的交流。java不一样的接口规范对任何平台都有良好的支持,由于jvm很好的实现了每一个平台的规范。
    jvm能够理解伪代码字节码,在用户和操做系统之间创建了一层枢纽。 java运行时环境(JRE) java运行时环境是JVM的一个超集。
    JVM对于一个平台或者操做系统是明确的,而JRE确实一个通常的概念,他表明了完整的运行时环境。
    咱们在jre文件夹中看到的全部的jar文件和可执行文件都会变成运行时的一部分。
    事实上,运行时JRE变成了JVM。因此对于通常状况时候使用JRE,对于明确的操做系统来讲使用JVM。
    当你下载了JRE的时候,也就自动下载了JVM。 java开发工具箱(JDK) java开发工具箱指的是编写一个java应用所须要的全部jar文件和可执行文件。
    事实上,JRE是JDK的一部分。
    若是你下载了JDK,你会看到一个名叫JRE的文件夹在里面。JDK中要被牢记的jar文件就是tools.jar,它包含了用于执行java文档的类还有用于类签名的jar包。 即时编译器(JIT) 即时编译器是种特殊的编译器,它经过有效的把字节码变成机器码来提升JVM的效率。
    JIT这种功效很特殊,由于他把检测到的类似的字节码编译成单一运行的机器码,从而节省了CPU的使用。
    这和其余的字节码编译器不一样,由于他是运行时(第一类执行的编译?)the firs of its kind to perform the compilation(从字节码到机器码)而不是在程序运行以前。
    正是由于这些,动态编译这个词汇才和JIT有那么紧密的关系。

     

  • MVC的各个部分都有那些技术来实现?如何实现?
    MVC是Model-View-Controller的简写。
    
    Model 表明的是应用的业务逻辑(经过JavaBean,EJB组件实现),
    View 是应用的表示面(由JSP页面产生),
    Controller 是提供应用的处理过程控制(通常是一个Servlet),
    经过这种设计模型把应用逻辑,处理过程和显示逻辑分红不一样的组件实现。这些组件能够进行交互和重用。

     

  • RPC 通讯和 RMI 区别
    RPC:(Remote Procedure Call) 
      被设计为在应用程序间通讯的平台中立的方式,它不理会操做系统之间以及语言之间的差别。 支持多语言
    RMI:(Remote Method Invocation) 
    RPC 的Java版本,EJB的基础技术 
    RMI 采用JRMP(Java Remote Method Protocol)通信协议,是构建在TCP/IP协议上的一种远程调用方法。 
    RMI 采用stubs和skeletons来进行远程对象的通信。 
      stub充当远程对象的客户端代理,有着和远程对象相同的远程接口。 
      远程对象的调用实际是经过调用该对象的客户端代理对象stub来完成的。
    RMI和RPC之间最主要的区别在于方法是如何别调用的。
    在RMI中,远程接口使每一个远程方法都具备方法签名。若是一个方法在服务器上执行,可是没有相匹配的签名被添加到这个远程接口上,那么这个新方法就不能被RMI客户方所调用。
    在RPC中,当一个请求到达RPC服务器时,这个请求就包含了一个参数集和一个文本值,一般造成“classname.methodname”的形式。
    这就向RPC服务器代表,被请求的方法在为“classname”的类中,名叫“methodname”。
    而后RPC服务器就去搜索与之相匹配的类和方法,并把它做为那种方法参数类型的输入。
    这里的参数类型是与RPC请求中的类型是匹配的。一旦匹配成功,这个方法就被调用了,其结果被编码后返回客户方。

     

  • 什么是 Web Service(Web服务)
    从表面上看,Web Service就是一个应用程序,它向外界暴露出一个可以经过Web进行调用的API。
    这就是说,你可以用编程的方法透明的调用这个应用程序,不须要了解它的任何细节,跟你使用的编程语言也没有关系。
    例如能够建立一个提供天气预报的Web Service,那么不管你用哪一种编程语言开发的应用均可以经过调用它的API并传入城市信息来得到该城市的天气预报。
    之因此称之为Web Service,是由于它基于HTTP协议传输数据,这使得运行在不一样机器上的不一样应用无须借助附加的、专门的第三方软件或硬件,就可相互交换数据或集成。 补充:这里必需要说起的一个概念是SOA(Service
    -Oriented Architecture,面向服务的架构),
    SOA是一种思想,它将应用程序的不一样功能单元经过中立的契约联系起来,独立于硬件平台、操做系统和编程语言,使得各类形式的功能单元可以更好的集成。
    显然,Web Service是SOA的一种较好的解决方案,它更多的是一种标准,而不是一种具体的技术。

     

  • JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
    Web ServiceWeb Service是基于网络的、分布式的模块化组件,它执行特定的任务,遵照具体的技术规范,这些规范使得Web Service能与其余兼容的组件进行互操做。
    JAXP(Java API for XML Parsing) 定义了在Java中使用DOM, SAX, XSLT的通用的接口。这样在你的程序中你只要使用这些通用的接口,当你须要改变具体的实现时候也不须要修改代码。
    JAXM(Java API for XML Messaging) 是为SOAP通讯提供访问方法和传输机制的API。
    WSDL是一种 XML 格式,用于将网络服务描述为一组端点,这些端点对包含面向文档信息或面向过程信息的消息进行操做。这种格式首先对操做和消息进行抽象描述,而后将其绑定到具体的网络协议和消息格式上以定义端点。相关的具体端点即组合成为抽象端点(服务)。
    SOAP即简单对象访问协议(Simple Object Access Protocol),它是用于交换XML编码信息的轻量级协议。
    UDDI 的目的是为电子商务创建标准;UDDI是一套基于Web的、分布式的、为Web Service提供的、信息注册中心的实现标准规范,同时也包含一组使企业能将自身提供的Web Service注册,以使别的企业可以发现的访问协议的实现标准。

     

  • WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。
    知足必定条件的web服务器就是web容器。是web服务器或应用与服务器的一部分,例如是tomcat,weblogic等,实现的是jsp,servlet;tomcat就是servlet和jsp运行的容器。
    WEB容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,JSP容器和SERVLET容器。使JSP,SERVLET直接跟容器中的环境变量接口交互,没必要关注其它系统问题。主要由WEB服务器来实现。
    例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵照J2EE规范中的WEB APPLICATION 标准。咱们把遵照以上标准的WEB服务器就叫作J2EE中的WEB容器。 EJB容器:Enterprise java bean 容器。更具备行业领域特点。
    他提供给运行在其中的组件EJB各类管理功能。只要知足J2EE规范的EJB放入该容器,立刻就会被容器进行高效率的管理。而且能够经过现成的接口来得到系统级别的服务。例如邮件服务、事务管理。 WEB容器和EJB容器在原理上是大致相同的,更多的区别是被隔离的外界环境。
    WEB容器更多的是跟基于HTTP的请求打交道。而EJB容器不是。它是更多的跟数据库、其它服务打交道。
    但他们都是把与外界的交互实现从而减轻应用程序的负担。例如SERVLET不用关心HTTP的细节,直接引用环境变量session,request,response就行、EJB不用关心数据库链接速度、各类事务控制,直接由容器来完成。
    详细请看:http://www.javashuo.com/article/p-ryavpqkz-cu.html

     

  • 一个".java"源文件中是否能够包含多个类(不是内部类)?有什么限制
    这个是能够的,一个“.java”源文件里面能够包含多个类,可是只容许有一个public类,而且类名必须和文件名一致。
    
    每一个编译单元只能有一个public 类。这么作的意思是,每一个编译单元只能有一个公开的接口,而这个接口就由其public 类来表示。
    你能够根据须要,往这个文件里面添加任意多个提供辅助功能的package 权限的类。可是若是这个编译单元里面有两个或两个以上的public 类的话,程序就不知道从哪里导入了,编译器就会报错。  

     

  • 简单说说你了解的类加载器。是否实现过类加载器
    类加载器就是负责检索并加载其余Java类或者资源(如文件)的对象,它通常继承于java.lang.ClassLoader这个抽象类(除了BootstrapClassLoader)。
    实际上,程序中全部的类都是经过类加载器进行加载的,而且它们都持有各自类加载器对象的引用,能够经过java.lang.Class的getClassLoader方法获得。

    一个程序中的各个类加载器构成了一棵树,位于根部的被称做BootstrapClassLoader,它做为Java虚拟机的一部分,它使用C++语言实现,在程序刚启动时就被加载进来,负责Java标准库的加载,而且只有它能完成该任务。

      
    标准扩展(Extension)类加载器负责加载Java_Home /lib/ext或者由系统变量 java.ext.dir指定位置中的类库

      
    应用程序(Application)类加载器负责加载系统类路径(CLASSPATH)中指定的类库。同时它常被称为系统(System)加载器,由于咱们能够经过getSystemClassLoader()方法来获取它。

      
    而由咱们程序员本身编写的类加载器被称为自定义类加载器,若是生成自定义类加载器时没有明确地指出父类加载器,会默认把应用程序(Application)类加载器做为本身的父亲。

      
    类加载器的父子关系至关重要,当你指定由一个类加载器加载某一个类时,它会不管如何先把它交给本身的父类加载器来执行,除非父类加载器检索不到这个类,才会开始尝试本身检索和加载。

    详情:http://www.javashuo.com/article/p-sfixvzzw-ck.html

    http://www.cnblogs.com/songanwei/p/9417277.html

     

  • 解释一下什么叫AOP(面向切面编程)
    这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
    
    AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。
    使用AOP技术,能够将一些系统性相关的编程工做,独立提取出来,独立实现,而后经过切面切入进系统。
    从而避免了在业务逻辑的代码中混入不少的系统相关的逻辑——好比权限管理,事物管理,日志记录等等。这些系统性的编程工做均可以独立编码实现,而后经过AOP技术切入进系统便可。
    从而达到了 将不一样的关注点分离出来的效果。
    详情请看:http://www.javashuo.com/article/p-cslhjjih-bx.html

     

  • 请简述 Servlet 的生命周期及其相关的方法
    Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。
    init():在Servlet的生命周期中,仅执行一次init()方法。
    它是在服务器装入Servlet时执行的,负责初始化Servlet对象。
    能够配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。
    不管有多少客户机访问Servlet,都不会重复执行init()。
    service():它是Servlet的核心,负责响应客户的请求。
    每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,并且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象做为参数。
    在HttpServlet中已存在Service()方法。
    默认的服务功能是调用与HTTP请求的方法相应的do功能。
    destroy(): 仅执行一次,在服务器端中止且卸载Servlet时执行该方法。
    当Servlet对象退出生命周期时,负责释放占用的资源。
    一个Servlet在运行service()方法时可能会产生其余的线程,所以须要确认在调用destroy()方法时,这些线程已经终止或完成。
    详情请看:http://www.javashuo.com/article/p-bomfpfqa-x.html

     

  • 请简述一下 Ajax 的原理及实现步骤
     
        

     Ajax的原理简单来讲经过XmlHttpRequest对象来向服务器发异步请求,从服务器得到数据,而后用javascript来操做DOM而更新页面。这其中最关键的一步就是从服务器得到请求数据。要清楚这个过程和原理,咱们必须对 XMLHttpRequest有所了解。

     
        

    XMLHttpRequest是ajax的核心机制,它是在IE5中首先引入的,是一种支持异步请求的技术。简单的说,也就是javascript能够及时向服务器提出请求和处理响应,而不阻塞用户。达到无刷新的效果。

    get 请求
    1) 建立一个XMLHttpRequest对象
    2) 调用该对象的open方法
    3) 若是是get请求,设置回调函数onreadystatechange = callback
    4) Send
    
    若是是post 请求
    
    建立一个XMLHttpRequest对象
    6) 调用该对象的open方法
    7) 调用setRequestHeader(“Content-Type”, “application/x-www-form-urlencoded”);
    8) 设置回调函数onreadystatechange = callback
    9) Send
    详情:http://www.javashuo.com/article/p-gwjuyvqp-h.html

     

  • 简单描述Struts的主要功能
  • 什么是 N 层架构
  • 什么是CORBA?用途是什么
  • 什么是Java虚拟机?为何Java被称做是"平台无关的编程语言"
  • 什么是正则表达式?用途是什么?哪一个包使用正则表达式来实现模式匹配
  • 什么是懒加载(Lazy Loading)
  • 什么是尾递归,为何须要尾递归
  • 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)

    关键字

    finalize

  • 什么是finalize()方法
  • finalize()方法何时被调用
  • 析构函数(finalization)的目的是什么
  • final 和 finalize 的区别

    final

  • final关键字有哪些用法
  • final 与 static 关键字能够用于哪里?它们的做用是什么
  • final, finally, finalize的区别
  • final、finalize 和 finally 的不一样之处?

    可否在运行时向 static final 类型的赋值

  • 使用final关键字修饰一个变量时,是引用不能变,仍是引用的对象不能变
  • 一个类被声明为final类型,表示了什么意思
  • throws, throw, try, catch, finally分别表明什么意义

    Java 有几种修饰符?分别用来修饰什么

    volatile

  • volatile 修饰符的有过什么实践
  • volatile 变量是什么?volatile 变量和 atomic 变量有什么不一样
  • volatile 类型变量提供什么保证?能使得一个非原子操做变成原子操做吗
  • 能建立 volatile 数组吗?
  • transient变量有什么特色
  • super何时使用
  • public static void 写成 static public void会怎样
  • 说明一下public static void main(String args[])这段声明里每一个关键字的做用
  • 请说出做用域public, private, protected, 以及不写时的区别
  • sizeof 是Java 的关键字吗

    static

  • static class 与 non static class的区别
  • static 关键字是什么意思?Java中是否能够覆盖(override)一个private或者是static的方法
  • 静态类型有什么特色
  • main() 方法为何必须是静态的?能不能声明 main() 方法为非静态
  • 是否能够从一个静态(static)方法内部发出对非静态(non-static)方法的调用
  • 静态变量在何时加载?编译期仍是运行期?静态代码块加载的时机呢
  • 成员方法是否能够访问静态变量?为何静态方法不能访问成员变量

    switch

  • switch 语句中的表达式能够是什么类型数据
  • switch 是否能做用在byte 上,是否能做用在long 上,是否能做用在String上
  • while 循环和 do 循环有什么不一样

    操做符

  • &操做符和&&操做符有什么区别?
  • a = a + b 与 a += b 的区别?
  • 逻辑操做符 (&,|,^)与条件操做符(&&,||)的区别
  • 3*0.1 == 0.3 将会返回什么?true 仍是 false?
  • float f=3.4; 是否正确?
  • short s1 = 1; s1 = s1 + 1;有什么错?

    数据结构

    基础类型(Primitives)

  • 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里
  • 简述九种基本数据类型的大小,以及他们的封装类
  • int 和 Integer 哪一个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在何时使用到
  • float和double的默认值是多少
  • 如何去小数四舍五入保留小数点后两位
  • char 型变量中能不能存贮一个中文汉字,为何

    类型转换

  • 怎样将 bytes 转换为 long 类型
  • 怎么将 byte 转换为 String
  • 如何将数值型字符转换为数字
  • 咱们能将 int 强制转换为 byte 类型的变量吗?若是该值大于 byte 类型的范围,将会出现什么现象
  • 能在不进行强制转换的状况下将一个 double 值赋值给 long 类型的变量吗
  • 类型向下转换是什么

    数组

  • 如何权衡是使用无序的数组仍是有序的数组
  • 怎么判断数组是 null 仍是为空
  • 怎么打印数组? 怎样打印数组中的重复元素
  • Array 和 ArrayList有什么区别?何时应该使用Array而不是ArrayList
  • 数组和链表数据结构描述,各自的时间复杂度
  • 数组有没有length()这个方法? String有没有length()这个方法

    队列

  • 队列和栈是什么,列出它们的区别
  • BlockingQueue是什么
  • 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不一样之处。

    ArrayList、Vector、LinkedList的存储性能和特性

    String

    StringBuffer

  • ByteBuffer 与 StringBuffer有什么区别

    HashMap

  • HashMap的工做原理是什么
  • 内部的数据结构是什么
  • HashMap 的 table的容量如何肯定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题?
  • HashMap 实现的数据结构是什么?如何实现
  • HashMap 和 HashTable、ConcurrentHashMap 的区别
  • HashMap的遍历方式及效率
  • HashMap、LinkedMap、TreeMap的区别
  • 如何决定选用HashMap仍是TreeMap
  • 若是HashMap的大小超过了负载因子(load factor)定义的容量,怎么办
  • HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,好比存储方式、 hashcode、扩容、 默认容量等

    HashSet

  • HashSet和TreeSet有什么区别
  • HashSet 内部是如何工做的
  • WeakHashMap 是怎么工做的?

    Set

  • Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 仍是 equals()? 它们有何区别?
  • TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
  • TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。
  • EnumSet 是什么

    Hash算法

  • Hashcode 的做用
  • 简述一致性 Hash 算法
  • 有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象
  • 为何在重写 equals 方法的时候须要重写 hashCode 方法?equals与 hashCode 的异同点在哪里
  • a.hashCode() 有什么用?与 a.equals(b) 有什么关系
  • hashCode() 和 equals() 方法的重要性体如今什么地方
  • Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为何这么设计?Object类的概述
  • 如何在父类中为子类自动完成全部的 hashcode 和 equals 实现?这么作有何优劣。
  • 能够在 hashcode() 中使用随机数字吗?

    LinkedHashMap

  • LinkedHashMap 和 PriorityQueue 的区别是什么

    List

  • List, Set, Map三个接口,存取元素时各有什么特色
  • List, Set, Map 是否继承自 Collection 接口
  • 遍历一个 List 有哪些不一样的方式
  • LinkedList
  1. LinkedList 是单向链表仍是双向链表
  2. LinkedList 与 ArrayList 有什么区别
  3. 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?
  4. 插入数据时,ArrayList, LinkedList, Vector谁速度较快?

     

  • ArrayList

     

  1. ArrayList 和 HashMap 的默认大小是多数
  2. ArrayList 和 LinkedList 的区别,何时用 ArrayList?
  3. ArrayList 和 Set 的区别?
  4. ArrayList, LinkedList, Vector的区别
  5. ArrayList是如何实现的,ArrayList 和 LinkedList 的区别
  6. ArrayList如何实现扩容
  7. Array 和 ArrayList 有何区别?何时更适合用Array
  8. 说出ArraList,Vector, LinkedList的存储性能和特性

     

    Map

     

  • Map, Set, List, Queue, Stack
  • Map 接口提供了哪些不一样的集合视图
  • 为何 Map 接口不继承 Collection 接口

     

    Collections

     

  • 介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些
  • Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现
  • 集合类框架的最佳实践有哪些
  • 为何 Collection 不从 Cloneable 和 Serializable 接口继承
  • 说出几点 Java 中使用 Collections 的最佳实践?
  • Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别

     

    什么是 B+树,B-树,列出实际的使用场景。

     

    接口

     

  • Comparator 与 Comparable 接口是干什么的?列出它们的区别

     

    对象

     

    拷贝(clone)

     

  • 如何实现对象克隆
  • 深拷贝和浅拷贝区别
  • 深拷贝和浅拷贝如何实现激活机制
  • 写clone()方法时,一般都有一行代码,是什么

     

    比较

     

  • 在比较对象时,"==" 运算符和 equals 运算有何区别
  • 若是要重写一个对象的equals方法,还要考虑什么
  • 两个对象值相同(x.equals(y) == true),但却可有不一样的hash code,这句话对不对

     

    构造器

     

  • 构造器链是什么
  • 建立对象时构造器的调用顺序

     

    不可变对象

     

  • 什么是不可变象(immutable object)
  • 为何 Java 中的 String 是不可变的(Immutable)
  • 如何构建不可变的类结构?关键点在哪里
  • 能建立一个包含可变对象的不可变对象吗
  • 如何对一组对象进行排序

     

    方法

     

  • 构造器(constructor)是否可被重写(override)
  • 方法能够同时便是 static 又是 synchronized 的吗
  • abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized
  • Java支持哪一种参数传递类型
  • 一个对象被看成参数传递到一个方法,是值传递仍是引用传递
  • 当一个对象被看成参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里究竟是值传递仍是引用传递
  • 咱们可否重载main()方法
  • 若是main方法被声明为private会怎样

     

    GC

     

    概念

     

  • GC是什么?为何要有GC
  • 何时会致使垃圾回收
  • GC是怎么样运行的
  • 新老以及永久区是什么
  • GC 有几种方式?怎么配置
  • 何时一个对象会被GC? 如何判断一个对象是否存活
  • System.gc() Runtime.gc()会作什么事情? 能保证 GC 执行吗
  • 垃圾回收器能够立刻回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
  • Minor GC 、Major GC、Young GC 与 Full GC分别在何时发生
  • 垃圾回收算法的实现原理
  • 若是对象的引用被置为null,垃圾收集器是否会当即释放对象占用的内存?
  • 垃圾回收的最佳作法是什么

     

    GC收集器有哪些

     

  • 垃圾回收器的基本原理是什么?
  • 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么
  • Serial 与 Parallel GC之间的不一样之处
  • CMS 收集器 与 G1 收集器的特色与区别
  • CMS垃圾回收器的工做过程
  • JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代
  • 吞吐量优先和响应优先的垃圾收集器选择

     

    GC策略

     

  • 举个实际的场景,选择一个GC策略
  • JVM的永久代中会发生垃圾回收吗

     

    收集方法

     

    标记清除、标记整理、复制算法的原理与特色?分别用在什么地方

    若是让你优化收集方法,有什么思路

     

    JVM

     

    参数

     

  • 说说你知道的几种主要的jvm 参数
  • -XX:+UseCompressedOops 有什么做用

     

    类加载器(ClassLoader)

     

  • Java 类加载器都有哪些
  • JVM如何加载字节码文件

     

    内存管理

     

  • JVM内存分哪几个区,每一个区的做用是什么
  • 一个对象从建立到销毁都是怎么在这些部分里存活和转移的
  • 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
  • JVM中哪一个参数是用来控制线程的栈堆栈小
  • 简述内存分配与回收策略
  • 简述重排序,内存屏障,happen-before,主内存,工做内存
  • Java中存在内存泄漏问题吗?请举例说明
  • 简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用
  • 内存映射缓存区是什么

     

  1. jstack,jstat,jmap,jconsole怎么用
  2. 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数?
  3. 怎样经过 Java 程序来判断 JVM 是 32 位 仍是 64 位
  4. JVM自身会维护缓存吗?是否是在堆中进行对象分配,操做系统的堆仍是JVM本身管理堆
  5. 什么状况下会发生栈内存溢出
  6. 双亲委派模型是什么

     

    多线程

     

    基本概念

     

  • 什么是线程
  • 多线程的优势
  • 多线程的几种实现方式

     

  1. 用 Runnable 仍是 Thread

     

  • 什么是线程安全

     

  1. Vector, SimpleDateFormat 是线程安全类吗
  2. 什么 Java 原型不是线程安全的
  3. 哪些集合类是线程安全的

     

  • 多线程中的忙循环是什么
  • 如何建立一个线程
  • 编写多线程程序有几种实现方式
  • 什么是线程局部变量
  • 线程和进程有什么区别?进程间如何通信,线程间如何通信
  • 什么是多线程环境下的伪共享(false sharing)
  • 同步和异步有何异同,在什么状况下分别使用他们?举例说明

     

    Current

     

  • ConcurrentHashMap 和 Hashtable的区别
  • ArrayBlockingQueue, CountDownLatch的用法
  • ConcurrentHashMap的并发度是什么

     

    CyclicBarrier 和 CountDownLatch有什么不一样?各自的内部原理和用法是什么

    Semaphore的用法

    Thread

     

  • 启动一个线程是调用 run() 仍是 start() 方法?start() 和 run() 方法有什么区别
  • 调用start()方法时会执行run()方法,为何不能直接调用run()方法
  • sleep() 方法和对象的 wait() 方法均可以让线程暂停执行,它们有什么区别
  • yield方法有什么做用?sleep() 方法和 yield() 方法有什么区别
  • Java 中如何中止一个线程
  • stop() 和 suspend() 方法为什么不推荐使用
  • 如何在两个线程间共享数据
  • 如何强制启动一个线程
  • 如何让正在运行的线程暂停一段时间
  • 什么是线程组,为何在Java中不推荐使用
  • 你是如何调用 wait(方法的)?使用 if 块仍是循环?为何

     

    生命周期

     

  • 有哪些不一样的线程生命周期
  • 线程状态,BLOCKED 和 WAITING 有什么区别
  • 画一个线程的生命周期状态图

     

    ThreadLocal 用途是什么,原理是什么,用的时候要注意什么

    ThreadPool

     

  • 线程池是什么?为何要使用它
  • 如何建立一个Java线程池
  • ThreadPool用法与优点
  • 提交任务时,线程池队列已满时会发会生什么
  • newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,好比 coreSize, maxsize 等
  • 线程池的实现策略
  • 线程池的关闭方式有几种,各自的区别是什么
  • 线程池中submit() 和 execute()方法有什么区别?

     

    线程调度

     

  • Java中用到的线程调度算法是什么
  • 什么是多线程中的上下文切换
  • 你对线程优先级的理解是什么
  • 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)

     

    线程同步

     

  • 请说出你所知的线程同步的方法
  • synchronized 的原理是什么
  • synchronized 和 ReentrantLock 有什么不一样
  • 什么场景下可使用 volatile 替换 synchronized
  • 有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行
  • 同步块内的线程抛出异常会发生什么
  • 当一个线程进入一个对象的 synchronized 方法A 以后,其它线程是否可进入此对象的 synchronized 方法B
  • 使用 synchronized 修饰静态方法和非静态方法有什么区别
  • 如何从给定集合那里建立一个 synchronized 的集合

     

     

  • Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优点
  • Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优点是什么
  • ReadWriteLock是什么?
  • 锁机制有什么用
  • 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题
  • 解释如下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁
  • 何时应该使用可重入锁
  • 简述锁的等级方法锁、对象锁、类锁
  • Java中活锁和死锁有什么区别?
  • 什么是死锁(Deadlock)?致使线程死锁的缘由?如何确保 N 个线程能够访问 N 个资源同时又不致使死锁
  • 死锁与活锁的区别,死锁与饥饿的区别
  • 怎么检测一个线程是否拥有锁
  • 如何实现分布式锁
  • 有哪些无锁数据结构,他们实现的原理是什么
  • 读写锁能够用于什么应用场景

     

  • Executors类是什么? Executor和Executors的区别
  • 什么是Java线程转储(Thread Dump),如何获得它
  • 如何在Java中获取线程堆栈
  • 说出 3 条在 Java 中使用线程的最佳实践
  • 在线程中你怎么处理不可捕捉异常
  • 实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的
  • 请说出与线程同步以及线程调度相关的方法
  • 程序中有3个 socket,须要多少个线程来处理
  • 假若有一个第三方接口,有不少个线程去调用获取数据,如今规定每秒钟最多有 10 个线程同时调用它,如何作到
  • 如何在 Windows 和 Linux 上查找哪一个线程使用的 CPU 时间最长
  • 如何确保 main() 方法所在的线程是 Java 程序最后结束的线程
  • 很是多个线程(多是不一样机器),相互之间须要等待协调才能完成某种工做,问怎么设计这种协调方案
  • 你须要实现一个高效的缓存,它容许多个用户读,但只容许一个用户写,以此来保持它的完整性,你会怎样去实现它

     

    异常

     

    基本概念

     

  • Error 和 Exception有什么区别
  1. UnsupportedOperationException是什么
  2. NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处
  • 什么是受检查的异常,什么是运行时异常
  • 运行时异常与通常异常有何异同
  • 简述一个你最多见到的runtime exception(运行时异常)

     

    finally

     

  • finally关键词在异常处理中如何使用
  1. 若是执行finally代码块以前方法返回告终果,或者JVM退出了,finally块中的代码还会执行吗
  2. try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,何时被执行,在return前仍是后
  3. 在什么状况下,finally语句不会执行

     

  • throw 和 throws 有什么区别?
  • OOM你遇到过哪些状况?你是怎么搞定的?
  • SOF你遇到过哪些状况?
  • 既然咱们能够用RuntimeException来处理错误,那么你认为为何Java中还存在检查型异常
  • 当本身建立异常类的时候应该注意什么
  • 致使空指针异常的缘由
  • 异常处理 handle or declare 原则应该如何理解
  • 怎么利用 JUnit 来测试一个方法的异常
  • catch块里别不写代码有什么问题
  • 你曾经自定义实现过异常吗?怎么写的
  • 什么是 异常链
  • 在try块中能够抛出异常吗

     

    JDBC

     

  • 经过 JDBC 链接数据库有哪几种方式
  • 阐述 JDBC 操做数据库的基本步骤
  • JDBC 中如何进行事务处理
  • 什么是 JdbcTemplate
  • 什么是 DAO 模块
  • 使用 JDBC 操做数据库时,如何提高读取数据的性能?如何提高更新数据的性能
  • 列出 5 个应该遵循的 JDBC 最佳实践

     

    IO

     

    File

     

  • File类型中定义了什么方法来建立一级目录
  • File类型中定义了什么方法来判断一个文件是否存在

     

     

  • 为了提升读写性能,能够采用什么流
  • Java中有几种类型的流
  • JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类
  • 对文本文件操做用什么I/O流
  • 对各类基本数据类型和String类型的读写,采用什么流
  • 能指定字符编码的 I/O 流类型是什么

     

    序列化

     

  • 什么是序列化?如何实现 Java 序列化及注意事项
  • Serializable 与 Externalizable 的区别

     

    Socket

     

  • socket 选项 TCP NO DELAY 是指什么
  • Socket 工做在 TCP/IP 协议栈是哪一层
  • TCP、UDP 区别及 Java 实现方式

     

  • 说几点 IO 的最佳实践
  • 直接缓冲区与非直接缓冲器有什么区别?
  • 怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么
  • 当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少
  • 如何使用扫描器类(Scanner Class)令牌化

     

    面向对象编程(OOP)

     

  • 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)
  • 多态的实现原理
  • 封装、继承和多态是什么
  • 对象封装的原则是什么?
  •  

  1. 得到一个类的类对象有哪些方式
  2. 重载(Overload)和重写(Override)的区别。重载的方法可否根据返回类型进行区分?
  3. 说出几条 Java 中方法重载的最佳实践

     

  • 抽象类

     

  1. 抽象类和接口的区别
  2. 抽象类中是否能够有静态的main方法
  3. 抽象类是否可实现(implements)接口
  4. 抽象类是否可继承具体类(concrete class)

     

  • 匿名类(Anonymous Inner Class)

     

  1. 匿名内部类是否能够继承其它类?是否能够实现接口

     

  • 内部类

     

  1. 内部类分为几种
  2. 内部类能够引用它的包含类(外部类)的成员吗
  3. 请说一下 Java 中为何要引入内部类?还有匿名内部类

     

  • 继承

     

  1. 继承(Inheritance)与聚合(Aggregation)的区别在哪里
  2. 继承和组合之间有什么不一样
  3. 为何类只能单继承,接口能够多继承
  4. 存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B
  5. 若是类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题

     

  • 接口

     

  1. 接口是什么
  2. 接口是否可继承接口
  3. 为何要使用接口而不是直接使用具体类?接口有什么优势

     

    泛型

     

  • 泛型的存在是用来解决什么问题
  • 泛型的经常使用特色
  • List可否转为List

     

    工具类

     

    日历

     

  • Calendar Class的用途
  • 如何在Java中获取日历类的实例
  • 解释一些日历类中的重要方法
  • GregorianCalendar 类是什么
  • SimpleTimeZone 类是什么
  • Locale类是什么
  • 如何格式化日期对象
  • 如何添加小时(hour)到一个日期对象(Date Objects)
  • 如何将字符串 YYYYMMDD 转换为日期

     

    Math

     

  • Math.round()什么做用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?

     

    XML

     

  • XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不一样?
  • Java解析XML的方式
  • 用 jdom 解析 xml 文件时如何解决中文问题?如何解析
  • 你在项目中用到了 XML 技术的哪些方面?如何实现

     

    动态代理

     

  • 描述动态代理的几种实现方式,分别说出相应的优缺点

     

    设计模式

     

  • 什么是设计模式(Design Patterns)?你用过哪一种设计模式?用在什么场合
  • 你知道哪些商业级设计模式?
  • 哪些设计模式能够增长系统的可扩展性
  • 单例模式

     

  1. 除了单例模式,你在生产环境中还用过什么设计模式?
  2. 写 Singleton 单例模式
  3. 单例模式的双检锁是什么
  4. 如何建立线程安全的 Singleton
  5. 什么是类的单例模式
  6. 写出三种单例模式实现

     

  • 适配器模式

     

  1. 适配器模式是什么?何时使用
  2. 适配器模式和代理模式以前有什么不一样
  3. 适配器模式和装饰器模式有什么区别

     

  • 何时使用享元模式
  • 何时使用组合模式
  • 何时使用访问者模式
  • 什么是模板方法模式
  • 请给出1个符合开闭原则的设计模式的例子

     

    开放问题

     

  • 用一句话归纳 Web 编程的特色
  • Google是如何在一秒内把搜索结果返回给用户
  • 哪一种依赖注入方式你建议使用,构造器注入,仍是 Setter方法注入
  • 树(二叉或其余)造成许多普通数据结构的基础。请描述一些这样的数据结构以及什么时候可使用它们
  • 某一项功能如何设计
  • 线上系统忽然变得异常缓慢,你如何查找问题
  • 什么样的项目不适合用框架
  • 新浪微博是如何实现把微博推给订阅者
  • 简要介绍下从浏览器输入 URL 开始到获取到请求界面以后 Java Web 应用中发生了什么
  • 请你谈谈SSH整合
  • 高并发下,如何作到安全的修改同一行数据
  • 12306网站的订票系统如何实现,如何保证不会票不被超卖
  • 网站性能优化如何优化的
  • 聊了下曾经参与设计的服务器架构
  • 请思考一个方案,实现分布式环境下的 countDownLatch
  • 请思考一个方案,设计一个能够控制缓存整体大小的自动适应的本地缓存
  • 在你的职业生涯中,算得上最困难的技术挑战是什么
  • 如何写一篇设计文档,目录是什么
  • 大写的O是什么?举几个例子
  • 编程中本身都怎么考虑一些设计原则的,好比开闭原则,以及在工做中的应用
  • 解释一下网络应用的模式及其特色
  • 设计一个在线文档系统,文档能够被编辑,如何防止多人同时对同一份文档进行编辑更新
  • 说出数据链接池的工做机制是什么
  • 怎么获取一个文件中单词出现的最高频率
  • 描述一下你最经常使用的编程风格
  • 若是有机会从新设计大家的产品,你会怎么作
  • 如何搭建一个高可用系统
  • 如何启动时不需输入用户名与密码
  • 如何在基于Java的Web项目中实现文件上传和下载
  • 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。
  • 如何实现负载均衡,有哪些算法能够实现
  • 如何设计一个购物车?想一想淘宝的购物车如何实现的
  • 如何设计一套高并发支付方案,架构如何设计
  • 如何设计创建和保持 100w 的长链接
  • 如何避免浏览器缓存。
  • 如何防止缓存雪崩
  • 若是AB两个系统互相依赖,如何解除依
  • 若是有人恶意建立非法链接,怎么解决
  • 若是有几十亿的白名单,天天白天须要高并发查询,晚上须要更新一次,如何设计这个功能
  • 若是系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
  • 若是要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现
  • 若是让你实现一个并发安全的链表,你会怎么作
  • 应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各类方式的区别?你使用过的应用服务器优化技术有哪些
  • 大型网站在架构上应当考虑哪些问题
  • 有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的
  • 最近看什么书,印象最深入的是什么
  • 描述下经常使用的重构技巧
  • 你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里
  • 你有了解过存在哪些反模式(Anti-Patterns)吗
  • 你用过的网站前端优化的技术有哪些
  • 如何分析Thread dump
  • 你如何理解AOP中的链接点(Joinpoint)、切点(Pointcut)、加强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念
  • 你是如何处理内存泄露或者栈溢出问题的
  • 大家线上应用的 JVM 参数有哪些
  • 怎么提高系统的QPS和吞吐量

     

    知识面

     

  • 解释什么是 MESI 协议(缓存一致性)
  • 谈谈 reactor 模型
  • Java 9 带来了怎样的新功能
  • Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用
  • 简单讲讲 Tomcat 结构,以及其类加载器流程
  • 虚拟内存是什么
  • 阐述下 SOLID 原则
  • 请简要讲一下你对测试驱动开发(TDD)的认识
  • CDN实现原理
  • Maven 和 ANT 有什么区别
  • UML中有哪些经常使用的图

     

  • Linux

     

  1. Linux 下 IO 模型有几种,各自的含义是什么。
  2. Linux 系统下你关注过哪些内核参数,说说你知道的
  3. Linux 下用一行命令查看文件的最后五行
  4. 平时用到哪些 Linux 命令
  5. 用一行命令输出正在运行的 Java 进程
  6. 使用什么命令来肯定是否有 Tomcat 实例运行在机器上

     

  • 什么是 N+1 难题
  • 什么是 paxos 算法
  • 什么是 restful,讲讲你理解的 restful
  • 什么是 zab 协议
  • 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别
  • 什么是领域驱动开发(Domain Driven Development)
  • 介绍一下了解的 Java 领域的 Web Service 框架
  • Web Server、Web Container 与 Application Server 的区别是什么
  • 微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里
  • 描述 Cookie 和 Session 的做用,区别和各自的应用范围,Session工做原理
  • 你经常使用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具备哪些
  • 简述下数据库正则化(Normalizations)
  • KISS,DRY,YAGNI 等原则是什么含义
  • 分布式事务的原理,优缺点,如何使用分布式事务?
  • 布式集群下如何作到惟一序列号
  • 网络

     

  1. HTTPS 的加密方式是什么,讲讲整个加密解密流程
  2. HTTPS和HTTP的区别
  3. HTTP链接池实现原理
  4. HTTP集群方案
  5. Nginx、lighttpd、Apache三大主流 Web服务器的区别

     

  • 是否看过框架的一些代码
  • 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些
  • 数值提高是什么
  • 你能解释一下里氏替换原则吗
  • 你是如何测试一个应用的?知道哪些测试框架
  • 传输层常见编程协议有哪些?并说出各自的特色

     

    编程题

     

    计算加班费

     

    加班10小时如下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工做26天,一天正常工做8小时)

     

  • 计算1000月

什么是springboot

        用来简化spring应用的初始搭建以及开发过程 使用特定的方式来进行配置(properties或yml文件) 

 

                建立独立的spring引用程序 main方法运行

 

                嵌入的Tomcat 无需部署war文件

 

                简化maven配置

 

                自动配置spring添加对应功能starter自动化配置

 

                

 

springboot经常使用的starter有哪些

 

        spring-boot-starter-web 嵌入tomcat和web开发须要servlet与jsp支持

 

        spring-boot-starter-data-jpa 数据库支持

 

        spring-boot-starter-data-redis redis数据库支持

 

        spring-boot-starter-data-solr solr支持

 

        mybatis-spring-boot-starter 第三方的mybatis集成starter

 

        

 

springboot自动配置的原理

 

        在spring程序main方法中 添加@SpringBootApplication或者@EnableAutoConfiguration

 

        会自动去maven中读取每一个starter中的spring.factories文件  该文件里配置了全部须要被建立spring容器中的bean

 

 

 

springboot读取配置文件的方式

 

        springboot默认读取配置文件为application.properties或者是application.yml

 

        

 

springboot集成mybatis的过程

 

        添加mybatis的starter maven依赖

 

                <dependency>

 

                        <groupId>org.mybatis.spring.boot</groupId>

 

                        <artifactId>mybatis-spring-boot-starter</artifactId>

 

                        <version>1.2.0</version>

 

                </dependency>

 

        在mybatis的接口中 添加@Mapper注解

 

        在application.yml配置数据源信息

 

        

 

springboot如何添加【修改代码】自动重启功能

 

        添加开发者工具集=====spring-boot-devtools

 

        

 

什么是微服务

 

        之前的模式是 全部的代码在同一个工程中 部署在同一个服务器中 同一个项目的不一样模块不一样功能互相抢占资源

 

        微服务 将工程根据不一样的业务规则拆分红微服务 微服务部署在不一样的机器上 服务之间进行相互调用

 

        Java微服务的框架有 dubbo(只能用来作微服务),spring cloud(提供了服务的发现,断路器等)

 

        

 

springcloud如何实现服务的注册和发现

 

        服务在发布时 指定对应的服务名(服务名包括了IP地址和端口) 将服务注册到注册中心(eureka或者zookeeper)

 

        这一过程是springcloud自动实现 只须要在main方法添加@EnableDisscoveryClient  同一个服务修改端口就能够启动多个实例

 

        调用方法:传递服务名称经过注册中心获取全部的可用实例 经过负载均衡策略调用(ribbon和feign)对应的服务

 

 

 

ribbon和feign区别

 

        Ribbon添加maven依赖 spring-starter-ribbon 使用@RibbonClient(value="服务名称") 使用RestTemplate调用远程服务对应的方法

 

        feign添加maven依赖 spring-starter-feign 服务提供方提供对外接口 调用方使用 在接口上使用@FeignClient("指定服务名")

 

Ribbon和Feign的区别:

 

        Ribbon和Feign都是用于调用其余服务的,不过方式不一样。

 

        1.启动类使用的注解不一样,Ribbon用的是@RibbonClient,Feign用的是@EnableFeignClients。

 

        2.服务的指定位置不一样,Ribbon是在@RibbonClient注解上声明,Feign则是在定义抽象方法的接口中使用@FeignClient声明。

 

        3.调用方式不一样,Ribbon须要本身构建http请求,模拟http请求而后使用RestTemplate发送给其余服务,步骤至关繁琐。

 

        Feign则是在Ribbon的基础上进行了一次改进,采用接口的方式,将须要调用的其余服务的方法定义成抽象方法便可,

 

        不须要本身构建http请求。不过要注意的是抽象方法的注解、方法签名要和提供服务的方法彻底一致。

 

        

 

springcloud断路器的做用

 

        当一个服务调用另外一个服务因为网络缘由或者自身缘由出现问题时 调用者就会等待被调用者的响应 当更多的服务请求到这些资源时

 

                致使更多的请求等待 这样就会发生连锁效应(雪崩效应) 断路器就是解决这一问题

 

                断路器有彻底打开状态

 

                        必定时间内 达到必定的次数没法调用 而且屡次检测没有恢复的迹象 断路器彻底打开,那么下次请求就不会请求到该服务

 

                半开

 

                        短期内 有恢复迹象 断路器会将部分请求发给该服务 当能正常调用时 断路器关闭

 

                关闭

 

                        当服务一直处于正常状态 能正常调用 断路器关闭
相关文章
相关标签/搜索