上一篇发布了《Java 最常见的 200+ 面试题》没想到竟然有 6000+ 的阅读和 260+ 的点赞, 说明了认真专注的把一件事情做好, 结果一定不会太差.
目前市面上的面试题存在两个问题, 第一, 题目太旧好久没有更新了, 还都停留在 2010 年之前的那个状态; 第二, 近几年 JDK 更新和发布都很快, 所以 Java 的用法也变了不少, 再加上 Java 技术栈也新加入了很多框架, 比如 Spring Boot/Spring Cloud 等, 但类似的面试题却很少. 综合以上问题加上这份 Java 清单本来也是自己用心整理收集的, 所以评价还是挺高的, 本篇就开始更新 200+ 题中的第一部分: Java 基础部分的答案.
Java 基础
1.JDK 和 JRE 有什么区别?
JDK:Java Development Kit 的简称, java 开发工具包, 提供了 java 的开发环境和运行环境.
JRE:Java Runtime Environment 的简称, java 运行环境, 为 java 的运行提供了所需环境.
具体来说 JDK 其实包含了 JRE, 同时还包含了编译 java 源码的编译器 javac, 还包含了很多 java 程序调试和分析的工具. 简单来说: 如果你需要运行 java 程序, 只需安装 JRE 就可以了, 如果你需要编写 java 程序, 需要安装 JDK.
2.== 和 equals 的区别是什么?
== 的作用:
基本类型: 比较的是值是否相同;
引用类型: 比较的是引用是否相同;
equals 的作用: 比较的都是值是否相同.
代码示例:
- String x = "string";
- String y = "string";
- String z = new String("string");
- System.out.println(x==y); // true
- System.out.println(x==z); // false
- System.out.println(x.equals(y)); // true
- System.out.println(x.equals(z)); // true
代码解读: 因为 x 和 y 指向的是同一个引用, 所以 == 也是 true, 而 new String() 方法则重写开辟了内存空间, 所以 == 结果为 false, 而 equals 比较的一直是值, 所以结果都为 true.
3. 两个对象的 hashCode() 相同, 则 equals() 也一定为 true, 对吗?
不对, 两个对象的 hashCode() 相同, equals() 不一定 true.
代码示例:
- String str1 = "通话";
- String str2 = "重地";
- System.out.println(String.format("str1:%d | str2:%d", str1.hashCode(),str2.hashCode()));
- System.out.println(str1.equals(str2));
执行的结果:
- str1:1179395 | str2:1179395
- false
代码解读: 很显然 "通话" 和 "重地" 的 hashCode() 相同, 然而 equals() 则为 false, 因为在散列表中, hashCode() 相等即两个键值对的哈希值相等, 然而哈希值相等, 并不一定能得出键值对相等.
4.final 在 java 中有什么作用?
final 修饰的类叫最终类, 该类不能被继承.
final 修饰的方法不能被重写.
final 修饰的变量叫常量, 常量必须初始化, 初始化之后值就不能被修改.
5.java 中的 Math.round(-1.5) 等于多少?
等于 -1,Math.round 四舍五入大于 0.5 向上取整的.
6.String 属于基础的数据类型吗?
String 不属于基础类型, 基础类型有 8 种: byte,boolean,char,short,int,float,long,double, 而 String 属于对象.
7.java 中操作字符串都有哪些类? 它们之间有什么区别?
操作字符串的类有: String,StringBuffer,StringBuilder.
String 和 StringBuffer,StringBuilder 的区别在于 String 声明的是不可变的对象, 每次操作都会生成新的 String 对象, 然后将指针指向新的 String 对象, 而 StringBuffer,StringBuilder 可以在原有对象的基础上进行操作, 所以在经常改变字符串内容的情况下最好不要使用 String.
StringBuffer 和 StringBuilder 最大的区别在于, StringBuffer 是线程安全的, 而 StringBuilder 是非线程安全的, 但 StringBuilder 的性能却高于 StringBuffer, 所以在单线程环境下推荐使用 StringBuilder, 多线程环境下推荐使用 StringBuffer.
8.String str="i" 与 String str=new String("i") 一样吗?
不一样, 因为内存的分配方式不一样. String str="i" 的方式, java 虚拟机会将其分配到常量池中; 而 String str=new String("i") 则会被分到堆内存中.
9. 如何将字符串反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法.
示例代码:
- // StringBuffer reverse
- StringBuffer stringBuffer = new StringBuffer();
- stringBuffer.append("abcdefg");
- System.out.println(stringBuffer.reverse()); // gfedcba
- // StringBuilder reverse
- StringBuilder stringBuilder = new StringBuilder();
- stringBuilder.append("abcdefg");
- System.out.println(stringBuilder.reverse()); // gfedcba
10.String 类的常用方法都有那些?
indexOf(): 返回指定字符的索引.
charAt(): 返回指定索引处的字符.
replace(): 字符串替换.
trim(): 去除字符串两端空白.
split(): 分割字符串, 返回一个分割后的字符串数组.
getBytes(): 返回字符串的 byte 类型数组.
length(): 返回字符串长度.
toLowerCase(): 将字符串转成小写字母.
toUpperCase(): 将字符串转成大写字符.
substring(): 截取字符串.
equals(): 字符串比较.
11. 抽象类必须要有抽象方法吗?
不需要, 抽象类不一定非要有抽象方法.
示例代码:
- abstract class Cat {
- public static void sayHi() {
- System.out.println("hi~");
- }
- }
上面代码, 抽象类并没有抽象方法但完全可以正常运行.
12. 普通类和抽象类有哪些区别?
普通类不能包含抽象方法, 抽象类可以包含抽象方法.
抽象类不能直接实例化, 普通类可以直接实例化.
13. 抽象类能使用 final 修饰吗?
不能, 定义抽象类就是让其他类继承的, 如果定义为 final 该类就不能被继承, 这样彼此就会产生矛盾, 所以 final 不能修饰抽象类, 如下图所示, 编辑器也会提示错误信息:
14. 接口和抽象类有什么区别?
默认方法实现: 抽象类可以有默认的方法实现; 接口不能有默认的方法实现.
实现: 抽象类的子类使用 extends 来继承; 接口必须使用 implements 来实现接口.
构造函数: 抽象类可以有构造函数; 接口不能有.
main 方法: 抽象类可以有 main 方法, 并且我们能运行它; 接口不能有 main 方法.
实现数量: 类可以实现很多个接口; 但是只能继承一个抽象类.
访问修饰符: 接口中的方法默认使用 public 修饰; 抽象类中的方法可以是任意访问修饰符.
15.java 中 IO 流分为几种?
按功能来分: 输入流 (input), 输出流 (output).
按类型来分: 字节流和字符流.
字节流和字符流的区别是: 字节流按 8 位传输以字节为单位输入输出数据, 字符流按 16 位传输以字符为单位输入输出数据.
16.BIO,NIO,AIO 有什么区别?
BIO:Block IO 同步阻塞式 IO, 就是我们平常使用的传统 IO, 它的特点是模式简单使用方便, 并发处理能力低.
NIO:New IO 同步非阻塞 IO, 是传统 IO 的升级, 客户端和服务器端通过 Channel(通道) 通讯, 实现了多路复用.
AIO:Asynchronous IO 是 NIO 的升级, 也叫 NIO2, 实现了异步非堵塞 IO , 异步 IO 的操作基于事件和回调机制.
17.Files 的常用方法都有哪些?
Files.exists(): 检测文件路径是否存在.
Files.createFile(): 创建文件.
Files.createDirectory(): 创建文件夹.
Files.delete(): 删除一个文件或目录.
Files.copy(): 复制文件.
Files.move(): 移动文件.
Files.size(): 查看文件个数.
Files.read(): 读取文件.
Files.write(): 写入文件.
最后
点击查看 200+ 面试题目:《Java 最常见的 200+ 面试题目》
关注微信号「王磊的博客」 关注更多内容
来源: https://juejin.im/post/5c7cfdef6fb9a049f746ed47