Java琐碎知识点(面试复习用——啥时候面过了啥时候停更)
switch (expr)
expr:byte、short、char、int、string、enum
long是不行的
使用最有效的方法计算2乘以8
2 << 3 (左移 3 位相当于乘以 2 的 3 次方,右移 3 位相当于除以 2 的 3 次方)。
如何跳出外层循环
public class BreakWithLabel {
public static void main(String[] args) {
outerLoop: // 定义标签
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
if (i == 2 && j == 2) {
break outerLoop; // 跳出外层循环
}
System.out.println("i: " + i + ", j: " + j);
}
}
System.out.println("Exited the loop.");
}
}
抽象类和接口有什么异同?
抽象类和接口都不能实例化,但可以定义抽象类和接口类型的引用。
一个类如果继承了某个抽象类或实现了某个接口都必须对其中的抽象方法全部进行实例化,否则该类仍然需要被声明为抽象类。
抽象类中可以有构造方法,能够定义抽象方法和具体方法。抽象类中的成员可以是private、默认、protected、public。抽象类中可以定义成员变量。有抽象方法的类必须定义为抽象类。而抽象类未必要有抽象方法
接口中不能定义构造方法,只能定义抽象方法。接口中成员只能为public。接口中定义的成员变量实际上都是常量
Java中会存在内存泄漏吗
理论上Java的垃圾回收机制(GC)不会存在内存泄漏问题。但是在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄漏的发生。
- 静态集合类
比如将对象添加到静态集合中,这些对象将始终被引用,直到程序结束。
public class MemoryLeakExample {
private static List<Object> list = new ArrayList<>();
public void addToList(Object obj) {
list.add(obj);
}
}
- 未关闭的资源
未关闭的I/O资源(如文件、网络连接、数据库连接)也会导致内存泄漏。因此应该使用try-with-resources语句或者在finally中关闭资源
public void readFile(String filename) {
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(filename));
// 读取文件内容
} catch (IOException e) {
e.printStackTrace();
} finally {
if (br != null) {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
抽象的方法能否同时是静态的?是否可同时是本地方法,是否可同时被synchronized修饰?
都不能,抽象方法需要子类重写,而静态的方法是无法被重写的。因此二者是矛盾的。本地方法是由本地代码实现的,而抽象方法是没有实现的,所以也是矛盾的。synchronized和方法的实现细节有关,抽象方法不涉及实现细节,因此也是矛盾的。
静态变量和实例变量的区别
静态变量是static修饰的变量,也被称为类变量,它属于类,存储于方法区的常量池中。它不属于类的任何一个对象,一个类不管创建多少个对象,静态变量在内存中有且仅有一个拷贝;
实例变量必须依存于某一实例,需要先创建对象,然后通过对象才能访问它。静态变量可以实现让多个对象共享内存。
如何实现对象克隆
实现Cloneable接口并重写Object类中的clone()方法
GC是什么?为什么要有GC?
GC是垃圾回收的意思,内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或者系统的不稳定甚至崩溃,Java提供的GC功能可以自动检测对象是否超过作用域从而达到自动回收内存的目的(防止内存泄漏)。Java语言没有提供释放已分配内存写的显示操作方法,Java程序员不用担心内存管理,因为垃圾回收器会自动进行管理。要请求垃圾收集,可以调用下面的方法之一:System.gc()或者Runtime.getRuntime().gc()
String s = new String("xyz");创建了几个字符串对象
两个,一个是静态区的"xyz",一个是用 new 创建在堆上的对象
接口是否可以继承接口?抽象类是否可以实现接口?抽象类是否可以继承具体类?
接口可以继承接口,而且支持多重继承
抽象类可以和实现接口
抽象类可以继承具体类也可以继承抽象类
final关键字有哪些用法
- 修饰类:表示该类不能被继承
- 修饰方法:表示方法不能被重写
- 修饰变量:变量变为常量, 表示变量只能一次赋值以后值不能被修改
比较Java和JavaScript
- 语言类型
- Java是静态类型的语言,变量的类型在编译时确定。如果类型不匹配,编译器会报错。
- JavaScript 是动态类型的语言,变量的类型在运行时确定。提高了代码的灵活性。
- 编译的解释
- Java代码在编译时被转换为字节码,然后在JVM上运行。这使得Java具有很强的跨平台能力。
- JavaScript是解释性语言,通常由浏览器内置的解释器直接解释执行。
- 执行环境
- Java在安装了JRE环境的任何设备上都能运行
- JavaScript最常用在浏览器中
- 用途
- Java通常用于企业级应用,Android移动应用、大型系统和服务器端应用
- JavaScript主要用于网页前端开发
Java断言
assert(断言)是一种用于调试的工具,通过在代码中插入assertion,可以检测程序的假设和变量是否成立。断言是一种简单的调试方式,可以借助断言判断代码的逻辑性。
示例
public class AssertionExample {
public static void main(String[] args) {
int value = -10;
// 简单形式
assert value > 0;
// 带消息的形式
assert value > 0 : "Value must be positive, but found " + value;
System.out.println("If you see this message, it means assertions are not enabled or the assertion passed.");
}
}
默认情况下,Java的断言是禁用的。要启用断言,需要在运行的时候使用-ea
或者-enableassertions
参数。例如
java -ea AssertionExample
或者
java -enableassertions AssertionExample
常见的运行时的异常
- NullPointerException(空指针异常)
- ArithmeticException(算数异常)
- ClassCastException(类型转换异常)
- IndexOutOfBoundsException(下标越界异常)
- SecurityException(安全异常)
转载自:https://juejin.cn/post/7380166581672591412