1. 静态导入
使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见,使用这些静态成员无需再给出他们的类名
过度地使用静态导入会在一定程度上降低代码的可读性。
package com.thinking.chapter_02;
public class StaticClass {
public static void print(String o){
System.out.println(o);
}
}
package com.thinking.chapter_02;
import static com.thinking.chapter_02.StaticClass.* ;
public class MainClass {
public static void main(String[] args) {
print("hello world");
}
}
2. 自定义equals比较
对于自定义的类,如果需要比较两个对象是否相等,就需要重写equals方法。
重写equals方法时,需要重写hashCode方法。
原因:如果覆盖equals没有覆盖hashCode,将会违反:相等的对象必须具有相等的散列码(hashCode)。
Object类里面的默认eqals方法是比较内存地址是否相等,默认的hashCode方法则是根据内存地址产生一个整数,所以Object类本身当然是符合上面规则的。当你覆盖了equals后,内存地址不同的对象可能会相等,而如果这时你没有覆盖hashCode方法的话,hashCode还是根据内存地址来生成,就会出现相等的对象具有不同的散列码的情况。
3. do-while 与 while区别
do-while不管while是否成立,都会最少执行一次do里面的方法。
4.&& 与 & 的区别:
使用&时,当前面的表达式为假的时候,程序依旧会继续执行后面的表达式,然后再得出FALSE的结果
&&具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式
|| 与 | 的区别:
当使用|时,若前面的表达式为真时,程序会继续执行后面的表达式,然后在得出TRUE的结果。
当使用||(短路或)时,若前面的表达式结果为真,则程序不会再执行后面的表达式,直接得出TRUE的结果
5. 运算符提升:
当一个java算术表达式中包含多个基本类型的值时,整个算术表达式的数据类型将发生自动提升。Java定义如下的自动提升规则:
a. 所有byte型、short型和char型将被提升到int型。
b. 整个算术表达式的数据类型自动提升到与表达式中最高等级操作数同样的类型。操作数的等级排列如下图所示,位于箭头右边类型的等级高于位于箭头左边类型的等级。
public static void main(String[] args) {
byte a = 12 ;
byte b = 1 ;
int c = a - b ;//返回的是int类型
byte d = (byte) (a - b) ;//如果需要byte类型来接收,需要进行强制转换
System.out.println(c);
}
6. break与contine区别:
break:跳出当前for循环__当前、当前
public static void main(String[] args) {
//注意break跳出的是"当前"的循环,理解"当前"的意思
for(int i=0;i<10;++i){
for(int j=0;j<5;++j){
if(j==3)
break ;//跳出的是j的循环,继续i的下一次迭代
System.out.print(i+"------->"+j+" ");
}
System.out.println();
if(i==5)
break ;//跳出的是i的循环,流程结束
}
}
public static void main(String[] args) {
for(int i=0;i<10;++i){
if(i%3==0)
continue ;//如果i%3==0,执行下一个迭代
System.out.print(i+" ");
}
}