JAVA 一些方法

equals 和 == 的区别

  • 首先的区别是,equals 是方法,而 == 是操作符;
  • 对于基本类型的变量来说(如 shortintlongfloatdouble),只能使用 == ,因为这些基本类型的变量没有 equals 方法。对于基本类型变量的比较,使用 == 比较, 一般比较的是它们的值
  • 对于引用类型的变量来说(例如 String 类)才有 equals 方法,因为 String 继承了 Object 类, equals 是 Object 类的通用方法。对于该类型对象的比较,默认情况下,也就是没有复写 Object 类的 equals 方法,使用 == 和 equals 比较是一样效果的,都是比较的是它们在内存中的存放地址。但是对于某些类来说,为了满足自身业务需求,可能存在 equals 方法被复写的情况,这时使用 equals 方法比较需要看具体的情况,例如 String 类,使用 equals 方法会比较它们的值
  没重写 equals
        Us u1 = new Us(1, 2);
        Us u2 = new Us(1, 2);
        System.out.println(u1 == u2);//false
        Us u3 = u1;
        System.out.println(u1 == u3);//true
        Us u1 = new Us(1, 2);
        Us u2 = new Us(1, 2);
        System.out.println(u1.equals(u2));// false
        Us u3 = u1;
        System.out.println(u1.equals(u3));// true

 

String equals 被重写 比较值

    String a = "Hello World";
    String b = new String("Hello World");
    String c = b; //引用传递
    System.out.println("a == b:" + a == b);             //false
    System.out.println("b == c:" + b == c);             //true
    System.out.println("a == c:" + a == c);             //false
    System.out.println("a.equals(b):" + a.equals(b));   //true
    System.out.println("b.equals(c):" + b.equals(c));   //true
    System.out.println("a.equals(c):" + a.equals(c));   //true

    最终的打印会是:
    a == b:false
    b == c:true
    a == c:false
    a.equals(b):true
    b.equals(c):true
    a.equals(c):true

 

Collection和Collections有什么区别?

  1. Collection是一个集合接口,它提供了对集合对象进行基本操作的通用接口方法,所有集合都是它的子类,比如List、Set等。
  2. Collections是一个包装类,包含了很多静态方法、不能被实例化,而是作为工具类使用,比如提供的排序方法: Collections.sort(list);提供的反转方法:Collections.reverse(list)。

 

 

hashCode() 与 equals()

hashCode() 和 equals()都是用于比较两个对象是否相等

hashCode() 的作用是获取哈希码(int 整数),也称为散列码。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode()定义在 JDK 的 Object 类中,这就意味着 Java 中的任何类都包含有 hashCode() 函数。

那为什么 JDK 还要同时提供这两个方法呢

这是因为在一些容器(比如 HashMapHashSet)中,有了 hashCode() 之后,判断元素是否在对应容器中的效率会更高(参考添加元素进HastSet的过程)

那为什么不只提供 hashCode() 方法呢?

这是因为两个对象的hashCode 值相等并不代表两个对象就相等

为什么重写 equals() 时必须重写 hashCode() 方法?

因为两个相等的对象的 hashCode 值必须是相等。也就是说如果 equals 方法判断两个对象是相等的,那这两个对象的 hashCode 值也要相等。

如果重写 equals() 时没有重写 hashCode() 方法的话就可能会导致 equals 方法判断是相等的两个对象,hashCode 值却不相等。

set调用equals方法验证没有问题,但是有个前提条件。正确的验证流程应该是:
比较对象的hashCode是否相同,若相同,再进行equals方法的判断,true认为元素重复,反之元素不重复。若hashCode不相同,则直接返回元素不重复并将元素插入。

简述throw与throws的区别

throw一般是用在方法体的内部,由开发者定义当程序语句出现问题后主动抛出一个异常。

throws一般用于方法声明上,代表该方法可能会抛出的异常列表。

 x--  和  --x

  int x = 3;
        int y = 3;
        int b = x--;
        System.out.println(x + " " + b);// 2 3
        int c = --y;
        System.out.println(y + " " + c);// 2 2

 

posted on 2022-01-09 12:38  cltt  阅读(27)  评论(0编辑  收藏  举报

导航