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 类的区别
  • IOC的优点是什么
  • IO 和 NIO的区别,NIO优点
  • Java 8 / Java 7 为我们提供了什么新功能
  • 什么是竞态条件? 举个例子说明。
  • JRE、JDK、JVM 及 JIT 之间有什么不同
  • MVC的各个部分都有那些技术来实现?如何实现?
  • RPC 通信和 RMI 区别
  • 什么是 Web Service(Web服务)
  • JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
  • WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。
  • 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制
  • 简单说说你了解的类加载器。是否实现过类加载器
  • 解释一下什么叫AOP(面向切面编程)
  • 请简述 Servlet 的生命周期及其相关的方法
  • 请简述一下 Ajax 的原理及实现步骤
  • 简单描述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月

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值