java 基础

来源:互联网 发布:男士内裤淘宝店铺名 编辑:程序博客网 时间:2024/06/08 16:55

1 equals()方法

        java中的== :当比较对象的时候,比较的是对象的内存地址是否相同。

public boolean equals(Object obj) {    return (this == obj);    }
        以上是超类Object中的方法,比较内存地址是否相同,如果子类没有重写这个方法则调用超类中的方法。也可以对超类中的方法,用来比较两个对象的值是否相等

       String类中的方法重写。

      

    public boolean equals(Object anObject) {        if (this == anObject) {            return true;        }        if (anObject instanceof String) {            String anotherString = (String) anObject;            int n = value.length;            if (n == anotherString.value.length) {                char v1[] = value;                char v2[] = anotherString.value;                int i = 0;                while (n-- != 0) {                    if (v1[i] != v2[i])                            return false;                    i++;                }                return true;            }        }        return false;    }
         要设计equals方法需要遵循以下特性。
       1、自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。

       2、对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。

      3、传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。

      4、一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。

      5、 对于任何非空引用值 x,x.equals(null) 都应返回 false。

      instanceof的作用是判断其左边对象是否为其右边类的实例,返回boolean类型的数据

       1) 对象域,使用equals方法 。 
      2) 类型安全的枚举,使用equals或== 。
      3) 可能为null的对象域 : 使用 == 和 equals 。
      4) 数组域 : 使用 Arrays.equals 。
      5) 除float和double外的原始数据类型 : 使用 == 。
      6) float类型: 使用Float.foatToIntBits转换成int类型,然后使用==。 
      7) double类型: 使用Double.doubleToLongBit转换成long类型,然后使用==。

     

    public boolean equals(Object obj) {        return (obj instanceof Float)               && (floatToIntBits(((Float)obj).value) == floatToIntBits(value));    }
        面试中经常需要比较String 类型

       

    public static void main(String[] args) {       String s1 = "abc";       String s2 = "abc";  //直接从常量池中取出       String s3 = new String("abc"); // 作为一个对象放在堆中       System.out.println(s1 == s2); //true       System.out.println(s1 == s3);  //false       System.out.println(s1.equals(s3)); //true    }

      JVM为了提高性能和减少内存开销,内部维护了一个字符串常量池,每当创建字符串常量时,JVM首先检查字符串常量池,如果常量池中已经存在,则返回池中的字符串对象引用,否则创建该字符串对象并放入池中。

     但与创建字符串常量方式不同的是,当使用new String(String str)方式等创建字符串对象时,不管字符串常量池中是否有与此相同内容的字符串,都会在堆内存中创建新的字符串对象。

 2. final  关键字

             final关键子有无法改变的意思,可以修饰类,方法,变量 

           final 类 不允许被继承,成员方法没有机会被覆盖,默认都是final的   如Java中的 public final class Math类


         final 方法 如果一个类不允许其子类覆盖某个方法,则可以把这个方法声明为final方法。
         使用final方法的原因有二:
         第一、把方法锁定,防止任何继承类修改它的意义和实现。
         第二、高效。编译器在遇到调用final方法时候会转入内嵌机制,大大提高执行效率。

         final 对于常量来说,意味着值不能改变,例如 final int i=100。这个i的值永远都是100。但是对于变量来说又不一样,只是标识这个引用不可被改变,例如 final File f=new File("c:\\test.txt");那么这个f一定是不能被改变的,如果f本身有方法修改其中的成员变量,例如是否可读,是允许修改的。形象的比喻:一个女子定义了一个final的老公,这个老公的职业和收入都是允许改变的,只是这个女人不会换老公而已。

        final变量定义的时候,可以先声明,而不给初值,这中变量也称为final空白,无论什么情况,编译器都确保空白final在使用之前必须被初始化。但是,final空白在final关键字final的使用上提供了更大的灵活性,为此,一个类中的final数据成员就可以实现依对象而有所不同,却有保持其恒定不变的特征。

       

public class MyTest {public static void main(String[] args) {System.out.println(new A().i); //7System.out.println(new A().i); //6}} class A{final int i = new Random().nextInt(10);}

         static final用来修饰成员变量和成员方法,可简单理解为“全局常量”!
        对于变量,表示一旦给值就不可修改,并且通过类名可以访问。
        对于方法,表示不可覆盖,并且可以通过类名直接访问。

        

    public static double pow(double a, double b) {        return StrictMath.pow(a, b); // default impl. delegates to StrictMath    }    public static final double E = 2.7182818284590452354;


         

            

    

      


      

原创粉丝点击