概念

修饰符:
private,仅只能在设置了该权限的类中访问,利用这个访问权限,表现出封装思想。
default,默认的访问权限,也是可以省略的访问权限,它不仅能在设置了该权限的类中访问,也可以在同一包中的类或子类中访问。
protected,除了具有default的访问权限外,还可以在不同包中所继承的子类访问。
public,不仅可以是同一个类或子类,还是同一个包中的类或子类,又还是不同包中的类或子类,都可以访问。


逻辑运算符:
&&、||、是短路逻辑操作符,即根据操作符左边布尔值决定逻辑运算是否继续;
&、|、是非短路逻辑操作符。


移位运算符:
<<      左移运算符,num << 1,相当于num乘以2
>>     右移运算符,num >> 1,相当于num除以2
>>>     无符号右移,符号位以0补,空位都以0补齐


==、equals()、hashCode()

public class Object {
    ......
    public native int hashCode();
    
    public boolean equals(Object obj) {
        return (this == obj);
    }
    ......
}

==就是比较对象在jvm内存地址。
equals():若对象没有重写equals(),则用的就是Object的equals(),与==相同。
hashCode():若对象没有重写hashCode(),则用的就是Object的hashCode(),返回对象在jvm内存地址。

  • 对与String类型,由于其重写了hashcode()和equals(),只要String内容相同,hashcode()返回相同,equals()返回true。

  • 当equals方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。如Hashtable实现一个哈希表,为了成功地在哈希表中存储和检索对象,用作键的对象必须实现 hashCode 方法和 equals 方法。必须保证hashCode相等的对象equals也相等,因为哈希表通过hashCode检索对象。


特性

  • 数据友好表示

用下划线分割:

long maxLong = 0x7fff_ffff_ffff_ffffL; 
float pi = 3.14_15F;  
int x2 = 5_000_000; 

  • 二进制标识

int, short,long,byte类型都可以用二进制表示  ,用0b或0B开头。

byte aByte = (byte) 0b00100001;   //8位 
short aShort = (short) 0b1010000101000101;  // 16位
Int anInt1 = 0b10100001010001011010000101000101;  // 32位  
long aLong = 0b1010000101000101101000010100010110100001010001011010000101000101L;  // 64位  (末尾要加L)

  • Try-with-resource

实现java.lang.AutoCloseable接口的资源都可以放到try中(Closeable继承AutoCloseable,所以实现Closeable接口的资源也可以),跟finally里面的关闭资源类似, 按照声明逆序关闭资源 。try()中声明的资源被隐式声明为final

try-with-resources 可以有 catch 和 finally 块, catch 或 finally 块都是在声明的资源被关闭以后才运行。
try-with-resources会出现两个异常:try块里的异常、close函数里抛出的异常。如果在调用close函数时出现异常,那么前面的异常就被称为Suppressed Exceptions,Throwable.addSuppressed()会把try块里的异常保存起来,当捕捉到close的异常时,就可以调用Throwable.getSuppressed()来取出close之前的异常。


  • Catch多个异常

try {
    testThrows();
} catch (IOException | SQLException ex) {
    throw ex;
}

  • 泛型推断

//new部分后面的泛型类型,只用<>就可以了。
List<Map<String, List<String>>> strList = new ArrayList<>();

class MyClass<X> {
    <T> MyClass(T t) {
        // ...
    }
}
//具有泛型构造器的泛型类的实例化:
MyClass<Integer> myObject = new MyClass<>("");    

一个表达式的目标类型(Target Type)指的是一种编译器根据表达式出现的位置而需要的正确的数据类型。

void processStringList(List<String> stringList) { 
// process stringList 
}   
processStringList(Collections.emptyList());    //java8的调用
processStringList(Collections.<String>emptyList());    //java7的调用,没有目标类型概念。

processStringList方法入参需要List<String>(就是Collections.emptyList()的Target Type),所以编译器推断Collections.emptyList()返回的List<T>中的T一定是String。
目标类型的使用在Lambda表达式中优势最为明显。


  • 在可变参数方法中传递非具体化参数

堆污染(Heap pollution)指一个变量引用被指向另外一个不是相同类型的变量。

//由于类型擦除,编译器会将elements转换为Object[] elements,这时,堆污染将可能产生。
@SafeVarargs     //不提示堆污染警告
public static <T> void addToList(List<T> listArg, T... elements) {    //elements编译实现为数组
    for (T x : elements) {
        listArg.add(x);
    }
}


重构地球
68 声望4 粉丝

rust-zero


下一篇 »
对象