《Java开发岗高频面试题全解.docx》由会员分享,可在线阅读,更多相关《Java开发岗高频面试题全解.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Java开发岗高频面试题全解Java 开发岗高频面试题全解 JAVA 零基础入门 一、基本语法 1. Java 常识 Java 语言的特点是什么? 面对对象 跨平台 支持多线程 简洁平安 没有指针 鲁棒性 自动垃圾回收机制 JDK、JRE、JVM 干脆的关系是什么? JDK Java Development Kit, Java 开发工具包 Java 的最小开发环境,由 JRE 和 Java 工具组成。 JRE Java Runtime Environment, Java 运行时环境 Java 的最小运行环境,由 JVM 和核心类库组成。 JVM Java Virtual Machine, Ja
2、va 虚拟机 是 Java 字节码运行的容器,须要加上核心类库才能运行 Java 独立于硬件和操作系统,具有平台无关性,供应了垃圾回收等机制。 请你比较一下 Java 和 JavaScript 面对对象和基于对象:Java 是一种真正的面对对象的语言,即使是开发简洁的程序,必需设计对象。JavaScript 是一种基于对象和事务驱动的编程语言,本身供应了丰富的内部对象供设计人员运用。 说明和编译:Java 是先编译后说明的语言。而 JavaScript 是一种说明性编程语言,其源代码不需经过编译,就可以由阅读器来说明执行。 强弱类型变量:Java 采纳强类型变量检查,即全部变量在编译之前必需作
3、声明。而JavaScript 中变量是弱类型的,在运用变量前可以不作声明。 简洁介绍一下 Java8 的新特性 Lambda 表达式:允许把函数作为方法的参数进行传递 方法引用:使得 Lambda 在调用那些已经拥有方法名的方法时更简洁、更简单理解 Stream API:引入了函数式编程风格 Date Time API:加强对日期与时间的处理 Optional 类:用来解决空指针异样(运用了一个没有实际值的对象) 新增接口的默认方法,default 关键字 Nashorn JavaScript 引擎:允许在 JVM 上运行特定的 JavaScript 应用 类依靠分析器:可以展示包层级和类层级
4、的 Java 类依靠关系 Javadependencies(jdeps) 请你说说 Lamda 表达式的优缺点 优点是简洁和简单实现并行计算。 缺点是不简单调试和非并行计算时速度慢,而并行计算也须要预热才能体现效率。 对 JIT 编译器有了解吗? 定义:JIT 编译器全名叫 Just In Time Compile 也就是即时编译器,把常常运行的代码作为热点代码编译成与本地平台相关的二进制机器码,并对变量进行逃逸分析,若确定不会被外部的线程和方法访问,则对其进行优化。 优化:同步消退(去掉 synchronized)、标量替换(将对象拆成标量)、栈上安排(减轻 GC 负担) 2. 数据类型 八
5、大基本数据类型是哪些?各自的字节数是多少? 整型byte/short/int/long 字节数 1/2/4/8 浮点型float/double 字节数 4/8 字符型char 字节数 2 布尔型boolean 字节数 1 补充 1:获得长度String.valueOf(object).length() 补充 2:自动类型转换,浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入 如何创建数组? int arrayName = new intsize;默认值为 0 int arrayName = new int 值 1,值 2,值 3,.,值 n; new int可以省略 什么是标量与聚合量?
6、标量(Scalar )就是八大基本数据类型,无法再分解成更小的数据 Java 中的对象就是聚合量(Aggregate),可以分解成其他聚合量和标量 int 和 Integer 有什么区分? 为了能够将包括 int 在内的八大基本数据类型当成对象操作,JAVA 为每一个基本数据类型都引入了对应的包装类,并设计了自动装箱/拆箱机制,使得二者可以相互转换。 例子: class AutoUnboxingTest public static void main(String args) Integer a = new Integer(3); / 将 3 自动装箱成 Integer 类型 Integer
7、b = 3; int c = 3; / false 两个引用没有引用同一对象 System.out.println(a = b); / true a 自动拆箱成 int 类型再和 c 比较 System.out.println(a = c); 请说明一下 String 为什么不行变?为什么要这样设计? 不行变是 String 类是 final 类,内部的 value 字节数组也是 final 类型 如此设计的用途包括:实现字符串池(节约堆空间)、实现多线程、确保 hash 码的唯一性(适合作为 Map 的键) 请你说明 String、StringBuffer 以及 StringBuilder
8、的区分 String 存储的字符串不行变,而 StringBuffer 以及 StringBuilder 是为可变字符串设计的 StringBuffer 带有 Synchronized 是线程平安的,StringBuilder 则在单线程时性能更好 String 对象作为参数传递给方法后,返回的结果却没有变更对象的属性,为什么? String、Interger 等 final 类型的引用,在方法调用后外边的结果不变,是因为 fianl 类型的引用是不行变的,有点类似于 C+中的常指针,在调用方法内事实上是新建了一个同名的局部引用对象,调用结束后就回收了。 3.关键字与符号 请你讲讲 Java
9、里面的 final 关键字是怎么用的? 类的角度:当用 final 修饰一个类时,表明这个类不能被继承。 方法角度:final 方法可以被继承但不允许被子类重写 不行用于修饰构造方法,因为子类本就不能重写父类构造方法 变量角度:类似于 C+中的 const,修饰基本数据类型后不行更改,修饰引用类型后无法再指向另一个对象 请你说明符号=比较的是什么? 对象是引用类型:两个引用指向同一个对象时返回 true,否则返回 false 对象是基本数据类型:比较数值是否相等 静态(static)与非静态的区分? 空间安排的角度:静态成员变量在类被加载时存放在常量池中,而非静态成员变量是存放在堆中,局部变量
10、存放在栈中 运用权限的角度:公有静态成员可以通过类名访问,静态成员函数不能调用非静态成员(还未被加载) 关键字 throws,throw,try,catch,finally 分别代表什么意义? try 来指定一块须要预防异样的代码 紧跟在 try 后,catch 子句用来指定捕获异样的类型,并做处理 throw 语句用来创建并抛出一个异样 throws 用来向上抛出异样 缺省处理器 finally 不管发生异样与否都执行其内容 Java 中的元注解有哪些? Java 中供应了 4 个元注解,元注解的作用是负责注解其它注解。 Target:说明注解所修饰的对象范围 例子: Target(Elem
11、entType.TYPE, ElementType.METHOD) public interface MyAnn 扩展:源码 public interface Target ElementType value(); public enum ElementType TYPE,FIELD,METHOD,PARAMETED,CONSTRUCTOR,LOCAL_VARIABLE,ANNOCATION_TYPE,PACKAGE,TYPE_PARAMETER,TYPE_USE Retention:定义了该注解被保留的时间长短 扩展:源码 public interface Retention Retenti
12、onPolicy value(); public enum RetentionPolicy SOURCE, CLASS, RUNTIME 其中,SOURCE:表示在源文件中有效(即源文件保留);CLASS:表示在 class 文件中有效(即 class 保留);RUNTIME:表示在运行时有效(即运行时保留) 例子: Retention(RetentionPolicy.RUNTIME)标注表示该注解在运行时有效 Inherited:修饰的 annotation 类型被用于一个 class,则这个 annotation 将被用于该 class 的子类 Documented:用于描述其它类型的 a
13、nnotation,可以被 javadoc 文档化 注解有什么作用?如何定义注解? 注解可以代替繁杂的配置文件,简化开发。 定义注解必需用interface 例子: public interface MyAnn String value(); int value1(); /定义注解时候的 value 就是属性,看着是一个方法,但我们称它为属性。当为注解指定属性后,那么在运用注解时就必需要给属性赋值了。 / 运用注解 MyAnn,设置属性 MyAnn(value1=100,value=hello) public class MyClass 4.其他基础 请说明 JAVA 语言如何进行异样处理 J
14、ava 通过面对对象的方法进行异样处理,每个异样都是一个对象,它是 Throwable 类或其子类的实例 当程序出现异样后便抛出一个异样对象,其中包含有异样信息,须要对其捕获并处理 哪类异样必需处理否则无法编译?举几个例子。 checked exception 受检异样也叫编译时异样 常见的有 SQLException、InterruptedException、IOException Java 中的 Exception 和 Error 有什么区分? Exception 是程序正常运行中预料到可能会出现的错误,应当被捕获并进行相应的处理,是一种异样现象,如 IOException Error 是
15、正常状况下不行能发生的错误,Error 会导致 JVM 处于一种不行复原的状态,不须要捕获处理,如 OutOfMemoryError 捕获异样应当遵循哪些原则? 尽可能捕获详细的异样,而不是运用 Exception 一起捕获 捕获异样后应有日志记录,便利之后的排查 不要运用一个很大的 try – catch 包住整段代码,不利于问题的排查 说说 Java 中反射机制 在程序运行中动态获得信息(类的全部属性和方法)和动态调用对象方法(动态代理)的功能称为反射机制 流行的框架如 Spring 的底层依靠 JAVA 的反射机制,也可以用反射实现 Java 程序和JDBC 驱动的松耦合 请
16、你简洁描述一下正则表达式及其用途 正则表达式是记录字符串文本规则的代码,在处理字符串数据时中可以通过编写正则表达式进行匹配分割等操作。 请你谈谈 Java 中是如何支持正则表达式操作的? Java 中的 String 类供应了支持正则表达式操作的方法,如 matches()、split()等 Java 中可以用 Pattern 类表示正则表达式对象,它供应了丰富的 API 进行各种正则表达式操作 什么是可变参数列表? public void sum(int p,int. n);实参可以为数组,影响重载 什么是增加型 for 循环? 又叫 foreach 循环,用于快速遍历 int arr=1,
17、2,3,4,5,6,7; for(int n:arr) System.out.println(n); 介绍 Java 序列化与反序列化的过程 将对象转换为字节序列存储到硬盘上的过程叫做对象的序列化 反序列化则是把硬盘上的字节序列读取复原成一个对象的过程 为什么会出现 4.0-3.6=0.40000001 这种现象? 计算机在计算 10 进制小数的过程中要先转换为 2 进制进行计算,这个过程中出现了误差 请推断当一个对象被当作参数传递给一个方法后,此方法可变更这个对象的属性,并可返回改变后的结果,那么这里究竟是值传递还是引用传递?为什么?请举例说明。 这是值传递。Java 只有值传递,没有引用传
18、递 假设新建一个引用 a,指向对象 b,其中栈中 a 的值就是堆中 b 的地址。方法 c 来调用这个对象 b 并返回改变后的结果 此时括号中实参应当写 a 而不是 b,而传递的内容是 a 的值而不是 a 在栈中的地址,所以说这是值传递不是引用传递 二、面对对象 1. 基本概念 说说什么是面对对象? 现实世界中任何实体都可以看作是对象,对象之间通过消息相互作用。 请你谈一下面对对象的六原则一法则 单一职责原则:一个类只做它该做的事情 开闭原则:软件实体应当对扩绽开放,对修改关闭 依靠倒转原则:声明时尽可能运用抽象类,面对接口编程 里氏替换原则:任何时候都可以用子类型替换掉父类型 接口隔离原则:接
19、口要小而专,绝不能大而全 合成聚合复用原则:优先运用合成或聚合关系复用代码,而不是继承 迪米特法则:又叫最少学问原则,一个对象应当对其他对象尽可能了解得少 Object 类有什么作用? Object 类是全部类的父类,Java 中的每个类都可以运用 Object 中定义的方法 一个类没有运用 extends 关键字明确标识继承关系,则默认继承 Object 类(包括数组) Object 类的常用方法有哪些? toString():以字符串对象的形式返回当前对象本身的有关信息 equals():比较两个对象是否是同一个对象,是则返回 true hashCode():返回该对象的哈希代码值 get
20、Class():获得当前对象所属的类信息,返回 Class 对象 notify()/notifyAll():唤醒在此对象监视器上等待的单个/全部线程 clone():创建并返回此对象的一个副本。 finalize():由对象的垃圾回收器调用 wait():当前的线程等待 2. 三大特性 简洁描述面对对象的三大特性。 封装是指类隐藏数据和过程等信息,留出访问的接口,可以削减耦合,增加平安性。 继承是一种联结类的层次模型,从父类中派生出一个子类,子类继承父类的方法和属性,并且可以通过重写来增加父类的实力。 多态的本质就是一个程序中存在多个同名的不同方法,分为编译时多态(类内方法重载)和运行时多态(子类重写父类方法或父类引用子类对象) 举例说明耦合的概念,如何解决耦合问题? 举例说明:类 T 负责两个不同的职责 P1 P2,当职责 P1 需求发生变更而须要修改类 T 时有可能会导致原本运行正常的职责 P2 功能发生故障,则说明 P1P2 被耦合在了一起 解决方法:遵守单一职责原则,将不同的职责封装到不同的类或模块中。分别建立两个类 T1、T2,使 T1 完成职责 P1 功能,T2 完成职责 P2 功能。此时修改类 T1 时,不会使职责 P2 发生故障风险 请说明 Java 的接口和 C+的虚类的相同和不同处。 .