Java基础面试题

2023/8/20 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);
    }
}
1
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" 的拷贝,并不是直接指向常量池中的字符串。因此,堆内存中的新字符串对象和常量池中的字符串在内容上是相同的,但在内存空间中是独立的。

# 32、接口是否可继承(extends)接口?抽象类是否可实现(implements)接口?抽象类是否可继承?

# 33、一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制?

# 34、Anonymous Inner Class(匿名内部类)是否可以继承其它类?是否可以实现接口?

# 35、内部类可以引用它的包含类(外部类)的成员吗?有没有什么限制?

# 36、Java 中的final关键字有哪些用法?

# 37、指出下面程序的运行结果

# 38、数据类型之间的转换:

# 39、如何实现字符串的反转及替换?

# 40、怎样将GB2312编码的字符串转换为ISO-8859-1编码的字符串?

# 41、日期和时间:

# 42、打印昨天的当前时刻。

# 43、比较一下Java和JavaSciprt。

# 44、什么时候用断言(assert)?

# 45、Error和Exception有什么区别?

# 46、try{}里有一个return语句,那么紧跟在这个try后的finally{}里的代码会不会被

# 47、Java语言如何进行异常处理,关键字:throws、throw、try、catch、finally

# 48、运行时异常与受检异常有何异同?

# 49、列出一些你常见的运行时异常?

# 50、阐述final、finally、finalize的区别。

# 51、类ExampleA继承Exception,类ExampleB继承ExampleA。

# 52、List、Set、Map是否继承自Collection接口?

# 53、阐述ArrayList、Vector、LinkedList的存储性能和特性。

# 54、Collection和Collections的区别?

# 55、List、Map、Set三个接口存取元素时,各有什么特点?

# 56、TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort(

# 57、Thread类的sleep()方法和对象的wait()方法都可以让线程暂停执行,它们有什么区别

# 58、线程的sleep()方法和yield()方法有什么区别?

# 59、当一个线程进入一个对象的synchronized方法A之后,其它线程是否可进入此对象的sync

# 60、请说出与线程同步以及线程调度相关的方法。

# 61、编写多线程程序有几种实现方式?

# 62、synchronized关键字的用法?

# 63、举例说明同步和异步。

# 64、启动一个线程是调用run()还是start()方法?

# 65、什么是线程池(thread pool)?

# 66、线程的基本状态以及状态之间的关系?

# 67、简述synchronized 和java.util.concurrent.locks.Lock

# 68、Java中如何实现序列化,有什么意义?

# 69、Java中有几种类型的流?

# 70、写一个方法,输入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。

# 71、如何用Java代码列出一个目录下所有的文件?

# 72、用Java的套接字编程实现一个多线程的回显(echo)服务器。

# 73、XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?

# 74、你在项目中哪些地方用到了XML?

# 75、阐述JDBC操作数据库的步骤。

# 76、Statement和PreparedStatement有什么区别?哪个性能更好?

# 77、使用JDBC操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能?

# 78、在进行数据库编程时,连接池有什么作用?

# 79、什么是DAO模式?

# 80、事务的ACID是指什么?

# 82、JDBC能否处理Blob和Clob?

# 83、简述正则表达式及其用途。

# 84、Java中是如何支持正则表达式操作的?

# 85、获得一个类的类对象有哪些方式?

# 88、如何通过反射调用对象的方法?

# 90、简述一下你了解的设计模式。

# 91、用Java写一个单例类。

# 92、什么是UML?

# 93、UML中有哪些常用的图?

# 94、用Java写一个折半查找。

# 95、Java 中应该使用什么数据类型来代表价格?

# 96、怎么将 byte 转换为 String?

# 97、Java 中怎样将 bytes 转换为 long 类型?

# 98、我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会

# 99、存在两个类,B 继承 A,C 继承 B,我们能将 B 转换为 C 么?如 C = (C) B;

# 100、哪个类包含 clone 方法?是 Cloneable 还是 Object?

# 101、Java 中 ++ 操作符是线程安全的吗?

# 102、不是线程安全的操作。它涉及到多个指令,如读取变量值,增加,然后存储回内存,这个过程可能会出现多

# 103、a = a + b 与 a += b 的区别

# 104、我能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗?

# 105、3*0.1 == 0.3 将会返回什么?true 还是 false?

# 106、int 和 Integer 哪个会占用更多的内存?

# 107、为什么 Java 中的 String 是不可变的(Immutable)?