a=a=b 求解释

时间:2021-12-17 04:47:26
A:  List list = list = jdbcTemplate.queryForList(sql);

B:  List list = jdbcTemplate.queryForList(sql);

这两句有什么区别,A这样写有什么好处

40 个解决方案

#1


没区别……

#2


呃,不知道

学习,祝楼主好运

#3


A不会报错吗?

#4


我靠,测试了下A尽然不报错。

#5


没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要

#6


引用 5 楼 qybao 的回复:
没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要


恩这样做看起来比较清爽些,一目了然

#7


楼主的钻研精神值得我们学习,
不过这两种写法确实没有区别。

#8


现在这个语句是用来进行数据库的查询的

我主要认为 数据库查询出来的数据在X这一块,而Y指向了这个X,现在把x的结果集清空过后,那么获取的Y也就是为空了

但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


我主要是这么认为的,那些对这块理解的比较深的人帮帮忙,解释下吧!

#9


引用 4 楼 softroad 的回复:
我靠,测试了下A尽然不报错。

a=a=b 求解释

#10


宝哥V5!

#11


但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


Y是不会有值的,Y指向Y(Y指向X),归根结底Y还是指向X。

#12


 int a = a = 10 从右运算先给a赋值10 然后将a值赋给a
和 int a = 10没区别

#13


没有什么区别

#14


引用 12 楼 wt_yao_monkey 的回复:
int a = a = 10 从右运算先给a赋值10 然后将a值赋给a
和 int a = 10没区别


list和int应该是有区别的,int的数字应该都是存放在常量区里面,不会清空的

#15


顶下五楼的 

#16


引用楼主 heardy 的回复:
A: List list = list = jdbcTemplate.queryForList(sql);

B: List list = jdbcTemplate.queryForList(sql);

这两句有什么区别,A这样写有什么好处


A list被重新引用了一下,和B 没啥区别

#17


引用 5 楼 qybao 的回复:
没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要


学习一下、、、加油

#18


貌似没有什么区别

#19


a=a=b;由于=是右结合的所以相当于a=(a=b);
而(a=b)作为表达式的值,就是a的值
所以实际做的操作是
a=b;
a=a;//这步毫无意义

#20


还有这写法,学习了。。。

#21


Java中a=a=b是要报错的啊!

#22


要是不是这样的第二个list要是换成别的话 还有点意思

#23


囧,为什么我也觉得A会报错

#24


这个真没有什么意义...

#25


貌似从右向左执行,在VC中不会报错,不过这样写帧没必要啊!

#26


我认为这样写是极其不规范的。

#27


这种写法编译器应该会直接处理掉

#28


学习了
楼主钻石精神不错

#29


引用 8 楼 heardy 的回复:
现在这个语句是用来进行数据库的查询的

我主要认为 数据库查询出来的数据在X这一块,而Y指向了这个X,现在把x的结果集清空过后,那么获取的Y也就是为空了

但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


我主要是这么认为的,那些对这块理解的比较深的人帮帮忙,解释下吧!

看来LZ没理解引用啊
首先
List X;
List Y = X; //Y也指向X所引用的对象
X.clear(); //X清空就是清空X所引用的对象,Y和X引用同一个对象,所以也就是Y(所引用的对象)被清空

List Y = Y = X;
相当于 Y = (Y = X);
相当于 Y = X; Y = Y; //首先Y指向X所以用的对象,接着Y指向Y所引用的对象,归根还是Y指向X引用的对象
X.clear(); //X清空就是清空X所引用的对象,Y和X引用同一个对象,所以也就是Y(所引用的对象)被清空


#30


学习了

#31


呵呵,List Y = Y = X;
相当于 Y = (Y = X);啊

#32


没有任何价值存在!

#33


没实用价值

#34


没什么区别

#35


却是没啥区别,lz不错嘛

#36


恩 看来A的写法真的是没有价值,暂时告一段落, 多下大家的回答。稍后结贴。。。

#37


这个估计是笔误。实际上A比B的效率低。编译成字节码看下:
A:Test1 test=test=new Test1();

Compiled from "Test1.java"
public class com.codetest.test.Test1 {
  public com.codetest.test.Test1();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/codetest/test/Test1
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: dup           
       8: astore_1      
       9: astore_1      
      10: return        
}
[/cdoe]
B:Test1 test=new Test1();
[code=Assembly]
Compiled from "Test1.java"
public class com.codetest.test.Test1 {
  public com.codetest.test.Test1();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/codetest/test/Test1
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1      
       8: return        
}

很明显A执行的代码比B要多。

#38


没什么区别吧、就是同一个变量赋了2次值,没意义。

#39


呵呵,我觉的A手贱了 。、、

#40


这种小问题就算了,没区别的

#1


没区别……

#2


呃,不知道

学习,祝楼主好运

#3


A不会报错吗?

#4


我靠,测试了下A尽然不报错。

#5


没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要

#6


引用 5 楼 qybao 的回复:
没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要


恩这样做看起来比较清爽些,一目了然

#7


楼主的钻研精神值得我们学习,
不过这两种写法确实没有区别。

#8


现在这个语句是用来进行数据库的查询的

我主要认为 数据库查询出来的数据在X这一块,而Y指向了这个X,现在把x的结果集清空过后,那么获取的Y也就是为空了

但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


我主要是这么认为的,那些对这块理解的比较深的人帮帮忙,解释下吧!

#9


引用 4 楼 softroad 的回复:
我靠,测试了下A尽然不报错。

a=a=b 求解释

#10


宝哥V5!

#11


但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


Y是不会有值的,Y指向Y(Y指向X),归根结底Y还是指向X。

#12


 int a = a = 10 从右运算先给a赋值10 然后将a值赋给a
和 int a = 10没区别

#13


没有什么区别

#14


引用 12 楼 wt_yao_monkey 的回复:
int a = a = 10 从右运算先给a赋值10 然后将a值赋给a
和 int a = 10没区别


list和int应该是有区别的,int的数字应该都是存放在常量区里面,不会清空的

#15


顶下五楼的 

#16


引用楼主 heardy 的回复:
A: List list = list = jdbcTemplate.queryForList(sql);

B: List list = jdbcTemplate.queryForList(sql);

这两句有什么区别,A这样写有什么好处


A list被重新引用了一下,和B 没啥区别

#17


引用 5 楼 qybao 的回复:
没分别,也没什么特别的好处
 = 是从右到左运算的,第一种情况相当于给list赋了2次值,没什么太大意义
一般情况,多个变量需要同时赋值这样做比较简洁,比如
int i;
int j;
i = j = 10;
System.out.printf("i=%d, j=%d\n", i, j);
//i和j两个变量同时赋值,这样才比较意义,同一个变量,没必要


学习一下、、、加油

#18


貌似没有什么区别

#19


a=a=b;由于=是右结合的所以相当于a=(a=b);
而(a=b)作为表达式的值,就是a的值
所以实际做的操作是
a=b;
a=a;//这步毫无意义

#20


还有这写法,学习了。。。

#21


Java中a=a=b是要报错的啊!

#22


要是不是这样的第二个list要是换成别的话 还有点意思

#23


囧,为什么我也觉得A会报错

#24


这个真没有什么意义...

#25


貌似从右向左执行,在VC中不会报错,不过这样写帧没必要啊!

#26


我认为这样写是极其不规范的。

#27


这种写法编译器应该会直接处理掉

#28


学习了
楼主钻石精神不错

#29


引用 8 楼 heardy 的回复:
现在这个语句是用来进行数据库的查询的

我主要认为 数据库查询出来的数据在X这一块,而Y指向了这个X,现在把x的结果集清空过后,那么获取的Y也就是为空了

但是Y指向了X,Y再次指向Y的话,会不会将结果集赋值过来,将X结果集清空的时候后,获取Y会不会还是有值


我主要是这么认为的,那些对这块理解的比较深的人帮帮忙,解释下吧!

看来LZ没理解引用啊
首先
List X;
List Y = X; //Y也指向X所引用的对象
X.clear(); //X清空就是清空X所引用的对象,Y和X引用同一个对象,所以也就是Y(所引用的对象)被清空

List Y = Y = X;
相当于 Y = (Y = X);
相当于 Y = X; Y = Y; //首先Y指向X所以用的对象,接着Y指向Y所引用的对象,归根还是Y指向X引用的对象
X.clear(); //X清空就是清空X所引用的对象,Y和X引用同一个对象,所以也就是Y(所引用的对象)被清空


#30


学习了

#31


呵呵,List Y = Y = X;
相当于 Y = (Y = X);啊

#32


没有任何价值存在!

#33


没实用价值

#34


没什么区别

#35


却是没啥区别,lz不错嘛

#36


恩 看来A的写法真的是没有价值,暂时告一段落, 多下大家的回答。稍后结贴。。。

#37


这个估计是笔误。实际上A比B的效率低。编译成字节码看下:
A:Test1 test=test=new Test1();

Compiled from "Test1.java"
public class com.codetest.test.Test1 {
  public com.codetest.test.Test1();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/codetest/test/Test1
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: dup           
       8: astore_1      
       9: astore_1      
      10: return        
}
[/cdoe]
B:Test1 test=new Test1();
[code=Assembly]
Compiled from "Test1.java"
public class com.codetest.test.Test1 {
  public com.codetest.test.Test1();
    Code:
       0: aload_0       
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return        

  public static void main(java.lang.String[]);
    Code:
       0: new           #2                  // class com/codetest/test/Test1
       3: dup           
       4: invokespecial #3                  // Method "<init>":()V
       7: astore_1      
       8: return        
}

很明显A执行的代码比B要多。

#38


没什么区别吧、就是同一个变量赋了2次值,没意义。

#39


呵呵,我觉的A手贱了 。、、

#40


这种小问题就算了,没区别的