几道最基础面试题
一、方法的参数传递
1、值传递与引用传递的理解
个人认为:不存在引用传递,均是值传递
2、方法传参是否会修改值
如下图所示代码:
对应的输出结果是:
值传递: 传的是值的副本
局部变量的作用域: 局部变量随着方法而产生,也随着方法而销毁
引用类型的修改: 修改的是堆中的数据值
String类型的存放: 存放于字符串常量池,被final修饰
String类型的修改: 先判断字符串常量池中,有没有修改后的值?有的话,直接指向原有的值;没有的话,再创建一个,指过去(其实就是修改了地址值)
解析代码:
main方法中: age变量的 值是20
personName变量的 值是地址值(“abc”在堆中的地址值)
str变量的 值是地址值(“abc”在堆中的地址值)
changeValue1方法中: age变量只是一个副本,原值是20,修改后是30 (基本类型)
但是在方法销毁后,这个age变量也被销毁,也就是这个副本被销毁
而main方法中的原件变量值并没有被修改
changeValue2方法中: personName变量只是一个副本,修改时是修改了地址值所指向堆中的数据值 (引用类型)
堆中的原值是“abc”,修改后是“xxx”,但是其地址值没变
但是在方法销毁后,这个personName变量也被销毁,也就是这个副本被销毁
而main方法中的原件变量值并没有被修改,还是原来的地址值,此时该地址值指向的堆中数据却被修改了
changeValue3方法中: str变量只是一个副本,修改时是修改了地址值 (String类型)
原值是“abc”在字符串常量池中的地址值,修改后是“xxx”在字符串常量池中的地址值
但是在方法销毁后,这个str变量也被销毁,也就是这个副本被销毁
而main方法中的原件变量值未被修改,还是那个地址值,此时该地址值指向字符串常量池中的数据未被修改
二、== 与 equals
1、== 与 equals 的使用要求
== : 可使用于基本类型,也能使用于引用类型
equals : 只能使用于引用类型
2、== 与 equals 的对比
如图所示代码:
对应的结果为:
解析代码:
== : 比较的就是 栈中变量的值 ;如果是 基本类型 ,就是比较数据值;如果是 引用类型 ,就是比较地址值
凡是 new出来的对象 ,栈中变量的值都是地址值;而 不同的new对象 ,地址值是不一样的,所以 == 比较百分百是false
equals: 属于Object类的方法;Object类中对其的实现就是用了 ==
所以只要一个类 没有重写equals方法 ,那么就等同于 ==
String类, 重写了equals方法 ,而且是 比较数据值的hashCode值
String类,重写了hashCode方法,只要数据值一样,hashCode值就一样
所以String变量中,只要 数据值一样 ,用equals方法比较就肯定是true
HashSet : 根据hashCode值比较是否是同一个值;new出来的对象,hashCode值都不一样,除非重写了hashCode方法
String类,重写了hashCode方法,只要数据值一样,hashCode值就一样
所以上述代码中,结果如图所示