首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

4个Java小功能,你都知道吗?

java是一个漫长而传奇的历史大语言。在过去的几十年里,许多功能悄悄加入其中。在这篇文章中,我们将看看一些有用的,但却经常被忽视的语言特点。

Java语句可能会被修改执行顺序

如果我们创建了一个打印变量值的单线程应用程序,我们可以假定我们源代码中提供的代码行(更精确地说,每个指令)是按顺序执行的,从第一行开始,最后一行结束。按照这种假设,下面的代码片段将将3打印到标准输出:

简单的输出语句

通过代码,我们可以知道1被赋值给变量x,然后2被赋值给y,但是并不是总这样。仔细观察后,我们可以发现前两行的顺序不会影响应用程序的输出:如果y首先被赋值,然后x,系统的行为不会改变。我们仍然会看到3打印到标准输出。通过这种观察,编译器可以根据需要安全地重新排序这两个指令,因为它们的重新排序不会改变系统的总体行为。当我们编译代码时,编译器就这样做:只要不改变系统的可观察行为,编译器就可以自由重新排列上面的指令。

虽然重新排列上面的行可能是徒劳的努力,但在许多情况下,重新排序可能允许编译器进行一些非常显著的性能优化。例如,假设我们有下面的代码片段,其中我们的x和y变量以交错方式递增两次:

很多中间过程的输出语句

无论编译器如何优化这段代码,它都应该打印8。但是这段代码有非常大的优化空间,编译器能够发现这些优化空间,并优化它,这个过程就会调整我们的代码执行顺序。

c/c++初学者有什么不懂的可以问我,一起来学习!——我刚整理了一套2018最新的0基础入门教程和进阶教程,无私分享,加裙六一二五九四四五九, 即可获取,内附:开发工具和安装包,以及系统学习路线图

不同优化情况的代码

实际上,编译器的优化可能更进一步,只需在打印语句中内联x和y的值,从而消除在变量中存储每个值的开销,但为了演示,就足以说明重新排序指令允许编译器对性能进行一些严重的改进。

数字中间是可以使用下划线的

无论是在计算中,还是在纸和铅笔的数学中,大量的数据都很难阅读。例如,试图辨别1183548876845实际上是“1万亿1835亿4887万6845”是很辛苦的。在英语中可以通过包含逗号分隔符来分割这些数字,允许一次三位数字分组。前面的数字我们可以书写为:1,183,548,876,845,通过这种逗号的分割,我们可以快速的确认这个数字超过一万亿。

其实在Java中可以使用类似的方法书写数字:

有下划线的数字

其实,下划线可以放在一个数字中的任意点(不只是分隔三个数字组),只要它不是前缀,后缀,与浮点值中的小数点相邻,或者与十六进制中的x相邻。

Java封装类是会使用缓存的

对象比较

上面的代码在我们的日常开发中都会遇到,也非常的好理解:“==”比较的是对象的内存地址,这是两个对象,所以是false;equals比较的是两个对象的值,所以true。

那么如果给对象赋值25,而不是500又会怎么样呢?

c/c++初学者有什么不懂的可以问我,一起来学习!——我刚整理了一套2018最新的0基础入门教程和进阶教程,无私分享,加裙六一二五九四四五九, 即可获取,内附:开发工具和安装包,以及系统学习路线图

对象比较

这个时候我们会发现不管是“==”还是equals都返回true。这是因为Java封装类中有一个非常重要的特性:Java封装类会把一些比较小(也比较常用的)的zhi进行缓存,每次封箱时直接从缓存中获取,一般是缓存-128 ~ 127。这个特性就会使得较小的这些数字通过封箱操作得到封装类的时候实际上使用的是同一个对象。

IntegerCache类的实现

字符串拼接时优先考虑StringBuilder

字符串连接是几乎所有编程语言的共同部分,在java是字符串是不可变的。这意味着我们不能简单地创建一个字符串实例并不断地追加它。相反,每个追加产生一个新字符串对象。如果我们看看concat(String)方法,我们会发现,它每一次都会生成一个新的字符串实例:

String concat方法实现

如果我们使用String的concat方法进行字符串连接,就会产生大量中介字符串实例。

这种需要进行大量拼接工作,会有很多中介字符串产生的情况,我们可以使用StringBuilder来处理。StringBuild可以看作是一个缓存,它可以在我们需要最终字符串的时候实例化生成一个字符串,从而省去了很多中介字符串。

c/c++初学者有什么不懂的可以问我,一起来学习!——我刚整理了一套2018最新的0基础入门教程和进阶教程,无私分享,加裙六一二五九四四五九, 即可获取,内附:开发工具和安装包,以及系统学习路线图

StringBuilder进行字符串拼接

比如上面的代码只需要实例化一个字符串,而如果使用普通的字符串拼接,则会多产生1000个不必要的字符串。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180401A0ZTBF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券