Java——常见误区1(错误)

1.StringBuffer作为参数传递

package test;

public class test3 {
	 public static void main (String [] args) {
	
		 StringBuffer a = new StringBuffer ("A");
		 StringBuffer b = new StringBuffer ("B");
		 operate (a,b);
		 System.out.println(a + "," +b);
		 }
		 static void operate (StringBuffer x, StringBuffer y) {
		 x.append(y);
		 y = x;
		 } 
}

程序输出的值为AB,B。是不是感到很惊讶。为什么a的值改变了,但b的值没改变那。

这是因为a,b,x,y存储的不是StringBuffer对象,而是StringBuffer对象的引用。

a和x指向的是同一个对象,b和y指向的是同一个对象,所以x.append(y)在后面添加了B,a和x指向的地址,对象的值改变为AB。

而y = x,只是把x的引用地址给了y,a的并没有改变。

所以StringBuffer传递的是地址,和int[] 一样。

String虽然传递的也是地址,但是final类型的相当于值传递

2.++

	public static void main(String[] args) {
		 int i=1;
		 while(i++<5);
		 System.out.println(i);
		 for(i = 0;i<5;i++) {
			 int a = i;
		 }
		 System.out.println(i);
	}

输出结果是6,5。i++在判断条件过后才自加,第一次的时候当i等于4的时候,4<5通过判断条件后,i自加等于5,再次进行循环,此时不符合条件,但是仍然执行自加运算,所以 结果为6。和下面for循环中的条件完全不同。

public static void main(String[] args) {
		int i = 0;
		i++;
		System.out.println(i);
		
		i=0;
		i = i++;
		System.out.println(i);
		
		i = 0;
		i =i+++1;
		System.out.println(i);
}

输出结果为1,0,1。第一个1自加等于1没疑问;

仔细分析一下第二个i,正常来说我们会觉得i赋给i后,再自加所以是1。实际上,这和jvm处理字节码的机制有关,jvm在处理i = i++时,会建立一个临时变量来接收i++的的值,然后返回这个临时变量的值,返回的值再被等号左边的变量接收了,这样就是说i虽然自增了但是又被赋值了0,这样输出的结果自然就是0了。没明白,那我们模拟一下好了。

新建一个临时变量,存储i++的值,i的值赋给temp后,在自增,所以是0,1。

第三个的话就是i自加后加1给临时变量,然后临时变量在给赋给i。这个除了和jvm有关,还和运算符优先级有关。

附表

3.位运算符

相与(&)相或(|)异或(^)非(~)向左移位(>>)向右移位(<<)

                int a=8,b=0;
		b = a|8;//相或,除了是都为0时为0,剩下的都为1
		System.out.println(b);
				
		b = a&8;//相与,除了都为1时为1,剩下的都为0
		System.out.println(b);	
		
		b = 1;
		b ^= 2;
		System.out.println(b); //一样时为0,否则为1
		
		b>>=1;//先向右移位再赋值给自己
		System.out.println(b);

输出为8 8 3 1

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值