小厂面试背背就行,大厂要学懂其原理,明之底层,闻其所用,望其项背。但是我们要进就进大厂。
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. Java中有哪些数据类型?
Java中数据类型分为基本数据类型和引用数据类型
2种
- 基本类型:byte(默认值0,占1字节)、short(默认值0,占2字节)、int(默认值0,占4字节)、long(默认值0,占8字节)、float(默认值0.0,占4字节)、double(默认值0.0,占8字节)、char(默认值\u0000,占2字节)、boolean(默认值false)
- 引用类型:类(默认值null)、接口(默认值null)、数组(默认值null)
3. == 和 equals 的区别是什么?
基本类型和引用类型比较,== 的作用效果是不同的。
- 基本类型:比较的是值是否相同
- 引用类型:比较的是引用是否相同
int x = 10;
int y = 10;
String a = "panda";
String b = "panda";
String c = new String("panda");
// true 基本类型比较值是否相同
System.out.println(x == y);
// true 引用类型比较引用是否相同,这里引用相同
System.out.println
equals 本质上就是 ==,Object类中定义的 equals 方法如下
public boolean equals(Object obj) {
return (this == obj);
}
总结:== 对于基本类型比较的是值,对于引用类型比较的是引用;而 equals 默认情况下是引用比较,只是很多类重写了 equals 方法,比如 String、Integer 等把它变成了值比较,所以一般情况下 equals 比较的是值是否相等。
4. 两个对象的 hashCode() 相同,则 equals() 也一定为 true 正确吗?
不正确,两个对象的 hashCode() 相同,equals() 不一定 true。比如在 map 中,hashCode() 相等,只能说明这两个键值对的哈希值相同,不代表这两个键值对相等。
String str1 = "通话";
String str2 = "重地";
// str1: 1179395 | str2: 1179395
System.out.println(String.format("str1: %d | str2: %d",str1.hashCode(),str2.hashCode()));
// false
System.out.println(str1.equals(str2));
5. Java 中 final 关键字的作用是什么?
- final 修饰的类叫最终类,不能被继承
- final 修饰的方法叫最终方法,不能被重写,但可以被继承
- final 修饰的变量叫常量,必须初始化,初始化之后值不能被修改
6. String、StringBuffer、StringBuilder 的区别是什么?
String 是字符串常量,每次操作都会生产新的对象,适用于少量字符串操作的情况;StringBuffer、StringBuilder 是字符串变量,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能却高于 StringBuffer,所以在单线程环境下推荐使用 StringBuilder,多线程环境下推荐使用 StringBuffer。
7. String str=“donkey” 与 String str=new String(“donkey”) 一样吗?
不一样,因为内存的分配方式不一样。String str=“donkey”,java 虚拟机会将其分配到常量池中;而 String str=new String(“donkey”) 则会被分到堆内存中。
8. 字符串如何反转?
使用 StringBuilder 或者 stringBuffer 的 reverse() 方法
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append("abcdefg");
System.out.println(stringBuffer.reverse()); // gfedcba
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("abcdefg");
System.out.println(stringBuilder.reverse()); // gfedcba
9. String 类中常用方法都有哪些?
String str = " app le ";
// indexOf(): 返回指定字符的索引
System.out.println(str.indexOf("a")); // 1
// charAt(): 返回指定索引处的字符
System.out.println(str.charAt(5)); // l
// replace(): 字符串替换
System.out.println(str.replace("pp", "cc")); // " acc le "
// trim(): 去除字符串两端空白
System.out.println(str.trim()); // "app le"
// split(): 分割字符串,返回一个分割后的字符串数组
String[] arr = str.split(" ");
// getBytes(): 返回字符串的 byte 类型数组
byte[] bytes = str.getBytes();
// length(): 返回字符串长度
System.out.println(str.length()); // 8
// toLowerCase(): 将字符串转成小写字母
System.out.println(str.toLowerCase()); // " app le "
// toUpperCase(): 将字符串转成大写字符
System.out.println(str.toUpperCase()); // " APP LE "
// substring(): 截取字符串
System.out.println(str.substring(2)); // "pp le "
// equals(): 字符串比较
System.out.println("apple