一、方法的参数传递

   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值就一样

     所以上述代码中,结果如图所示

三、String 的各类比较

四、普通代码块、构造方法

五、静态代码块、普通代码块、构造方法

六、linux的常用命令

相关文章: