总览
在Internet上,Java面试问题和答案从一个网站复制到另一个网站。 这可能意味着错误或过时的答案可能永远不会得到纠正。 这是一些不太正确或已经过时的问题和答案。 即是Java 5.0之前的版本。
每个提供的问题后都有两个部分。 斜体的第一部分指示答案不完整/错误。 最后一部分以纯格式提供完整/正确的答案。
参数可以通过几种方式传递给子例程并进行解释?
参数可以通过两种方式传递。 它们通过价值传递,通过参考传递。
按值传递:此方法将参数的值复制到子例程的形式参数中。
通过引用传递:在此方法中,对参数的引用(而不是参数的值)传递给参数。
Java仅支持按值传递。 您可以按值传递引用,但是在Java中不能按引用传递。 Java引用可以描述为“通过共享调用”,但这并不常用。
什么是垃圾回收?如何明确调用它?
当某个对象不再由任何变量引用时,java会自动回收该对象使用的内存。 这称为垃圾收集。 系统。 gc()方法可用于显式调用它。
当对象不再具有来自Root上下文的强引用时,就可以进行清除。 具有弱参考或软参考的对象可以清除。 没有强引用的对象可能无法清除(即,没有保证将运行GC,次要GC不会清除使用期限的对象)
System.gc() 提示应该运行Full GC。 可以使用命令行选项禁用它。
什么是瞬态和挥发性修饰剂?
瞬态:瞬态修饰符仅适用于变量,并且不存储为对象持久性状态的一部分。 暂态变量未序列化。
易失性:易失性修饰符仅适用于变量,它告诉编译器,由易失性修改的变量可能会被程序的其他部分意外更改。
瞬态只能应用于字段,而不能应用于局部变量。 它可以应用于静态变量,但通常会被忽略。 临时字段不会自动序列化,但是可以通过自定义序列化进行序列化,例如writeObject和readObject()
volatile只能应用于字段,并告诉JIT而不是告诉编译器,每次访问都必须获取该字段的缓存一致性副本。 (通常来自“主”内存)
解释关键字transient的用法?
此关键字指示此成员变量的值不必与对象序列化。 当将反序列化该类时,将使用其数据类型的默认值(即,对于整数为零)来初始化此变量。
此关键字表示该字段不能自动序列化。 它不会自动反序列化,并保留该字段的默认值。 Integer的默认值为null 。 int的默认值为0
什么是方法重载和方法重载?
方法重载:当类中具有相同方法名,不同参数的方法被称为方法重载时。
方法覆盖:当类中具有相同方法名称和相同参数的方法被称为方法覆盖。
当两个方法具有相同的名称但签名不同时,就会发生方法重载。 签名包括参数类型和通用类型。 可以使用不同的参数调用单个方法,而可以使用相同的参数调用两个重载方法。 即它的签名而不是重要的论据。
仅当子类具有与父类中的方法相同的签名时,才发生方法重写。
Integer和int有什么区别?
- 整数是在Java中定义的类。 lang包,而int是用Java语言本身定义的原始数据类型。 Java不会自动从一种转换为另一种。
- 整数可以用作需要对象的方法的参数,而整数可以用于计算。
Integer是对包装int的对象的引用。自添加自动装箱和拆箱以来,主要区别在于Integer可以为null,并且==运算符比较Integer的引用和int类型的实际值。
Integer i1 = 1;
Integer i2 = 1;
// true as the same autoboxed Integer is used.
System.out.println(i1 == i2); Integer i3 = -200;
Integer i4 = -200;
// false as different autoboxed Integer objects are used.
System.out.println(i3 == i4);
线程的不同状态是什么?
不同的线程状态为就绪,运行,等待和死机。
由于Java 5.0应该是正在开发的大多数Java系统,因此Thread.State类将线程可能的状态列出为
- NEW –尚未启动的线程处于此状态。
- 可运行–在Java虚拟机中执行的线程处于此状态。
- BLOCKED –已阻塞,等待监视器锁定的线程处于此状态。
- 等待中–无限期等待另一个线程执行特定操作的线程处于此状态。
- TIMED_WAITING –正在等待另一个线程执行操作的线程最多达到指定的等待时间,该线程处于此状态。
- 终止–退出的线程处于此状态。
所有班级的基础班是哪一个?
java.lang.Object
对于自定义类,这是正确的。 对于基本类型,例如int.class,void.class和Object本身没有超类。
Class parent = boolean.class.getSuperclass(); // returns null
什么是守护线程?
在后台运行的Theards [sic]被称为守护进程线程。 守护程序线程是一个线程,一旦进入运行状态,该线程便没有任何机会运行其他线程,而它也没有任何机会运行其他线程。
守护程序线程是不会阻止JVM关闭的任何线程。 任何线程都可以视为“后台”线程。 守护程序线程被赋予与非守护程序线程相同的优先级(基于它们的优先级)。当守护程序线程正在运行时,它不会阻止另一个线程与非守护程序线程在运行上有任何不同。
守护程序线程是低优先级的线程,它在后台间歇地运行,为Java运行时系统执行垃圾回收操作。
垃圾收集器是守护线程的一个示例。 守护程序线程可以具有较高的优先级,并且可以一直运行。
对switch语句的每种情况的值施加什么限制?
在编译时,switch语句的每个case值必须计算为int值
从Java 5.0开始,支持打开枚举,从Java 7开始,支持打开String。
什么是Java Bean?
Java Bean是一种软件组件,其设计旨在可在各种不同的环境中重用。
恕我直言:这个答案含糊不清,可能在谈论任何事情。
Java Bean是“可序列化的Java对象,具有一个null构造函数,并允许使用getter和setter方法访问属性。”
为什么要使用同步块与同步方法?
与同步方法相比,同步块放置锁的时间更短。
这可能是正确的,但不能保证。 通常,同步块用于通过同步方法来锁定对对象的多次调用。 IMHO用于同步块的最常见的用途是锁定在这以外另一个目的
Map<key, value=""> map = Collections.synchronizedMap(new LinkedHashMap<key, value="">());
// perform multiple operations in a thread safe manner
synchronized(map) {
Value value = map.get(key);
if (value == null)
map.put(key, value = new Value(key));
return value;
}
Java中哪一个更快?
for(int i = 100000; i > 0; i--) {}
for(int i = 1; i < 100001; i++) {}
答:最快的是第二个。 服务器JVM可以检测并消除不执行任何操作的循环。 当循环迭代大约10,000次时,将编译带有任一循环的方法。 (基于-XX:CompileThreshold = 10000)第一个循环将花费一些时间来检测它没有执行任何操作,但是第二个循环将被编译。
哪个Java运算符是正确的关联?
=运算符是右关联的。
根据http://introcs.cs.princeton.edu/java/11precedence/列表,从右到左的关联运算符是。 (不止一个)
- ( ) 投
- 新对象
- ? :
- 分配= + =-= * = / =%=&= ^ = | = << = >> = >>> =
Java运行时系统生成什么类的异常?
Java运行时系统生成RuntimeException和Error异常。
恕我直言:这是对另一个问题的答案。 这是对的回答; 什么是运行时超类,未经检查的异常?
Java运行时可以生成Error,Exception或RuntimeException。
参考: 不正确的Java核心访谈在Vanilla Java上 ,我们的JCG合作伙伴 Peter Lawrey给出了答案 。
- 每个程序员都应该知道的事情
- 正确记录应用程序的10个技巧
- 软件设计法则
- Java最佳实践系列
- 生存在狂野西部开发过程中的9条提示
- 如何在不到1ms的延迟内完成100K TPS
- 提升您的休眠引擎
翻译自: https://www.javacodegeeks.com/2011/07/incorrect-core-java-interview-answers.html