注意事项
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()。
- 第二种 会创建“类对应的散列表”
这里所说的“会创建类对应的散列表”是说:我们会在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的区别:
java.sql.Date
无空构造器,需使用时间戳或者年月日构造。java.util.Date
下有年月日 时分秒java.sql.Date
下只有年月日java.sql.Date
是java.util.Date
的子类。
6. ArrayList和LinkedList区别
- ArrayList:必须开辟连续空间,查询快,增删慢。
- LinkedList:无需开辟连续空间,查询慢,增删快。