java面试题(杨晓峰)---第一讲谈谈你对java平台的理解
本人总结:
面向对象(封装,继承,多态)
平台无关性(jvm运行,class文件)
语言(泛型,lambda)
类库(集合,并发,网络,io/nio)
jre(java运行环境,JVM,类库)
JDK(java开发工具,包括JRE,javac,诊断工具)
"一次编译,到处执行"java平台依靠JVM和.class字节码文件屏蔽不同平台软件硬件差异.认为C/C++是面向操作系统的编程,java是面向虚拟机的编程.
通过增加一个间接地中间层来"解耦"是计算机领域常用的一门"艺术手法".如:虚拟机,操作系统,http等.
从你接触java开发到现在,你对java最直观的印象是什么呢?是他宣传的"write once ,run anywhere"还是目前看已经有些形式主义的语法呢?你对于java平台到底了解到什么程度?请先停下来总结思考一下.
今天我要问你的问题是,谈谈你对java平台的理解?"java是解释执行"这句话正确吗?
典型回答.
java本身是一种面向对象的语言,最显著地特征有两个方面,一是所谓的"书写一次,到处运行.write once,run anywhere"能够非常容易的获得跨平台能力,另外就是垃圾回收,java通过垃圾回收器,回收分配内存,大部分情况下,程序员不需要自己操心内存的分配和回收.我们日常会接触到JRE或者JDK,jre就是java的运行环境,包括:jvm和java类库,以及一些模块等.jdk可以看做jre的一个超集,提供更多工具,如:编译器,各种诊断工具.
对于"java是解释执行"这句话并不准确,我们开发的java源代码,首先通过javac编译成字节码,然后运行时,通过java虚拟机(JVM)内嵌的解释器将字节码转换成为最终的机器码,但是常见的jvm,比如我们大多数情况下使用的oracleJDK提供的hotspot jvm,都提供了jit编译器,就是通常所说的动态编译器,jit能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行,而不是解释执行.
考点分析;
其实这个问题,问的有点笼统.题目本身是非常开放的,往往考察的是多个方面,比如,基础知识理解是否清晰,是否掌握java平台主要模块和运行原理,很多面试者会在这种问题上吃亏,稍微紧张一下,就不知从何说起.
对于这类笼统的问题,你需要尽量表现出自己的思维深度和系统化理解,java知识理解也要全面.避免让面试官觉得是"知其然而不知其所",毕竟明白基本组成和机制,是日常工作中进行问题诊断或者性能调优等多方面事情的基础,相信没人会不喜欢"热爱学习和思考"的面试者.
即使觉得自己的回答不是非常完善,也不用担心,我个人觉得这种笼统的问题,回答的片面写也是正常,大多数有经验的面试官,不会因为一个问题轻易对面试者下结论.会尽量引导面试者展示他的真实水平.这种问题是开场热身,然后根据你的回答拓展问题.
知识拓展
回归正题,对于java平台的理解,可以从很多方面简明扼要的谈,例如;java语言特性包括泛型,lambda等语言特性.基础类库,包括集合,io\nio,网络,并发,安全等基础类库.对于我们日常工作应用较多的类库,面试前可以系统总结,有助临场发挥.
或者谈谈jvm的一些基础概念和机制,比如java的类加载机制,常用版本jdk的内嵌的class-loader,例如bootstrap,application,和extension class-loader,类加载大致过程;加载,验证,连接,初始化(周志明<深入理解java虚拟机>很好的jvm上手书籍)自定义class-loader等.还有垃圾收集的基本原理,最常见的垃圾收集器,如cms,g1等对于适用于什么样的工作负载也要心理有数,这些都是可以拓展的领域,在后面专栏进行更系统介绍.
jdk或java领域的工具,如编译器,运行时环境,安全工具,诊断和监控工具.这些基本工具是日常日常工作效率的保证.而对于其他的语言平台,也是触类旁通.
这是总结的一个宽泛蓝图
回到前面讨论的解释执行和编译执行,有些面试官喜欢刨根问底.因为这是了解面试者知识深度的有效方法,我们进行深入探讨.
我们将java分成:编译时期和运行时期.java的编译不同于c/c++生成可以直接执行的机器码的编译.
java源码编译生成".class"文件,此文件实际为字节码,并非可以直接执行的机器码.
java通过字节码和java虚拟机(JVM)这些跨平台的抽象,屏蔽了操作系统和硬件的细节.这是实现"一次编译,到处执行"的基础.
在运行时,jvm会通过类加载器加载字节码,解释或者编译执行..java虚拟机启动时可以指定不同的参数对运行模式进行选择.
java虚拟机启动时,可以指定不同的参数对运行模式进行选择.
jvm作为一个强大的平台.不仅可以运行java语言,本质上字节码都可以运行.有大量jvm语言活跃在不同场景.
简单介绍java平台,提纲挈领构建整体印象,包括java语言,核心类库,java虚拟机.等
woj:
"一次编译,到处执行"说的是java语言跨平台的特性,java的跨平台特性与java虚拟机的存在密不可分.java通过字节码和java虚拟机(JVM)这些跨平台的抽象,屏蔽了操作系统和硬件的细节.这是实现"一次编译,到处执行"的基础.不同平台的java运行环境不同但是运行的字节码文件(.class)是相同的.因此才有了java一次编译到处执行的效果,跨平台语言不止java一种但是java是比较成熟的一种.java虚拟机和dos类似,相当于一个供程序运行的平台.
magict4;
我对"compile once ,run anywhere"这个宣传语提出的背景很感兴趣.似乎在暗示c语言的一个缺陷,对于每一个不同的平台,源代码都要被再次编译,但是不同的平台可执行的机器码必然不同,源代码必然需要依据不同平台再次被编译.所以这并不是焦点.
焦点并不是在编译上,而是在对源文件的修改上,c语言经常需要调用系统层面的API.但不同系统的api一般不同,因此为了支持不同的平台c语言的源代码需要根据不同的平台修改源代码,这是一个非常大的通电.
三军;
java特征:
面向对象(封装,继承,多态)
平台无关性(jvm运行,class文件)
语言(泛型,lambda)
类库(集合,并发,网络,io/nio)
jre(java运行环境,JVM,类库)
JDK(java开发工具,包括JRE,javac,诊断工具)
java是解析运行的吗?
两种都有.
1.java源代码经过javac编译成.class文件
2..class文件经过jvm编译或解析运行.
①解析:.class文件经过jvm内嵌的解析器解析执行.
②编译:存在JIT编译器(即时编译器)把经常运行的代码作为热点代码,编译为与本地平台相关的代码,并进行各种层次的优化.
③AOT编译器,java 9提供的直接将所有代码编译成机器码执行.
jerry银银
首先,个人觉得这个题目非常抽象和笼统,本身没有标准答案.但是答案有好坏我的理解:
宏观层面: