Java 面试题 自己写的答案

基本概念

 

  • 操作系统中 heap 和 stack 的区别
    栈(stack)与堆(heap)都是Java用来在内存中存放数据的地方。
    与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。
    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。
    当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
    堆内存用来存放由new创建的对象和数组,
    在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。
    在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。
    引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。
    Java中变量在内存中的分配: 
      1、类变量(static修饰的变量):在程序加载时系统就为它在堆中开辟了内存,堆中的内存地址存放于栈以便于高速访问。静态变量的生命周期–一直持续到整个”系统”关闭。 
      2、实例变量:当你使用java关键字new的时候,系统在堆中开辟并不一定是连续的空间分配给变量(比如说类实例),然后根据零散的堆内存地址,通过哈希算法换算为一长串数字以表征这个变量在堆中的”物理位置”。
       实例变量的生命周期–当实例变量的引用丢失后,将被GC(垃圾回收器)列入可回收“名单”中,但并不是马上就释放堆中内存。 
      3、局部变量:局部变量,由声明在某方法,或某代码段里(比如for循环),执行到它的时候在栈中开辟内存,当局部变量一但脱离作用域,内存立即释放。 
       详细请看:https://www.cnblogs.com/songanwei/p/9386418.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文件配置,而不是注解,是更加通用的方式。
    
    详细请看:https://www.cnblogs.com/songanwei/p/9386462.html
  • 什么是 对象/关系 映射集成模块
    所谓对象关系映射(Object Relational Mapping,简称ORM)是通过使用描述对象和数据库之间映射的元数据,将面向对象语言程序中的对象自动持久化到关系数据库中。本质上就是将数据从一种形式转换到另外一种形式。
    详细一点,是 面向对象编程中的 对象(Object)
    和关系数据库的 关系(Relation)  
    的一个映射(Mapping)。
    面试的时候一句话:
    对象关系映射是 在关系型数据库和业务实体对象之间做一个映射,这样,在具体的操作业务对象的时候,就不需要再去和复杂的SQL语句打交道了,只要像平时操作对象一样就可以了
    详细请看:https://www.cnblogs.com/songanwei/p/9386666.html
  • 什么是 Java 的反射机制
    Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的所有属性和方法,对于任意一个对象都能够调用它的任意一个属性和方法。这种在运行时动态的获取信息以及动态调用对象的方法的功能称为Java 的反射机制。
    面试的时候一句话
    java反射机制在运行的时候可以通过反射机制获得任意一个类的所有属性跟方法,也可以调用它的属性跟方法.
    想再获得点分数 可以接着说
    Spring 中的 IOC 的底层实现原理就是反射机制,Spring 的容器会帮我们创建实例,该容器中使用的方法就是反射,通过解析xml文件,获取到id属性和class属性里面的内容,利用反射原理创建配置文件里类的实例对象,存入到Spring的bean容器中。
    详细请看:https://www.cnblogs.com/songanwei/p/9386749.html
  • 什么是 ACID
    事务(Transaction)是由一系列对系统中数据进行访问与更新的操作所组成的一个程序 执行逻辑单元(Unit)。
    狭义上的事务特指数据库事务。一方面,当多个应用程序并发访问数据库时,事务可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。
    另一方面,事务为数据库操作序列提供了一个从失败中恢复到正常状态的方法, 同时提供了数据库即使在异常状态下仍能保持数据一致性的方法。
    事务具有四个特征,分别足原子性(Atomicity )、一致性(Consistency )、隔离性(Isolation) 和持久性(Durability),简称为事务的ACID特性。
    详细请看:https://www.cnblogs.com/songanwei/p/9387526.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的区别

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

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

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

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

    5、可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。

    详细请看:https://www.cnblogs.com/songanwei/p/9387696.html
  • fail-fast 与 fail-safe 机制有什么区别
    快速失败(fail—fast)在用迭代器遍历一个集合对象时,如果遍历过程中对集合对象的内容进行了修改(增加、删除、修改),则会抛出Concurrent Modification Exception。
    java.util包下的集合类都是快速失败的,不能在多线程下发生并发修改(迭代过程中被修改)。 安全失败(fail—safe)采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。 java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。
    详细请看:https://www.cnblogs.com/songanwei/p/9387745.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(返回数据)。
    详细请看:https://www.cnblogs.com/songanwei/p/9387815.html
  • Interface 与 abstract 类的区别
    先从总体解释抽象类和接口的基本概念,然后再比较两者的语法细节,最后再说两者的应用区别。
    
    比较两者语法细节区别的条理是:先从一个类中的构造方法、普通成员变量和方法(包括抽象方法),静态变量和方法,继承性等6个方面逐一去比较回答,接着从第三者继承的角度的回答,特别是最后用了一个典型的例子来展现自己深厚的技术功底。

    抽象类(abstract)

    
    

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

    
    

    含有abstract方法的类必须定义为abstract class,abstract class类中的方法不必是抽象的。

    
    

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

    
    

    如果的子类没有实现抽象父类中的所有抽象方法,那么子类也必须定义为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. 一个类可以实现多个接口,但只能继承一个抽象类。

    
    
    详细请看:https://www.cnblogs.com/songanwei/p/9389005.html
     
  • IOC的优点是什么
    先把IOC的概念说出来
    
    依赖注入和控制反转
    
    所谓的依赖注入是甲方开放接口,在它需要的时候,能够将乙方传递进来(注入);所谓的控制反转,甲乙双方不相互依赖,交易活动的进行不依赖于甲乙任何一方,整个活动的进行由第三方负责管理。这就是spring IoC的思想所在。
    
    然后说优缺点
    
    IOC的优点:实现组件之间的解耦,提高程序的灵活性和可维护性。
    IOC的缺点:
    1、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
    2、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
    3、缺少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.如果需要管理同时打开不太多的连接,这些连接会发送大量的数据;
    详细请看:https://www.cnblogs.com/songanwei/p/9389206.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不用关心数据库连接速度、各种事务控制,直接由容器来完成。
    详细请看:https://www.cnblogs.com/songanwei/p/9417267.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)类加载器作为自己的父亲。

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

    详情:https://www.cnblogs.com/songanwei/p/9417286.html

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

  • 解释一下什么叫AOP(面向切面编程)
    这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。
    
    AOP是Spring提供的关键特性之一。AOP即面向切面编程,是OOP编程的有效补充。
    使用AOP技术,可以将一些系统性相关的编程工作,独立提取出来,独立实现,然后通过切面切入进系统。
    从而避免了在业务逻辑的代码中混入很多的系统相关的逻辑——比如权限管理,事物管理,日志记录等等。这些系统性的编程工作都可以独立编码实现,然后通过AOP技术切入进系统即可。
    从而达到了 将不同的关注点分离出来的效果。
    详情请看:https://www.cnblogs.com/songanwei/p/9417343.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()方法时,这些线程已经终止或完成。
    详情请看:https://www.cnblogs.com/songanwei/p/9417376.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
    详情:https://www.cnblogs.com/wanghp/p/6991554.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断路器的作用
        当一个服务调用另一个服务由于网络原因或者自身原因出现问题时 调用者就会等待被调用者的响应 当更多的服务请求到这些资源时
                导致更多的请求等待 这样就会发生连锁效应(雪崩效应) 断路器就是解决这一问题
                断路器有完全打开状态
                        一定时间内 达到一定的次数无法调用 并且多次检测没有恢复的迹象 断路器完全打开,那么下次请求就不会请求到该服务
                半开
                        短时间内 有恢复迹象 断路器会将部分请求发给该服务 当能正常调用时 断路器关闭
                关闭
                        当服务一直处于正常状态 能正常调用 断路器关闭
  •  
原文地址:https://www.cnblogs.com/songanwei/p/9366427.html