本帖最后由 wuhuanhuan123 于 2011-06-22 23:03:45 编辑

解决方案 »

  1.   

    1. which three are valid declaraction of a float?  
      A. float foo=-1; // 必须在数字后加f或F,如1.23f
      B. float foo=1.0;//小数默认为double ,必须在数字后加f或F,如1.23f  
      C. float foo=42e1;//必须在数字后加f或F,如1.23f  
      D. float foo=2.02f; √ 
      E. float foo=3.03d; //d 应该是double类型的 
      F. float foo=0x0123;  2. float f=4.2F;  
      Float g=new Float(4.2F);  
      Double d=new Double(4.2);  
      Which are true?  
      A. f==g // X  , f 为基本数据类型float的变量 ,g为  float包装类Float的一个对象引用
      B. g==g   // 对
      C. d==f   //X ,两个对象的引用 
      D. d.equals(f)  //X  ?
      E d.equals(g)   //X  ?
      F. g.equals(4.2);//X ?  ? public  boolean equals(Object obj)
       其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.
      

  2.   

    而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
    java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)
      

  3.   

    第一题:
    A-E: 整数字面量默认为int,浮点数字面量默认为double,而不丢失精度的向上转型是允许的,向下转型需要强制转换。
    F:编译器允许直接用二进制给float赋值
    第二题:
    A-C:对引用类型使用==运算符比较的是是否引用同一个对象,请参照c的指针变量来理解。
    D-F:请去读API文档
      

  4.   

    鄙人也初学java,有木有大神指点?
      

  5.   

    你去我博客看看我的文章,我对浮点数做了比较深入的分析。单精度和双精度是不同格式来表达的,在内存里面也是不同的数字,;例如0.9,单精度和双精度在内存里就表示的是两个不同的数了(因为精度不同)。至于==这个运算符,如果你理解内存的话还好理解。==比较的是内存地址其实这个说法不一定正确的,java为了跨平台,内存地址不是真的内存地址,而是有一种哈希码来构成的对象地址的。比如 int i =1; Integer it=
    new Integer(1);如果从内存地址解释 i==it的话,应该是不是true的,但是事实却是true。这是因为==比较的是跟哈希码的东西。it的哈希码也是1,具体的==运算不好说。
      

  6.   


    请看第二题编译器结果:
    java代码:public class Tcsdn {
    public static void main(String[] args) {

      float f=4.2F;  
      Float g=new Float(4.2F);  
      Double d=new Double(4.2);  
      
      System.out.println("f==g: "+ (f==g)); 
      System.out.println("g==g: "+ (g==g));
      System.out.println("d==f: " +(d==f));
      System.out.println("d.equals(f): "+d.equals(f));   
      System.out.println("d.equals(g): "+d.equals(g));   
      System.out.println("g.equals(4.2): "+g.equals(4.2));
      
      System.out.println("f==d: "+ (f==d));   //我额外增加了一条,以便与第一条的“f==g”进行对比 }
    }输出结果如下:f==g: true     
    g==g: true
    d==f: false
    d.equals(f): false
    d.equals(g): false
    g.equals(4.2): false
    f==d: false
      

  7.   

    对于结果:f==g: true   //   自动的执行拆包,即其实比较的是 f==g.floatValue()
    g==g: true   //自身和自身比较,
    d==f: false  // d可以自动拆包为d.doubleValue(),转换成基本类型double与float类型比较
    d.equals(f): false   //jdk1.6API中关于Double类中equals()函数的说明为:将此对象与指定对象比较。当且仅当参数不是 null 而是 Double 对象,且表示的 Double 值与此对象表示的 double 值相同时,结果为 true。
    d.equals(g): false // 参见下条结果中的注释;
    g.equals(4.2): false  //虽然可以将4.2进行自动装包(装箱),但是装箱后仍是Double类型,如果比较的是g.equals(4.2f),那么结果为true
    f==d: false   //自动执行拆包,d.doubleValue(),float和double比较仍为false,如果手动将“f==d” 改为 “f==d.floatValue()”,即拆包成float类型的话,那么此语句结果也会为true
      
      

  8.   


    同学别忘了类型转换……
    经过编译器权威测试,三个有效的应该为:float foo=-1;   //正确  ,注意,在某些情况下int转换成float的时候可能会有精度损失
    float foo=1.0;  // X
    float foo=42e1;  // X
    float foo=2.02f; //正确
    float foo=3.03d;  // X
    float foo=0x0123; // 正确
      

  9.   

    的确是错了,sorry!今日中午睡觉之前回的,没有多思考。的确是自动拆包的。经过了我反编译了源文件。
      

  10.   


    以下是运行结果:
    float foo1=-1;  //正确
    float foo2=1.0; //Type mismatch: cannot convert from double to float
    float foo3=42e1;//Type mismatch: cannot convert from double to float  
    float foo4=2.02f;  //正确
    float foo5=3.03d;  //Type mismatch: cannot convert from double to float  
    float foo6=0x0123; //正确
    好像和你说的有差异哦 public static void main(String[] args) {
     float f=4.2F;  
      Float g=new Float(4.2F);  
      Double d=new Double(4.2);  
      System.out.println(f==g);//true
      System.out.println(g==g);//true
      System.out.println(d==f);//false
      System.out.println(d.equals(f));//false
      System.out.println(d.equals(g));//false
      System.out.println(g.equals(4.2));//false }
      

  11.   


    这个我没有了解得这么深入,看来得好好看看API了
      

  12.   


    System.out.println(f==g);//true
    f 和 g 引用的不是同一个对象啊,为什么结果是true?