注意事项

1. 命令行执行Java文件

命令行运行某个Java文件时,如此Java文件已经指定包名,执行javac进行编译时需指定到Java文件文件夹位置,执行java进行运行时则需要退回src目录下,使用包名.类名进行调用运行。

// Demo01.java
package person.gs.demo;
public Demo01{
  public static void main(String[] args){
  }
}

src目录下:

javac person/gs/demo/Demo01.java
java person.gs.demo.Demo01

2. String下为什么不能用==替代equals()?

  • 实际上是因为String的equals()方法已经进行了重写,如果地址不一致会将字符串内容逐个比对

"=="相等判断符用于比较基本数据类型和引用类型数据。 当比较基本数据类型的时候比较的是数值,当比较引用类型数据时比较的是引用(指针)。

用"=="判断两个引用数据类型是否相等的时候,实际上是在判断两个引用是否指向同一个对象

Object.equals()源码:

public boolean equals(Object obj) {
  return (this == obj);
}

String.equals()源码:

public boolean equals(Object anObject) {
    if (this == anObject) {    //先比较两个字符串的引用是否相等(是否指向同一个对象), 是直接返回true
        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;
}

首先会判断两个字符串的引用是否相等,也就是说两个字符串引用是否指向同一个对象,是则返回true。

如果不是指向同一个对象,则把两个字符串中的字符挨个进行比较。如果 s1 和 s2 字符串都是 "hello",是可以匹配成功的,所以最终返回 true。equals()和hashCode()的不同。

3. equals()和hashCode()的区别

  • equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源码如下:

    public boolean equals(Object obj) {
        return (this == obj);
    }
    
  • 第一种 不会创建“类对应的散列表”

​ 这里所说的“不会创建类对应的散列表”是说:我们不会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,不会创建该类的HashSet集合。

​ 在这种情况下,该类的“hashCode() 和 equals() ”没有半毛钱关系的! ​ 这种情况下,equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用,所以,不用理会hashCode()。

  1. 第二种 会创建“类对应的散列表”

​ 这里所说的“会创建类对应的散列表”是说:我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,会创建该类的HashSet集合。

​ 在这种情况下,该类的“hashCode() 和 equals() ”是有关系的: ​ 1)、如果两个对象相等,那么它们的hashCode()值一定相同。 ​ 这里的相等是指,通过equals()比较两个对象时返回true。 ​ 2)、如果两个对象hashCode()相等,它们并不一定相等。 ​ 因为在散列表中,hashCode()相等,即两个键值对的哈希值相等。然而哈希值相等,并不一定能得出键值对相等。补充说一句:“两个不同的键值对,哈希值相等”,这就是哈希冲突。

​ 此外,在这种情况下。若要判断两个对象是否相等,除了要覆盖equals()之外,也要覆盖hashCode()函数。否则,equals()无效。 例如,创建Person类的HashSet集合,必须同时覆盖Person类的equals() 和 hashCode()方法。 ​ 如果单单只是覆盖equals()方法。我们会发现,equals()方法没有达到我们想要的效果。

4. System.arraycopy()和Arrays.copyOf()对比

Arrays.copyOf()源码:

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
  @SuppressWarnings("unchecked")
  T[] copy = ((Object)newType == (Object)Object[].class)
    ? (T[]) new Object[newLength]
    : (T[]) Array.newInstance(newType.getComponentType(), newLength);
  System.arraycopy(original, 0, copy, 0,
                   Math.min(original.length, newLength));
  return copy;
}

System.arraycopy()源码:

public static native void arraycopy(Object src,  int  srcPos,
                                    Object dest, int destPos,
                                    int length);

没错,Arrays.copyOf()本质还是调用System.arraycopy()方法实现的。

System.arraycopy()是一个本地方法,底层采用jvm实现,效率更高。

5. java.util.Date和java.sql.Date的区别:

  1. java.sql.Date无空构造器,需使用时间戳或者年月日构造。

  2. java.util.Date下有年月日 时分秒

    java.sql.Date下只有年月日

  3. java.sql.Datejava.util.Date的子类。

6. ArrayList和LinkedList区别

  • ArrayList:必须开辟连续空间,查询快,增删慢。
  • LinkedList:无需开辟连续空间,查询慢,增删快。
img
Image

7. 接口中定义的变量都是public static final

Copyright © rootwhois.cn 2021-2022 all right reserved,powered by GitbookFile Modify: 2023-03-05 10:55:52

results matching ""

    No results matching ""