java语言的一些思考

java语言经过20多年的发展,无外乎下面几个目标
  • 性能
从jdk1.0到现在jdk1.9 jvm的垃圾回收算法从serial、ParScavenge、Parallel Scavenge、CMS、G1都是以提高垃圾回收的效率为终极目标。
jdk1.8以后HashMap的实现方式由链表+数组改为根据容量自动在链表和红黑树之间转换,也是为了解决在大数量情况下改善HashMap性能的问题
NIO(非阻塞IO)的引入
  • 安全
jdk1.5中引入了concurrent包,例如ConcurrentHashMap增加了线程安全的Map
  • 易用
jdk1.5中引入了concurrent包,使得多线程的开发变得简单了
泛型
lamda表达式
流式操作


2.编辑和解释的理解?
从传统意义上讲所谓编译与解释,区别于代码在什么时候被翻译成目标CPU的指令。
这个概念从科学上有些说不通,但是却是大家更认可的约定俗成的定义。

对于C语言来说,编译生成了目标文件,而这个文件就是针对特定CPU体系的,为ARM生成的目标文件不能被用于MIPS的CPU。这段代码在在编译的过程中就被翻译成了目标的CPU指令,所以如果这个程序需要在另外一种CPU上面运行,这个代码就必须重新编译。

对于各种非编译性语言,例如Python、java来说,同样也可能存在某种编译过程,但他们编译生成的通常是一种平台无关的中间代码,这种代码一般是不能针对特定的CPU平台的,他们是在运行过程中才被翻译成目标CPU指令的,因而,在ARM CPU上能执行,换到MIPS也能执行,换到X86也能执行,不需要重新对源代码进行编译。

明白了上面概念,至于为什么会有虚拟机的存在?这个答案也很简单了,因为那些非编译性语言生成的目标不是CPU可以执行的指令,而是某种中间代码。而能够执行这种中间代码机器并不存在,所以我们在每个不同的平台中用软件模拟出这个假想的平台的虚拟机,这个虚拟机可以执行中间代码,而虚拟机负责把代码转换成最终目标平台上的指令。


个人对于jvm执行class文件的理解?
class文件首先是一个二进制的的字节码文件,但它的0101机器代码由于不符合CPU的指令集所以不能被直接被执行。当执行到某一段代码时有jvm将这段代码(注意:仅仅是这段代码而不是所有的类生成的代码,确切地说应该是这个方法,因为java在执行的过程就是方法调用的过程)转换为符合CPU指令集规范的机器码,然后再执行。由此我们看出class字节码变成可被CPU执行的机器码是一边翻译一遍执行的,在这个层面来讲java应该是解释性语言。再通俗点讲CPU执行的机器码是提前一次性准备好的还是需要什么准备什么。一个很形象的例子: 吃炒菜和吃火锅。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

卫涛涛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值