概念
修饰符:
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);
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。