挑战Java面试题复习第1天,坚持就是胜利

面向对象和面向过程的区别

面向过程:

步骤分析:将问题分解为一系列步骤。

函数实现:用函数逐步实现这些步骤。

调用执行:在需要时调用这些函数。

高性能:适合对性能要求高的场合,如单片机和嵌入式开发。

面向对象:

对象分解:将问题分解为多个对象。

行为描述:对象描述事物在问题解决过程中的行为。

特性:封装、继承、多态。

优点:易于维护、复用和扩展,可构建低耦合系统。

性能:相对面向过程,性能较低。

标识符的命名规则

标识符:

定义:程序中自定义的元素,如类名、方法名、变量名等。

命名规则(硬性要求):

组成:可包含字母、数字、$、_。

限制:不能以数字开头。

避免:不得使用关键字。

命名规范(非硬性要求):

类名:首字母大写,后续每个单词首字母大写(大驼峰式)。

变量名:首字母小写,后续每个单词首字母大写(小驼峰式)。

方法名:与变量名规范相同。

自动装箱与拆箱

装箱:

定义:将基本数据类型自动转换为对应的包装器类型。

示例:int 转换为 Integer。

方法:通过 Integer.valueOf(int) 实现。

拆箱:

定义:将包装器类型自动转换回对应的基本数据类型。

示例:Integer 转换为 int。

方法:通过 Integer.intValue() 实现。

Java SE5之前的装箱:

需要显式使用 new 关键字创建包装器类型实例。

示例:Integer i = new Integer(10);

Java SE5及之后的装箱:

提供了自动装箱特性,简化了包装器类型的创建。

示例:Integer i = 10;(自动调用 Integer.valueOf(int))

重载和重写的区别

重写(Override):

父子类关系:仅在子类与父类之间发生。

方法签名一致:方法名、参数列表、返回类型(除子类方法返回类型是父类返回类型的子类外)必须与被重写的方法相同。

访问权限:子类方法的访问修饰符不能比父类方法的更严格。

异常限制:重写的方法不能抛出新的或更广泛的检查型异常。

重载(Overload):

多态性表现:是类中多态性的一种体现。

参数列表差异:要求同名方法的参数列表必须不同(可以是参数类型、个数或顺序)。

返回类型:对返回值类型没有限制,可以相同也可以不同,重载的判断依据是参数列表而非返回类型。

equals与==的区别

== 操作符:

地址比较:比较两个对象在内存中的地址是否相同。

对象引用:判断两个引用是否指向同一个对象。

类型要求:操作数必须类型相同或存在继承关系。

数值比较:对于基本数据类型,如果值相等则比较结果为 true。

指针操作:本质上是比较指针地址。

equals 方法:

内容比较:比较两个对象的内容是否相等。

继承自 Object:所有类都继承自 java.lang.Object 类,适用于所有对象。

默认行为:如果没有重写 equals 方法,它的行为与 == 相同。

空指针安全:使用 equals 比较时,可以避免 NullPointerException。

最佳实践:在比较对象时推荐使用 equals 方法,尤其是在阿里代码规范中。

总结:

在比较对象是否相等时,应使用 equals 方法。

在比较常量时,将常量写在前面,以避免可能的 NullPointerException。

推荐使用阿里代码规范,并使用阿里插件来检查和替换不合适的 == 使用。

Hashcode的作用

Java集合分为List和Set:

List:有序,允许重复。

Set:无序,不允许重复。

Set判断元素存在性:

使用equals方法,但在大量元素时效率低。

哈希算法提升效率:

将集合划分为多个存储区域。

每个对象通过hashCode方法计算哈希码,确定存储区域。

hashCode方法:

根据对象的内存地址计算出一个值。

集合添加新元素时,先通过hashCode方法定位存储位置。

如果位置无元素,直接存储;如果位置有元素,使用equals方法比较。

相同则不存储,不同则寻找其他位置。

减少equals方法调用次数,提高性能。

String、StringBuffer和StringBuilder的区别

String 类要点:

不是基本数据类型,而是一个对象。

底层是 final 类型的字符数组。

字符串内容不可变,任何修改都会生成新的 String 对象。

字段定义:private final char value[];

字符串连接操作:

使用 + 操作符时,会隐式创建 StringBuilder 对象并调用 append 方法进行拼接。

StringBuilder 和 StringBuffer 要点:

两者都继承自 AbstractStringBuilder 抽象类。

底层都是可变字符数组:char[] value;

适用于频繁的字符串操作。

线程安全:

StringBuffer 是线程安全的,方法加了同步锁。

StringBuilder 非线程安全,没有加同步锁。

相关推荐
DKPT13 小时前
JVM中如何调优新生代和老生代?
java·jvm·笔记·学习·spring
phltxy13 小时前
JVM——Java虚拟机学习
java·jvm·学习
seabirdssss14 小时前
使用Spring Boot DevTools快速重启功能
java·spring boot·后端
喂完待续14 小时前
【序列晋升】29 Spring Cloud Task 微服务架构下的轻量级任务调度框架
java·spring·spring cloud·云原生·架构·big data·序列晋升
benben04414 小时前
ReAct模式解读
java·ai
轮到我狗叫了15 小时前
牛客.小红的子串牛客.kotori和抽卡牛客.循环汉诺塔牛客.ruby和薯条
java·开发语言·算法
Volunteer Technology16 小时前
三高项目-缓存设计
java·spring·缓存·高并发·高可用·高数据量
栗子~~16 小时前
bat脚本- 将jar 包批量安装到 Maven 本地仓库
java·maven·jar
Mr.Entropy17 小时前
ecplise配置maven插件
java·maven