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 values;
public Collection values() {
Collection vs = values;
if (vs == null) {
vs = new Values();
values = vs;
}
return vs;
}
以上同样来自java.util.HashMap
的源码,为什么不直接用values
:
transient Collection values;
public Collection values() {
if (values == null) {
values = new Values();
}
return values;
}
而要重新定义一个vs
来绕一个弯呢?
这样写不是更简单么?
JDK里面大量这样的写法,这是为什么呢?!
那是因为操作局部变量要比读取全局变量要更快,另外,我个人觉得还有一个好处,再申明一下局部变量,可以很明显的看到这个变量的类型,而不要翻到上面或者用鼠标移上去来看变量类型。
另外提一点,上面的复制变量再操作的方式让我想到了CopyOnWriteArrayList,这也是让当前变量不被其他线程改变保证当前线程变量一致性的一种方式。
写 JDK 源码的都是大神啊,透过源码,我们能学到太多东西!
5、泛型
来看一段泛型的灵活运用:
public Observable compose(Transformer<? super T, ? extends R> transformer) {
return ((Transformer<T, R>) transformer).call(this);
}
这个泛型方法写得牛 X 吧,泛型 T、R、通配符(?)、上边界(extends)和下边界(super)都用上了!
常用的泛型含义:
-
T - Type(类型)
-
R - Result(结果)
-
K - Key(键)
-
V - Value(值)
-
E - Element (元素)
-
N - Number(数字)
-
? - 不确定类型
上面的泛型我们应该有常见到吧,边界和通配符不懂的可以看下这篇文章吧:困扰我多年的Java泛型 和 ,终于搞清楚了。
泛型要学会用,学好能装B。
6、Lambda
Lambda 表达式这是 Java 8 里面添加的新特性,用来简化匿名内部类以及结合函数式接口编程用的。
如下面创建线程的示例:
// 1
Runnable runnable = () -> System.out.println(“javastack.cn”);
new Thread(runnable).start();
// 2
new Thread(() -> System.out.println(“javastack.cn”)).start();
// 3
new Thread(() -> clean()).start();
三个不同的写法,我们再也不用写new Runnable()
的一大堆 的匿名内部类了,是不是很清爽了!
如果你还不会用Lambda
表达式,那真的 OUT 了,可以关注微信公众号:Java技术栈,在后台回复:新特性,我已经写了一大堆教程了。
下面是一个Lambada
真实案例:
@Bean
public CommandLineRunner commandLineRunner(NettyServer nettyServer) {
return (args) -> {
Thread thread = new Thread(() -> nettyServer.start());
thread.setDaemon(true);
thread.start();
};
}
上述示例省去了 newCommandLineRunner
的匿名内部类的过程。
7、函数式编程
上面有提到函数式编程,这是 Java 8 里面添加的新特性,我之前在公众号里已经写过很多 Java 新特性的教程,这也不是新玩法了,已经被玩烂了。
来看一个真实的案例,来自 Spring Boot 的邮件发送自动配置:
private void applyProperties(JavaMailSenderImpl sender) {
PropertyMapper map = PropertyMapper.get();
map.from(this.properties::getHost).to(sender::setHost);
map.from(this.properties::getPort).whenNonNull().to(sender::setPort);
map.from(this.properties::getUsername).to(sender::setUsername);
map.from(this.properties::getPassword).to(sender::setPassword);
map.from(this.properties::getProtocol).to(sender::setProtocol);
map.from(this.properties::getDefaultEncoding).whenNonNull().as(Charset::name)
.to(sender::setDefaultEncoding);
map.from(this.properties::getProperties).whenNot(Map::isEmpty)
.as(this::asProperties).to(sender::setJavaMailProperties);
}
总结
一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。
这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。
最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!
Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。
还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
![在这里插入图片描述](https://upload-images.ji
必看视频!获取2024年最新Java开发全套学习资料 备注Java
anshu.io/upload_images/24616006-609cd6ac10e4be2c?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)