Java面试1000题
Yu.Zhansheng
请大家多多指教!
展开
-
Java工程师面试1000题31-40
31、简述Java的异常处理机制。Java对异常进行了分类,不同类型的异常分别使用了不同的Java类表示,所有异常的父类为java.lang.Throwable,Throwable类下面派生了两个子类:Error和Exception,Error表示应用程序本身无法克服和恢复的一种严重问题;Exception表示程序还能够克服和恢复的问题,其中Exception又分为系统异常和普通异常,系统异常...原创 2019-03-05 21:29:01 · 711 阅读 · 0 评论 -
Java工程师面试1000题153-Java8新特性之并行流和串行流
153、Java8新特性之并行流和串行流并行流就是把一个内容分成多个数据块,并用不同的线程分别处理每个数据块的流。Java8中将并行做了优化,我们可以很容易的对数据进行并行操作。StreamAPI可以声明性的通过parallel()与sequential()在并行流与顺序流之间进行切换。再说并行流之前,我们先了解一个框架Fork/Join:Fork/Join框架就是在必要情况下,将一个大的...原创 2019-03-27 10:51:34 · 338 阅读 · 0 评论 -
Java工程师面试1000题160-219
本博客内容整理来自牛客网:https://www.nowcoder.com/ta/review-java及网友评论。若有侵权,请联系删除。155、什么是HTTP隧道?HTTP隧道是一种利用HTTP或者是HTTPS把多种网络协议封装起来进行通信的技术。因此,HTTP协议扮演了一个打通用于通信的网络协议的管道的包装器的角色。把其他协议的请求掩盖成HTTP的请求就是HTTP隧道。156、...转载 2019-04-04 17:11:56 · 533 阅读 · 0 评论 -
Java工程师面试1000题152-Stream API编程练习
152、Stream API编程练习①给定一个数字列表,如何返回一个由每个数的平方构成的列表?给定【1,2,3,4,5】返回【1,4,9,16,25】 @Test public void test1(){ Integer[] nums = new Integer[]{1,2,3,4,5}; Arrays.stream(nums).map((x...原创 2019-03-26 21:11:50 · 464 阅读 · 0 评论 -
Java工程师面试1000题146-Spring支持的数据库事务传播属性和隔离级别
146、简介一下Spring支持的数据库事务传播属性和隔离级别介绍Spring所支持的事务和传播属性之前,我们先了解一下SpringBean的作用域,与此题无关,仅做一下简单记录。在Spring中,可以在<bean>元素的scope属性中设置bean的作用域,来决定这个bean是单实例的还是多实例的。默认情况下,Spring只为每个在IOC容器里声明的bean创建唯一的实例,整...原创 2019-03-19 16:00:10 · 321 阅读 · 0 评论 -
Java工程师面试1000题151- Java8新特性之Stream API
151、了解Stream API吗?说说它Java8中有两大最为重要的改变。第一个是Lambda表达式;另外一个是StreamAPI。Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用StreamAPI对集合数据进行操作,就类似于使用SQL执行的数据库查询一样简单。也可以使用StreamAPI来执行并行操作。简...原创 2019-03-26 20:39:52 · 312 阅读 · 0 评论 -
Java工程师面试1000题145-成员变量和局部变量
145、程序执行结果?答案:2 1 51 1 5解析:这道题的考点主要有四个:变量的变量的分类(成员变量、局部变量)、就近原则、非静态代码块的执行:每次创建实例都会执行、方法的调用:调用一次执行一次。先看一下变量的分类:Java中变量可以分为局部变量和成员变量。局部变量一般是在方法体{}中、形参、代码块{}中。成员变量是在类中方法外。成员变量中又可细分为两类,一类是被sta...原创 2019-03-18 17:37:13 · 384 阅读 · 0 评论 -
Java工程师面试1000题150-方法引用和构造器引用
150、说一下什么是方法引用和构造器引用①方法引用:若Lambda体中的内容有方法已经实现了,我们可以使用方法引用,可以把方法引用理解为是Lambda表达式的另外一种表现形式。主要有三种语法格式:对象::实例方法名 类::静态方法名 类::实例方法名注意:Lambda体中调用方法的参数列表和返回值类型要与函数式接口中抽象方法的参数列表和返回值类型保持一致。 若Lambda参...原创 2019-03-25 09:44:45 · 176 阅读 · 0 评论 -
Java工程师面试1000题144-方法参数的传递机制
144、看下面程序的执行结果import java.util.Arrays;public class Exam4 { public static void main(String[] args) { int i = 1; String str = "hello"; Integer num = 200; int[] a...原创 2019-03-18 11:04:25 · 187 阅读 · 0 评论 -
Java工程师面试1000题154-冒泡、选择、插入排序
154、冒泡、选择、插入排序冒泡排序:冒泡排序重复地走访过要排序的元素列,依次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素已经排序完成。这个算法的名字由来是因为越大的元素会经由交换慢慢“浮”到数列的顶端(升序或降序排列),就如同碳酸饮料中二氧化碳的气泡最终会上浮到顶端一样,故名“冒泡...原创 2019-03-28 10:41:55 · 181 阅读 · 0 评论 -
Java工程师面试1000题221-Java的指令重排与volatile关键字
221、Java的指令重排与volatile关键字如果要用一句话来概括volatile关键字的作用,我会这么说:使用volatile关键字,它能够使被修饰的变量在值发生改变时尽快地让其他线程知道。下面我们再来详细解释一下volatile关键字和指令重排。首先,我们需要知道的是,编译器为了加快程序的运行速度,对一些变量的写操作会首先在速度更快的寄存器和CPU高速缓存中进行,然后才再将变量刷新...原创 2019-04-10 16:58:28 · 510 阅读 · 0 评论 -
《剑指offer》得到一个数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。解题思路:前言: Java的PriorityQueue 是从JDK1.5开始提供的...原创 2019-08-05 10:52:26 · 194 阅读 · 0 评论 -
《剑指offer》一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。
首先:位运算中异或的性质:两个相同数字异或=0,一个数和0异或还是它本身。当只有一个数出现一次时,我们把数组中所有的数,依次异或运算,最后剩下的就是落单的数,因为成对儿出现的都抵消了。依照这个思路,我们来看两个数(我们假设是AB)出现一次的数组。我们首先还是先异或,剩下的数字肯定是A、B异或的结果,这个结果的二进制中的1,表现的是A和B的不同的位。我们就取第一个1所在的位数,假设是第3位,...原创 2019-08-05 09:53:37 · 2453 阅读 · 0 评论 -
Java工程师面试1000题225-CAS原理解析
225、CAS原理解析在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个...原创 2019-04-24 21:30:12 · 178 阅读 · 0 评论 -
Java工程师面试1000题226-什么是ABA问题?
226、什么是ABA问题?上篇博客最后讲到了CAS会导致“ABA问题”,那到底什么是ABA问题呢?下面介绍一下。CAS算法实现一个重要前提需要取出内存中某一个时刻的数据并在当下时刻做比较和替换。从思想上来说,Synchronized属于悲观锁,悲观地认为程序中的并发情况严重,所以严防死守。CAS属于乐观锁,乐观地认为程序中的并发情况不那么严重,所以让线程不断去尝试更新。我们先再引入一个...原创 2019-04-25 20:43:30 · 603 阅读 · 0 评论 -
Java工程师面试1000题224-使用递归和非递归实现二叉树的前、中、后序遍历
224、使用递归和非递归实现二叉树的前、中、后序遍历使用递归来实现二叉树的前、中、后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现。class Node { public int value; public Node left; public Node right; public Node() { } public Node(i...原创 2019-04-12 19:56:56 · 207 阅读 · 0 评论 -
Java工程师面试1000题220-Class.forName 和 ClassLoader 有什么区别?
220、Class.forName 和 ClassLoader 有什么区别?在 java 中 Class.forName() 和 ClassLoader 都可以对类进行加载。ClassLoader 就是遵循双亲委派模型最终调用启动类加载器,实现的功能是“通过一个类的全限定名来获取描述此类的二进制字节流”,获取到二进制流后放到 JVM 中。Class.forName() 方法实际上也是调用的 C...原创 2019-04-09 11:31:11 · 174 阅读 · 2 评论 -
Java工程师面试1000题223-JDK1.8中JVM的变化:元空间的引入
223、JDK1.8中JVM的变化:元空间的引入在介绍Java8中的JVM变化之前,我们先来回归一下Java的内存模型:根据JVM规范,JVM内存共分为虚拟机栈、本地方法栈、堆、程序计数器、方法区五个部分:1、虚拟机栈:每一个线程私有,线程之间彼此隔离,随着线程的创建而创建。栈里面存放的是一个叫做“栈帧”的东西,没去执行一个方法的时候就创建一个栈帧,栈帧里面存放的是局部变量表(基本...原创 2019-04-11 16:04:02 · 485 阅读 · 0 评论 -
Java工程师面试1000题222-Java并发编程及线程池
222、Java并发编程及线程池一、ThreadPoolExecutorJava并发编程及线程池是BAT等大公司面试必问知识点,因此必须好好掌握。提到并发编程我们首先会想到线程池,为什么要使用线程池?主要有三点:第一、使用线程池可以减少在创建和销毁线程上所花费的时间以及系统资源的开销,如果不使用线程池,可能会造成系统频繁创建和销毁大量线程;第二、使用线程池可以提高响应速度;...原创 2019-04-10 19:43:36 · 274 阅读 · 0 评论 -
Java工程师面试1000题111-120
111、说说你对Java中反射的理解。Java中的反射是可以让我们在运行时获取类的方法、属性、父类、接口等类的内部信息的机制。也就是说,反射本质上是一个“反着来”的过程。我们通过new创建一个类的实例的时候,实际上是由Java虚拟机根据这个类的Class对象在运行时构建出来的,而反射是通过一个类的Class对象来获取它的定义信息,从而我们可以访问到它的属性、方法,知道这个类的父类、实现哪些接口...原创 2019-03-12 21:56:51 · 307 阅读 · 0 评论 -
Java工程师面试1000题149-Java8新特性之Lambda表达式
149、说一下Java8新特性之一的Lambda表达式Lambda表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码块)。Lambda表达式还增强了集合库。 Java SE 8添加了2个对集合数据进行批量操作的包:java.util.function包以及java.util.str...原创 2019-03-21 20:10:03 · 3374 阅读 · 0 评论 -
Java工程师面试1000题11-20
11、复制对象和复制引用的区别?有如下程序:Person p = new Person(23,"zhang");Person p1 = p;System.out.println(p);System.out.println(p1); 程序执行后看打印结果:com.xidian.Person@2f4ee1accom.xidian.Person@2f4ee1ac可以看出,...原创 2019-03-04 20:00:07 · 856 阅读 · 0 评论 -
Java工程师面试1000题81-90
81、说一说你知道的JVM的垃圾收集算法。标记-清除算法 复制算法 标记-整理算法 分代收集算法82、再说说标记-清除算法。标记-清除算法分为“标记”和清除两个阶段;首先需要标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象,它是最基础的收集算法,效率也很高,但是会带来两个明显的问题:效率问题和空间问题(标记清除后会产生大量不联系的碎片)。为便于理解,如下图所示:...原创 2019-03-10 12:01:24 · 273 阅读 · 1 评论 -
Java工程师面试1000题1-10
1、面向对象的特性和对这些特性的理解默认情况下面向对象有3大特性:封装、继承、多态,如果非要说出四大特性,那么就把抽象加上去。封装:通常认为,封装就是把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口。面向对象的本质就是将现实世界描绘成一系列完全自治、封闭的对象。我们在类中编写的方法就是对实现细节的一种封装;我们编写的的一个类就是对数据和数据操作的封装。可以说,封装就是隐藏一...原创 2019-03-04 17:29:12 · 2017 阅读 · 5 评论 -
Java工程师面试1000题71-80
71、什么是线程安全和线程不安全?线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护隔离,使其他线程不能进行访问,直到该线程读取完,其他线程才可以使用,不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成得到的数据是脏数据,如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次...原创 2019-03-09 21:54:38 · 366 阅读 · 0 评论 -
Java工程师面试1000题121-130
121、Java虚拟机结束生命周期的几种情形?程序正常执行结束 程序执行了System.exit()方法 程序在执行过程中遇到了异常或者错误而异常终止 由于操作系统出现错误从而导致Java虚拟机进程终止122、详细介绍一下Java类的加载、连接和初始化的过程。加载:查找并加载类的二进制数据,实际上就是把类的class文件中的二进制数据从磁盘读到内存里面,并且将其放置在运行时数据区内...原创 2019-03-14 15:34:25 · 230 阅读 · 0 评论 -
Java工程师面试1000题41-50
41、什么是Java序列化?如何实现Java序列化?序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化,可以对流化后的对象进行读写操作,也可以将流化后的对象传输与网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化就是把Java对象转为字节序列的过程;反序列化就是把字节序列恢复为Java对象的过程。对象序列化主要有两种用途:第一是把对象的字节序列保存...原创 2019-03-06 22:05:11 · 1911 阅读 · 0 评论 -
Java工程师面试1000题61-70
61、Map中的key和value可以为null吗?HashMap对象的key和value均可以为null;HashTable对象的key和value均不可以为null。且两者的key值均不能重复,若添加key相同的键值对后,后面的value会自动覆盖前面的value,但是不会报错。62、什么是线程互斥和线程同步?在引入多线程后,由于线程执行的异步性,会给系统造成混乱,特别是在...原创 2019-03-08 21:24:50 · 452 阅读 · 0 评论 -
Java工程师面试1000题21-30
21、当一个对象被当做参数传递给一个方法后,此方法可以改变这个对象的属性,并且可返回变化后的结果,那么这里到底是值传递还是引用传递?值传递。Java语言的方法调用只支持参数的值传递。当一个对象实例作为一个参数被传递到方法中的时候,参数的值就是该对象的引用,对象的属性可以在被调用的过程中修改,但对对象引用的改变是不会影响到调用者的。22、重载(overload)和重写(override)的区...原创 2019-03-04 22:20:53 · 543 阅读 · 0 评论 -
Java工程师面试1000题91-100
91、JVM的类加载机制是什么?有哪些实现方式?类加载机制:类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法去内,然后在堆区创建一个java.lang.Class对象,用来封装在方法区内的数据结构。类的加载最终是在堆区内的Class对象,Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。类加载有三种...原创 2019-03-10 22:39:20 · 523 阅读 · 1 评论 -
Java工程师面试1000题143-单例设计模式详解
143、说出你所知道的所有单例设计模式写法首先我们需要知道什么是单例设计模式,所谓单例设计模式,即某个类在整个系统当中只能有一个实例对象可以被获取和使用的编码模式。他是软件开发中最常使用的设计模式之一。单例设计模式要点:该类只能有一个实例:需把该类的构造器私有化; 它必须自行创建这个实例:定义一个该类的静态变量来保存这个唯一的实例 它必须向自行向整个系统提供这个实例:对外提供获取该...原创 2019-03-17 16:06:19 · 246 阅读 · 2 评论 -
Java工程师面试1000题148-Java8四大核心内置函数式接口
148、Java8四大核心内置函数式接口Consumer<T> :消费型接口 方法:void accept(T t); Supplier<T> :供给型接口 方法:T get(); Function<T,R> :函数型接口 方法:R apply(T t); Predicate<T> :断言型接口 方法:boolean...原创 2019-03-20 16:01:56 · 224 阅读 · 0 评论 -
Java工程师面试1000题142-类的初始化和实例初始化
142、读程序分析执行结果public class Son extends Father { private int i = test(); private static int j = method(); static { System.out.print(" [6] "); } Son(){ System.out....原创 2019-03-16 21:53:35 · 248 阅读 · 5 评论 -
Java工程师面试1000题141-自增变量
141、下面代码的执行结果? public void test2(){ int i = 1; i = i++; int j = i++; int k = i + ++i * i++; System.out.println("现在i的值是:" + i); System.out.println("现...原创 2019-03-16 11:05:53 · 225 阅读 · 0 评论 -
Java工程师面试1000题101-110
101、为什么要使用线程池?线程池的作用就是限制系统中执行线程的数量。根据系统的环境情况,可以手动的或者自动的设置线程数量,少了浪费系统资源,多了造成系统拥挤效率不高。使用线程池控制线程数量,其他线程排队等候,一个任务执行完毕,再从队列中取出最靠前的任务开始执行。若队列中没有等待的线程,线程池的这一资源处于等待,当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了,,否则进入...原创 2019-03-11 20:50:44 · 643 阅读 · 0 评论 -
Java工程师面试1000题131-140
131、看程序说出执行结果public class MyTest2 { public static void main(String[] args) { System.out.println(MyParent2.str); }}class MyParent2{ public static final String str = "hello wor...原创 2019-03-15 22:16:30 · 216 阅读 · 0 评论 -
Java工程师面试1000题147-SpringMVC运行流程
147、说一下SpringMVC运行流程用户发送请求到中央控制器DispatcherServlet; 中央控制器调用处理器映射器HandlerMapping; 处理器映射器返回HandlerExecutionChain(包含程序中用到的处理器拦截器HandlerIntercepter和处理器对象Handler)给中央控制器; 中央处理器DispatcherServlet再调用处理器适...原创 2019-03-20 09:36:29 · 213 阅读 · 0 评论 -
Java工程师面试1000题51-60
51、讲一讲ArrayList的内部实现。回答这样的问题,不要光回答个皮毛,可以详细介绍一下ArrayList内部是如何实现数组的增加和删除的,要知道,数组在创建的时候长度是固定的,那么我们往ArrayList中不断添加对象的时候,它是如何管理的呢?ArrayList内部是使用Object[]数组实现的,接下来,我们分别分析一下ArrayList的构造、add、remove、clear方法...原创 2019-03-07 22:38:32 · 2995 阅读 · 5 评论 -
请描述一下Hadoop的shuffle过程
Hadoop的shuffle过程分为Map端和Reduce端。Map端:Map端会处理输入数据并产生中间结果,这个中间结果会写到本地磁盘,而不是HDFS。每个Map的输出会先写到内存缓冲区中,当写入的数据达到设定的阈值时,系统将会启动一个线程将缓冲区的数据写到磁盘,这个过程叫做spill。在spill写入之前,会先进行二次排序,首先根据数据所属的partition进行排序,然后每个pa...原创 2019-07-27 15:06:32 · 610 阅读 · 0 评论