星期四, 五月 24, 2007

异或运算

看位操作符。与&,异或^,或,取反~,右移>>(高位补符号位的值),右移>>>(高位补0),左移<<(低位补0)。看到一个题目,说两个整数a和b,交换ab的值,且不允许用第三个参数。看到提示是用异或操作来实现。试了试,发现了原因。
比如
a=0000,0101
b=1010,0110
a=a^b=1010,0011
b=a^b=0000,0101
a=a^b=1010,0110
a和b的值交换了。证明如下:
0^1=1,1^0=1,1^1=0,0^0=0 可以得到
若a^b=c,则a=b^c
所以上面的交换就是将a和b的异或值c放入变量a,在将值b和值c异即得到值a,放入变量b,再将值a和值c异或,得到值b,放入变量a。

-----------------------------------------------
equals()和==
==是比较两个引用是否指向同一个对象。如果是基本类型,则比较值。
equals,object类的equals()也是比较两个引用是否指向同一个对象,但基本类型的包装类,Date,File类改写了equals方法,变为比较值了。
总之,==是严格的比较内存地址,而equals除非被改写,否则也是比较内存地址。
------------------------
String的学问(基础知识啊,汗一个。可参考http://www.cn-java.com/target/news.php?news_id=3445
String a="aaa";
String b="aaa";
a==b为true,a.equals(b)为true。原因是a和b都是指向相同的字符串常量,"aaa"存在于常量池,在编译期间生成(并非运行期),a和b两个引用都指向常量池中的同一个aaa。
String a="aaa";
String b=new String("aaa");
a==b为false,a.equals(b)为true。原因是a是指向常量池中"aaa"的一个引用,而b是在运行期生成的一个String对象。
但是,a==b.intern()为true。当一个String对象调用intern()方法时,表示从常量池中寻找一个unicode相同的常量,如果有则直接返回其引用,如果没有则在常量池中新建一个并返回其引用。

没有评论: