Java中的==与=

赋值运算符 =

= 用于赋值 = 右边的值赋给左边的变量

        int prev = 0;
        String str = "String";
基本类型赋值

基本类型赋值,传递的是值的副本

变量prev的值改变了,不影响prev1的值

        int prev = 0;
        int prev1 = prev;
        prev++;
        System.out.println( prev );    //输出1
        System.out.println( prev1 );   //输出0
 引用类型

引用类型赋值,传递的是对象引用的副本(地址)

user 变量和 user1 变量的值是相同的,也就是两个变量共同指向了同一个对象实例

user 变量和 user1 变量其中任意一个对其对象实例进行修改时,两个变量最后获取

的都是修改后的值

public class OperationTest {
    private static int value = 0;

    public static void main( String[] args ) {
        User user = new User( );
        user.setName( "user" );
        user.setGender( "女" );
        User user1 = user;

        System.out.println( user == user1 );

        System.out.println( "user:" + JSONUtil.toJsonStr( user ) );
        System.out.println( "user1:" + JSONUtil.toJsonStr( user1 ) );

        user1.setGender( "男" );

        System.out.println( "user:" + JSONUtil.toJsonStr( user ) );
        System.out.println( "user1:" + JSONUtil.toJsonStr( user1 ) );

        //        true
        //        user:{"name":"user","gender":"女"}
        //        user1:{"name":"user","gender":"女"}
        //        user:{"name":"user","gender":"男"}
        //        user1:{"name":"user","gender":"男"}
    }

    @Data
    static class User {
        private String name;
        private String gender;
    }
}

比较运算符 ==

==用于比较运算符两边的值

    public static void main( String[] args ) {
        int a = 1;
        int b = 2;
        System.out.println( a == b );  //false

        int d;
        int c = d = 5;
        System.out.println( c == d );  //true
        System.out.println( a == d );  //false
 
        User user = new User( );
        user.setName( "user" );    
        user.setGender( "女" );
        User user1 = user;

        User user2 = new User( );
        user.setName( "user" );
        user.setGender( "女" );

        System.out.println( user == user1 );  //true
        System.out.println( user == user2 );  //false

    }

基本类型比较的是值是都相等

引用类型使用 == 比较的是引用是否相等,即比较指向对象的地址是否相等(是否指向同一个对象)

prev == (prev = get())

 两次比较输出的是 true 还是 false?

public class OperationTest {
    private static int value = 0;

    public static void main( String[] args ) {
        int prev = 0;
        System.out.println(prev == (prev = get()) );

        System.out.println(prev == (prev = get()) );
    }

    public static int get( ) {
        return value++;
    }
}

value是类的静态成员变量,get()方法每次调用时对value进行 + 1操作

main方法中定义了一个局部变量prev,赋值为0

prev == (prev = get()) 的运算顺序是:

  1. == 左边的操作数会先被求值(左边的prev)
  2. 接着,对 == 右边括号内的操作数求值( (prev = get()) )
    1. 先调用get()方法,获取返回值
    2. 将返回值赋值给prev
    3. prev更新为新的值
  3. 最后,是旧的值与新的值比较

所以,代码中的逻辑是:

第一个System.out.println(prev == (prev = get()) )

  1.  == 左边,prev 的值是 0
  2.  == 右边,get() 的返回值是0,最终右边的 prev 值也是0
  3. 最后:0 == 0,为true
  4. 第一个打印结束后,value 的值是1,prev 的值是0

第二个System.out.println(prev == (prev = get()) )

  1. == 左边,prev 的值是0
  2. == 右边,get() 的返回值是1,最终右边的 prev 值也是1
  3. 最后:0 == 1,为false
  4. 第二个打印结束后,value 的值是2,prev 的值是1

value++ :先用后加,get()方法获取到的是原始的value值,之后才是对value值进行+1操作

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值