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