面试 Java 基础八股文十问十答第二十一期
相信看了本文后,对你的面试是有一定帮助的!关注专栏后就能收到持续更新!
⭐点赞⭐收藏⭐不迷路!⭐
1)Java语言有哪些特点
Java语言具有以下特点:
- 面向对象(OO):Java是一种面向对象的编程语言,支持封装、继承和多态等OO特性。
- 跨平台性:Java程序可以在不同的平台上运行,只需安装对应平台的Java虚拟机(JVM)即可。
- 健壮性:Java具有内存管理、异常处理、类型检查等特性,有助于编写健壮的程序。
- 安全性:Java提供了安全管理机制,如类加载器、字节码验证器等,防止恶意代码对系统造成损害。
- 简单易学:Java语法设计简洁清晰,易于学习和使用。
- 高性能:通过即时编译器(Just-In-Time Compiler,JIT)等技术,Java程序可以实现较高的性能。
- 多线程支持:Java提供了多线程编程的支持,方便编写并发程序。
- 丰富的类库:Java标准库提供了丰富的API,涵盖了各种常用功能,可大大提高开发效率。
2)面向对象和面向过程的区别
面向对象编程(OO):
- 把数据和操作数据的方法放在一起,以对象的形式表示。
- 以类和对象为基础,强调封装、继承和多态。
- 通过消息传递进行对象之间的通信。
面向过程编程(OP):
- 以过程为中心,以功能为主导,以函数为基本单位。
- 强调解决问题的步骤和过程,按照顺序执行。
3)八种基本数据类型的大小,以及他们的封装类
- 整型:
byte
:8位,范围为-128到127。short
:16位,范围为-32768到32767。int
:32位,范围为-231到231-1。long
:64位,范围为-263到263-1。
- 浮点型:
float
:32位,范围为1.4E-45到3.4E+38。double
:64位,范围为4.9E-324到1.8E+308。
- 字符型:
char
:16位,Unicode字符,范围为0到65535。
- 布尔型:
boolean
:大小没有明确规定,表示逻辑值,只能取true
或false
。
对应的封装类为:
Byte
Short
Integer
Long
Float
Double
Character
Boolean
4)标识符的命名规则
在Java中,标识符是用来给变量、方法、类、包等命名的。标识符的命名规则如下:
- 可以包含的字符:
- 英文字母(大小写均可)
- 数字(但不能以数字开头)
- 下划线
_
- 美元符号
$
- 命名规范:
- 标识符不能是Java的关键字或保留字。
- 标识符是区分大小写的。
- 最好使用驼峰命名法(camelCase)规范,即除第一个单词外,其余单词首字母大写,例如:
myVariableName
。
5)instanceof 关键字的作用
instanceof
是Java中的一个关键字,用于判断一个对象是否是某个类的实例或者实现了某个接口。
语法:
object instanceof Class/Interface
作用:
- 如果
object
是Class/Interface
的实例,返回true
; - 如果
object
不是Class/Interface
的实例,返回false
。
示例:
Object obj = "Hello";
if (obj instanceof String) {
System.out.println("obj is an instance of String");
} else {
System.out.println("obj is not an instance of String");
}
在上面的例子中,obj instanceof String
的结果为 true
,因为 obj
是 String
类的实例。
6)Java自动装箱与拆箱
Java提供了自动装箱(autoboxing)和自动拆箱(unboxing)功能,用于在基本数据类型和对应的包装类之间进行转换。
-
自动装箱:将基本数据类型自动转换为对应的包装类对象。
int num = 10; Integer integerObj = num; // 自动装箱,等价于 Integer integerObj = Integer.valueOf(num);
-
自动拆箱:将包装类对象自动转换为对应的基本数据类型。
Integer integerObj = 20; int num = integerObj; // 自动拆箱,等价于 int num = integerObj.intValue();
自动装箱和自动拆箱使得基本数据类型和包装类之间的转换更加方便,编程时可以直接使用基本数据类型,而在需要使用包装类的场景下,会自动进行类型转换,提高了代码的简洁性和可读性。
7)重载和重写的区别
重载(Overloading):
- 在同一个类中,可以定义多个方法,它们具有相同的名称但参数列表不同(参数类型、参数个数或参数顺序)。
- 重载的方法根据参数列表的不同可以有不同的行为。
- 重载是编译时多态性的一种表现。
重写(Overriding):
- 子类可以重新定义父类中的方法,方法名、参数列表和返回类型都必须与父类中的方法相同。
- 重写用于实现子类对父类的方法的改变,实现运行时多态性。
- 重写时,子类方法的访问修饰符不能比父类方法的访问修饰符更严格。
8)equals与==的区别
==:
==
操作符用于比较两个对象的内存地址,即判断两个对象是否引用同一个内存地址。
equals:
equals()
方法是Object
类中的方法,用于比较两个对象的内容是否相等,默认行为是比较两个对象的内存地址。- 通常需要在类中重写
equals()
方法,以便根据对象的内容进行比较。
总结:
==
用于比较两个对象的引用是否相同,而equals()
用于比较两个对象的内容是否相同。
9)Hashcode的作用
hashCode()
方法是 Object
类中的方法,用于返回对象的哈希码值(32 位整数)。哈希码值的作用主要体现在哈希表中,例如在集合类中的实现(如 HashMap
、HashSet
等)。
在哈希表中,hashCode()
方法的作用是:
- 当对象存储到哈希表中时,先根据对象的哈希码值找到对应的位置,然后再根据
equals()
方法判断是否为同一对象。 - 通过哈希码值进行快速定位,可以大大提高查找、插入、删除等操作的效率。
在自定义类中,如果重写了 equals()
方法,通常也需要同时重写 hashCode()
方法,以保证对象的一致性,即如果两个对象 equals()
返回 true
,则它们的 hashCode()
应该相等。
10)String、StringBuffer 和 StringBuilder 的区别是什么?
String:
String
类是不可变的,即创建后不能修改其内容。- 每次对
String
类的操作都会产生一个新的String
对象,因此频繁的字符串操作会占用大量的内存和性能。
StringBuffer:
StringBuffer
是可变的,线程安全的,适用于多线程环境下的字符串操作。StringBuffer
的方法都是同步的,因此在单线程环境下效率相对较低。
StringBuilder:
StringBuilder
也是可变的,但不是线程安全的,适用于单线程环境下的字符串操作。StringBuilder
的方法都是非同步的,因此在单线程环境下性能较好。
选择使用哪个取决于具体的需求:
- 如果需要在单线程环境下进行大量的字符串操作,建议使用
StringBuilder
。 - 如果需要在多线程环境下进行字符串操作,建议使用
StringBuffer
。 - 如果字符串内容不会发生改变,则可以使用
String
类,因为它是不可变的,更安全。
开源项目地址:https://gitee.com/falle22222n-leaves/vue_-book-manage-system
前后端总计已经 900+ Star,1.5W+ 访问!
⭐点赞⭐收藏⭐不迷路!⭐