Java基础面试题
# 1、面向对象的特征有哪些方面?
答案
略
# 2、访问修饰符public,private,protected,以及不写(默认)时的区别?
# 3、String 是最基本的数据类型吗?
# 4、float f=3.4;是否正确?
答案
float类型的变量需要在数字后面添加 f 或 F 后缀,以明确指定这是一个 float 类型的值,否则会被认为是 double 类型。 因此,float f = 3.4; 是不正确的写法,应该使用 float f = 3.4f; 或 float f = 3.4F;。
# 5、short s1 = 1; s1 = s1 + 1;有错吗?
# 6、Java有没有goto?
# 7、int和Integer有什么区别?
# 8、&和&&的区别?
# 9、解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法。
# 10、Math.round(11.5) 等于多少?Math.round(-11.5)等于多少?
答案
Math.round() 方法会返回最接近参数的整数值,四舍五入到最接近的整数。对于Math.round(11.5),它将返回 12,因为 11.5 四舍五入后最接近的整数是 12。 对于Math.round(-11.5),它将返回 -11,因为 -11.5 四舍五入后最接近的整数是 -11。 因此:Math.round(11.5) 等于 12、Math.round(-11.5) 等于 -11
# 11、switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上?
# 12、用最有效率的方法计算2乘以8?
答案
2<<<3
# 13、数组有没有length()方法?String有没有length()方法?
# 14、在Java中,如何跳出当前的多重嵌套循环?
答案
要跳出当前的多重嵌套循环,可以使用带有标签的 break 语句。通过在外层循环前加上标签,可以在内层循环中使用带有对应标签的 break 语句来跳出外层循环。以下是一个示例:
outerloop:
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (i == 1 && j == 1) {
break outerloop; // 使用带有标签的 break 语句跳出外层循环
}
System.out.println("i = " + i + ", j = " + j);
}
}
2
3
4
5
6
7
8
9
# 15、构造器(constructor)是否可被重写(override)?
答案
- 构造器(constructor)不能被重写(override)。构造器是一个特殊的方法,用于创建对象时进行初始化操作,它和普通方法有很大的区别。
- 在子类中定义一个和父类构造器一样的方法并不会被认为是重写,而是一个新的构造器。子类中的构造器可以调用父类的构造器,但并不是重写父类的构造器。
- 另外,在Java中,构造器也不会继承,因为构造器是用来创建对象的,在子类继承父类时,子类并不会继承父类的构造器,但可以调用父类的构造器来初始化父类的部分成员变量。
# 16、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这正确吗?
# 17、是否可以继承String类?
# 18、当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这是值传递还是引用传递?
# 19、String和StringBuilder、StringBuffer的区别?
# 20、重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
# 21、描述一下JVM加载class文件的原理机制?
# 22、char 型变量中能不能存贮一个中文汉字,为什么?
# 23、抽象类(abstract class)和接口(interface)有什么异同?
# 24、静态嵌套类(Static Nested Class)和内部类(Inner Class)的不同?
# 25、Java 中会存在内存泄漏吗,请简单描述。
答案
在Java中,内存泄漏是指程序中已经不再使用的对象仍然占用内存,无法被垃圾收集器回收的情况。内存泄漏可能会导致程序占用过多的内存资源,最终可能导致系统性能下降、甚至系统崩溃。
一些常见导致内存泄漏的情况包括:
- 对象的引用未被释放:当一个对象不再被使用,但其引用仍然存在,导致该对象无法被垃圾收集器回收。
- 集合类对象未正确清理:在使用集合类时,如果没有正确释放对象引用,可能导致集合中的对象无法被释放。
- 使用静态集合或容器:静态集合有可能会导致对象一直存在于内存中。
- 资源未正确关闭:如文件流、数据库连接等资源未正确关闭可能导致内存泄漏。
为避免内存泄漏,程序员需要注意以下几点:
- 及时释放对象的引用,尤其是长生命周期对象。
- 使用弱引用或软引用来管理对象的生命周期。
- 关闭资源时要使用try-with-resources 或finally块来确保资源被正确释放。
- 定期检查程序的内存使用情况,分析和优化可能存在内存泄漏的地方。
- 虽然Java有垃圾收集器来管理内存,但程序员仍需要注意内存泄漏问题,以确保程序的性能和稳定性。
# 26、抽象的(abstract)方法是否可同时是静态的(static),是否可同时是本地方法(native)?
# 27、阐述静态变量和实例变量的区别。
# 28、是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用?
# 29、如何实现对象克隆?
# 30、GC是什么?为什么要有GC?
# 31、String s = new String(“xyz”);创建了几个字符串对象?
答案
在这个语句 String s = new String("xyz"); 中,实际上创建了两个字符串对象。
- "xyz" 字面值字符串在常量池中被创建。
- new String("xyz") 使用 new 关键字创建了一个新的字符串对象,这个对象在堆内存中创建。
- 因此,总共创建了两个字符串对象。其中常量池中的字符串对象是不可变的,而堆中的字符串对象是可变的。
在Java中,当使用 new String("xyz") 创建一个新的字符串对象时,其中的 "xyz" 字面值字符串会首先存储在常量池中。然后,通过 new String("xyz") 创建的字符串对象会在堆内存中创建,这个对象是一个新的对象,不是直接指向常量池中的 "xyz"。
虽然在内存中会存在两个字符串对象(一个在常量池中,一个在堆内存中),但通过 new String("xyz") 创建的字符串对象是在堆内存中独立存在的,它所保存的值是常量池中的 "xyz" 的拷贝,并不是直接指向常量池中的字符串。因此,堆内存中的新字符串对象和常量池中的字符串在内容上是相同的,但在内存空间中是独立的。