Java 10 大装 B 写法,看完可以出去吹了!


Java 10 大装 B 写法,看完可以出去吹了!

文章插图
 
1、集合初始化集合的创建、赋值一步到位,想不想学?
来,上边跟我一起画个 List,在你下边画一个Map……List<String> list = new ArrayList<String>() {{    add("www.");    add("JAVAstack.");    add("cn");}};Map<String, String> map = new HashMap<String, String>() {{    put("1", "www.");    put("2", "javastack.");    put("3", "cn");}};哈哈,高大上的写法,栈长以前写过,写法虽然是很装X,然而并没有什么卵用 。
2、算术static {    final int size = -(-128) + 127 + 1;    // Load and use the archived cache if it exists    VM.initializeFromArchive(ByteCache.class);    if (archivedCache == null || archivedCache.length != size) {        Byte[] c = new Byte[size];        byte value = (byte)-128;        for(int i = 0; i < size; i++) {            c[i] = new Byte(value++);        }        archivedCache = c;    }    cache = archivedCache;}注意到上面size的写法没有?
明明可以写成:
final int size = 256;他非要写成:
final int size = -(-128) + 127 + 1;这么装 B 的写法来自 JDK 包装类java.lang.Byte里面的静态方法 。
为什么要这么写呢?
这样的写法在 JDK 里面有很多,大家看到这些写法都会觉得很奇怪,Java技术栈微信群里、知识星球里面有曾有粉丝问我这是为什么 。
真正缘由无从考察,但栈长我觉得写 JDK 的大神其实就想告诉你,Byte 的 256 个数是由 -128 ~ 127 这个范围组成的,起到一个标识数字范围的作用而已 。至少 Byte 为什么取这个范围,为什么byte取值-128~127??这篇文章可以解密 。
3、移位/** * The default initial capacity - MUST be a power of two. */static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16/** * The maximum capacity, used if a higher value is implicitly specified * by either of the constructors with arguments. * MUST be a power of two <= 1<<30. */static final int MAXIMUM_CAPACITY = 1 << 30;这两个变量来自java.util.HashMap源码,你可能也非常好奇为什么不直接写成数字,要弄一个移位骚操作?
这是在告诉开发者,HashMap 的容量大小必须是 2 的幂次,不然会造成空间浪费 。另外,HashMap 容量为什么总是为 2 的次幂?这篇推荐看下 。
4、复制变量transient Collection<V> values;public Collection<V> values() {    Collection<V> vs = values;    if (vs == null) {        vs = new Values();        values = vs;    }    return vs;}以上同样来自java.util.HashMap的源码,为什么不直接用values:
transient Collection<V> values;public Collection<V> values() {    if (values == null) {        values = new Values();    }    return values;}而要重新定义一个vs来绕一个弯呢?
这样写不是更简单么?
JDK里面大量这样的写法,这是为什么呢?!
那是因为操作局部变量要比读取全局变量要更快,另外,我个人觉得还有一个好处,再申明一下局部变量,可以很明显的看到这个变量的类型,而不要翻到上面或者用鼠标移上去来看变量类型 。


推荐阅读