揭秘常见Java面试题系列,持续更新至完结篇!
大家好!这里将要分享一些出现频率超高的Java面试题,每一周更新一次,直到全部更新完毕。想要了解更多,就请继续关注我哦!相关内容的Github地址是:[链接地址](
在Java中,有一类问题经常会被提及,那就是值传递和引用传递。这个问题非常重要,常常出现在面试和笔试中。那么,究竟什么是值传递和引用传递呢?让我们一起来探究一下。
要明确一点:“对象传递(数组、类、接口)是引用传递,原始类型数据(整型、浮点型、字符型、布尔型)传递是值传递。” 换句话说,当我们传递一个对象时,我们实际上是在传递一个引用,而不是对象本身。这就是为什么在Java中,对象是通过引用传递的。而对于基本数据类型,比如整数、浮点数等,则是通过值传递的。这意味着我们传递的是实际的值,而不是一个引用。
接下来,通过两个实例来进一步理解这个概念。
实例一:值传递
看下面的代码,这是一个关于值传递的简单例子。我们有两个整数num1和num2,然后调用swap方法交换它们的值。在swap方法执行完毕后,num1和num2的值并没有发生变化。这是因为,在swap方法中,a和b只是num1和num2的副本。无论我们如何修改a和b的值,都不会影响到num1和num2。
实例二:引用传递
在这个例子中,我们有一个数组arr,然后调用change方法修改数组的第一个元素。在change方法执行完毕后,我们发现arr的第一个元素已经被修改为0。这是因为,无论是主函数还是change方法,操作的都是同一个数组。当我们修改数组的内容时,所有的引用都会反映出这种变化。这就是引用传递的魅力所在。
一些特殊的例子解析
让我们先从第一个例子说起,涉及StringBuffer类型的传递。在Java的世界里头,StringBuffer对象就像是一个灵活多变的文字编辑器。当我们进行单元测试时,会创建一个名为method1的方法,在其中初始化了名为str的StringBuffer对象。在打印了初始值后,我们将它传递给了change1方法。很多人可能在这时候会有疑问:为什么输出还是原来的值呢?答案在于对象引用的本质。在change1方法内部,我们实际上是创建了一个新的StringBuffer对象,原先的str引用并未改变。这就像是我们复制了一份文字编辑器的草稿,然后在副本上做了修改,原稿的内容自然没有变化。
接下来是String类型的传递。String类型在Java中有些特别,因为它被设计成了不可变的。这就意味着一旦创建了一个String对象,它的内容就不能更改。在method2方法中,我们尝试通过改变str的引用指向一个新的String对象,但实际上,原来的str引用并未改变,输出的值依然如故。这就像是我们手中有一张写有信息的纸条,虽然我们可以复制新的纸条并写上新的信息,但原纸条上的内容并不会因此改变。
最后是一道有趣的题目。这里有一个Person类和一个Demo类。在Demo类的main方法中,我们创建了一个Person对象p,并将其传递给change方法。很多人可能会以为在change方法中重新创建的Person对象会影响原始的p对象,但实际上并非如此。这是因为我们在change方法中重新创建的Person对象只是局部变量,并没有改变原始的p对象的引用。这就像是在一部剧中,角色可以替换,但演员本身不会因此改变。如果把change方法改为让p指向一个新的Person对象(即p = new Person("李四")),那么输出结果将会是新的Person对象的名称。
让我们深入探讨一下关于改变对象属性的方法以及“==”与“equals()”之间的区别和重要性。在阅读以下内容之前,先让我们看看这段代码:
public static void change(Person p) { p.name="李四"; } 很明显,这段代码将Person对象的名称更改为“李四”。当我们调用此方法时,传入的对象的属性将发生变化。这在编程中非常常见,让我们明白我们可以改变传入对象的状态。
对于初学者来说,可能会存在疑惑:“这个改变是永久性的吗?”答案当然是肯定的,只要对象没有被重新创建或重置,其状态将保持不变。
两个对象相等,它们的hashCode值必定相同。当对两个相等的对象分别调用equals方法时,应返回true。仅仅因为两个对象具有相同的hashCode值,并不意味着它们一定相等。当覆盖equals方法时,hashCode方法也必须相应地被覆盖。这是Java编程中的重要规范。
在此,推荐一个开源的后端文档,对于Java后端工程师来说,这将是一个宝贵的资源。该文档名为“Java面试通关手册(Java学习指南)Java Interview Customs Manual (Java Study Guide)”,由Snailclimb编写并开源。这个文档在Github上已经获得了1.4k的star,无论你是Java新手还是资深工程师,都能从中收获很多知识和经验。
参考链接:
(该链接重复,已移除)
除了上述规范和理解,还有几点需要注意:
2. equals方法和hashCode方法必须一起使用。如果两个对象根据equals方法是相等的,那么它们的hashCode也必须相等;反之,如果两个对象的hashCode相等,并不意味着它们一定相等。需要在实现中确保这两个方法的逻辑一致性。
深入理解并正确使用hashCode和equals方法对于Java编程至关重要。推荐的这个开源文档也为Java工程师提供了一个学习和参考的好去处。 |