文章插图
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里面大量这样的写法,这是为什么呢?!
那是因为操作局部变量要比读取全局变量要更快,另外,我个人觉得还有一个好处,再申明一下局部变量,可以很明显的看到这个变量的类型,而不要翻到上面或者用鼠标移上去来看变量类型 。
推荐阅读
- 简单解释7个主要JavaScript概念
- JavaScript之call和apply的模拟实现
- Spring Boot 一个接口同时支持 form 表单、form-data、json 优雅写法
- 不借助 Javascript,利用 SVG 快速构建马赛克效果
- JavaScript高手进阶:安全键盘
- JavaScript Blob 对象解析
- 16个超级实用的Java工具包
- Java 到底是值传递还是引用传递?
- 是否应该停止在JavaScript代码中使用forEach?
- Java中异常处理的10个最佳实践