1.= =与 Equals()
“= =”比较是引用指向的对象是否相同。
Equal()在Object中定义,它的默认行为与“= =”相同。如下代码(Object中的Equal()):
public boolean equals(Object obj) {
return (this = = obj);
}
当然我们可以在新类中覆盖Equal()来达到我们所希望的行为。比较特殊的,Java已经为String类,和其他一些基本类型覆盖了Equal()方法,如下是String类中的Equal()方法:
public boolean equals(Object anObject) {
if (this = = anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n = = anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset; //偏移量
int j = anotherString.offset;
while (n-- != 0) { //注意++、--的在前在后的技巧,这段代码相当于:
if (v1[i++] != v2[j++]) // while(n!=0) {
return false; // if (v1[i++] != v2[j++]) return false;
} // n--; }
return true;
}
}
return false;
}
(代码思路:
第一步:首先用“= =” 判断,如果true返回true,否则继续判断。
第二步:再判断是否是String类型。
第三步:如果是String类型,首先判断字符串转化为字符的个数是否相等。
第四步:如果个数相等,再判断各个字符相等。
采用从大到小的比较方法,先比较大的范围,再比较小的范围,这样应该稍高效一些。
)
String类型特殊机制:
JAVA为了提高效率,所以对于String类型进行了特别的处理--为string类型提供了串池。
定义一个string类型的变量有两种方式:
string name="tom";
string name =new string("tom")
使用第一种方式的时候,就使用了串池,
使用第二种方式的时候,就是一种普通的声明对象的方式。
如果你使用了第一种方式,那么当你再声明一个内容也是"tom"的string时,它将使用串池里原来的那个内存,而不会重新分配内存,也就是说,string saname="tom",将会指向同一块内存。
另外关于string类型是不可改变的问题:
string类型是不可改变的,也就是说,当你想改变一个string对象的时候,比如name="madding"
那么虚拟机不会改变原来的对象,而是生成一个新的string对象,然后让name去指向它,如果原来的那个"tom"没有任何对象去引用它,虚拟机的垃圾回收机制将接收它。
2.移位操作符
移位操作符操作的对象是二进制的“位”,它们只可用来处理整数类型(int,基本类型)。
左移操作符(<<)能将操作符左边的操作数向左移动操作符右侧指定的位数,在低位补0。
“有符号”右移操作符(>>)则将操作符左边的操作数向右移动操作符右侧指定的位数,
这里使用“符号扩展”:若符号为正,则在高位插入0;若符号为负,则在高位插入1。
“无符号右移”操作符(>>>),它使用“零扩展“:无论正负,都在高位插入0。
如果对于char,byte或者short类型的数值进行移位处理,那么会在移位之前,它们会被转换为int型,并且得到的结果也是int型。
“移位”可以和“等号”组合使用(<<=或>>=或>>>=),意思是会将结果赋给给左边的变量。
例如:
public class URShift {
static Test monitor = new Test();
public static void main(String[] args) {
int i = -1;
System.out.println(i >>>= 10);
long l = -1;
System.out.println(l >>>= 10);
short s = -1;
System.out.println(s >>>= 10);
byte b = -1;
System.out.println(b >>>= 10);
b = -1;
System.out.println(b>>>10); //这个与上不同,它没有赋值直接打印
monitor.expect(new String[] {
"4194303",
"18014398509481983",
"-1",
"-1",
"4194303"
});
}
} ///:~
说明:
l Java中不存在无符号整数的概念,最高位均表示符号位
l Short n=-1;n在计算机存储的二进制形式:1111 1111,1111 1111 ,(int)n之后,为1111 1111,1111 1111,1111 1111,1111 1111
整型数在计算机中二进制存储表示函数:
public static String binaryInt(int test)
{
String temp="";
for(int i=31;i>=0;i--)
{
if(((1<<i)&test)!=0)
temp+="1";
else
temp+="0";
}
return temp;
}
说明:
l 原理:首先&运算符号也是针对二进制位的操作,判断第i+1位为1还是0,只需把1左移i位,左移后让其与test相&,结果必然是2的i次幂或者0(只有第i+1位有可能为1,其他均为0),同时也要理解“!=0”的精妙。
l 因为int是32位,所以i从31开始
发表于 @
2006年04月04日 12:36:00 | | 编辑|
举报| 收藏