Java语言特性
1:Java语⾔的优点?
- 平台⽆关性,摆脱硬件束缚,“⼀次编写,到处运⾏”。
- 相对安全的内存管理和访问机制,避免⼤部分内存泄漏和指针越界。
- 热点代码检测和运⾏时编译及优化,使程序随运⾏时间增⻓获得更⾼性能。
- 完善的应⽤程序接⼝,⽀持第三⽅类库。
2:Java 如何实现平台⽆关?
JVM: Java 编译器可⽣成与计算机体系结构⽆关的字节码指令,字节码⽂件不仅可以轻易地在任何机器上解释执⾏,还可以动态地转换成本地机器代码,转换是由 JVM 实现的,JVM 是平台相关的,屏蔽了不同操作系统的差异。
语⾔规范: 基本数据类型⼤⼩有明确规定,例如 int 永远为 32 位,⽽ C/C++ 中可能是 16 位、32 位,也可能是编译器开发商指定的其他⼤⼩。Java 中数值类型有固定字节数,⼆进制数据以固定格式存储和传输,字符串采⽤标准的 Unicode 格式存储。
3:JDK 和 JRE 的区别?
JDK: Java Development Kit,开发⼯具包。提供了编译运⾏ Java 程序的各种⼯具,包括编译器、JRE及常⽤类库,是 JAVA 核⼼。
JRE: Java Runtime Environment,运⾏时环境,运⾏ Java 程序的必要环境,包括 JVM、核⼼类库、核⼼配置⼯具。
4:Java 按值调⽤还是引⽤调⽤?
按值调⽤指⽅法接收调⽤者提供的值,按引⽤调⽤指⽅法接收调⽤者提供的变量地址。
Java 总是按值调⽤,⽅法得到的是所有参数值的副本,传递对象时实际上⽅法接收的是对象引⽤的副本。⽅法不能修改基本数据类型的参数,如果传递了⼀个 int 值 ,改变值不会影响实参,因为改变的是值的⼀个副本。可以改变对象参数的状态,但不能让对象参数引⽤⼀个新的对象。如果传递了⼀个 int 数组,改变数组的内容会影响实参,⽽改变这个参数的引⽤并不会让实参引⽤新的数组对象。
5:浅拷贝和深拷贝的区别?
浅拷贝: 只复制当前对象的基本数据类型及引⽤变量,没有复制引⽤变量指向的实际对象。修改克隆对象可能影响原对象,不安全。
深拷贝: 完全拷贝基本数据类型和引⽤数据类型,安全。
6:什么是反射?
在运⾏状态中,对于任意⼀个类都能知道它的所有属性和⽅法,对于任意⼀个对象都能调⽤它的任意⽅法和属性,这种动态获取信息及调⽤对象⽅法的功能称为反射。缺点是破坏了封装性以及泛型约束。反射是框架的核⼼,Spring ⼤量使⽤反射。
7:Class 类的作⽤?如何获取⼀个 Class 对象?
在程序运⾏期间,Java 运⾏时系统为所有对象维护⼀个运⾏时类型标识,这个信息会跟踪每个对象所属的类,虚拟机利⽤运⾏时类型信息选择要执⾏的正确⽅法,保存这些信息的类就是 Class,这是⼀个泛型类。
获取 Class 对象:① 类名.class 。②对象的 getClass ⽅法。③ Class.forName(类的全限定名) 。
8:什么是注解?什么是元注解?
注解是⼀种标记,使类或接⼝附加额外信息,帮助编译器和 JVM 完成⼀些特定功能,例如 @Override标识⼀个⽅法是重写⽅法。
元注解是⾃定义注解的注解,例如:
- @Target :约束作⽤位置,值是 ElementType 枚举常量,包括 METHOD ⽅法、VARIABLE 变量、TYPE 类/接⼝、PARAMETER ⽅法参数、CONSTRUCTORS 构造⽅法和 LOACL_VARIABLE 局部变量等。
- @Rentention :约束⽣命周期,值是 RetentionPolicy 枚举常量,包括 SOURCE 源码、CLASS 字节码和 RUNTIME 运⾏时。
- @Documented :表明这个注解应该被 javadoc 记录。
9:什么是泛型,有什么作⽤?
泛型本质是参数化类型,解决不确定对象具体类型的问题。泛型在定义处只具备执⾏ Object ⽅法的能⼒。
泛型的好处:① 类型安全,放置什么出来就是什么,不存在 ClassCastException。② 提升可读性,编码阶段就显式知道泛型集合、泛型⽅法等处理的对象类型。③ 代码重⽤,合并了同类型的处理代码。
10:泛型擦除是什么?
泛型⽤于编译阶段,编译后的字节码⽂件不包含泛型类型信息,因为虚拟机没有泛型类型对象,所有对象都属于普通类。例如定义 List 或 List ,在编译后都会变成 List 。
定义⼀个泛型类型,会⾃动提供⼀个对应原始类型,类型变量会被擦除。如果没有限定类型就会替换为Object,如果有限定类型就会替换为第⼀个限定类型,例如 <T extends A & B> 会使⽤ A 类型替换T。
11:JDK8 新特性有哪些?
- lambda 表达式:允许把函数作为参数传递到⽅法,简化匿名内部类代码。
- 函数式接⼝:使⽤ @FunctionalInterface 标识,有且仅有⼀个抽象⽅法,可被隐式转换为 lambda
- 表达式。
- ⽅法引⽤:可以引⽤已有类或对象的⽅法和构造⽅法,进⼀步简化 lambda 表达式。
- 接⼝:接⼝可以定义 default 修饰的默认⽅法,降低了接⼝升级的复杂性,还可以定义静态⽅法。
- 注解:引⼊重复注解机制,相同注解在同地⽅可以声明多次。注解作⽤范围也进⾏了扩展,可作⽤于局
- 部变量、泛型、⽅法异常等。
- 类型推测:加强了类型推测机制,使代码更加简洁。
- Optional 类:处理空指针异常,提⾼代码可读性。
- Stream 类:引⼊函数式编程⻛格,提供了很多功能,使代码更加简洁。⽅法包括 forEach 遍
- 历、 count 统计个数、 filter 按条件过滤、 limit 取前 n 个元素、 skip 跳过前 n 个元素、 map 映
- 射加⼯、 concat 合并 stream 流等。
- ⽇期:增强了⽇期和时间 API,新的 java.time 包主要包含了处理⽇期、时间、⽇期/时间、时区、时刻
- 和时钟等操作。
- JavaScript:提供了⼀个新的 JavaScript 引擎,允许在 JVM上运⾏特定 JavaScript 应⽤。
12:异常有哪些分类?
所有异常都是 Throwable 的⼦类,分为 Error 和 Exception。
- Error 是 Java 运⾏时系统的内部错误和资源耗尽错误,例如 StackOverFlowError 和 OutOfMemoryError,这种异常程序⽆法处理。
- Exception 分为受检异常和⾮受检异常,受检异常需要在代码中显式处理,否则会编译出错,⾮受检异常是运⾏时异常,继承⾃ RuntimeException。
- 受检异常:① ⽆能为⼒型,如字段超⻓导致的 SQLException。② ⼒所能及型,如未授权异常UnAuthorizedException,程序可跳转权限申请⻚⾯。常⻅受检异常还有 FileNotFoundException、ClassNotFoundException、IOException等。
- ⾮受检异常:① 可预测异常,例如 IndexOutOfBoundsException、NullPointerException、ClassCastException 等,这类异常应该提前处理。② 需捕捉异常,例如进⾏ RPC 调⽤时的远程服务超时,这类异常客户端必须显式处理。③ 可透出异常,指框架或系统产⽣的且会⾃⾏处理的异常,例如Spring 的 NoSuchRequestHandingMethodException,Spring 会⾃动完成异常处理,将异常⾃动映射数据。