java_seven_net的专栏

记录我的成长历程! ~ bless seven&water better and better!~~

原创  2控制程序流程 收藏

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 | 评论( loading... ) | 编辑| 举报| 收藏

旧一篇:原码、反码和补码 | 新一篇:3初始化与清理

  • 发表评论
  • 评论内容:
  •  
Copyright © java_seven_net
Powered by CSDN Blog