1、面向对象和面向过程的区别
- 面向过程:面向过程比面向对象性能高。因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能作为考量的重要指标时,例如:单片机、嵌入式开发、linux\Unix开发一般采用的是面向过程。
- 面向对象:面向对象开发易维护,易复用,易扩展。因为面向对象有封装、继承、多态性的特征,可以设计出低耦合、高可用的代码。但是性能比面向过程低。
- 注:①、面向过程也需要分配内存、计算内存偏移量;java性能差的主要原因:java语言是半编译语言,最终执行代码不是cpu可以直接执行的二进制机械码。②、面向过程语言大部分是直接编译成机械码在电脑上运行,但是一些面向过程的脚本语言性能不一定比java好。
2、Java语言的特点
- 简单易学
- 面向对象(封装、继承、多态性)
- 平台无关性(一次编译,到处运行)
- 可靠性
- 安全性(java的沙箱安全模型,①、类加载器结构,双亲委托机制;②、class文件校验器,class文件之间的协调一致;四趟扫描,类加载器检验内部结构,确认是否遵循java开发语义,检验全部字节完整性,检验引用的类、常量、方法是否存在;③、java虚拟机内置的安全特性,类型安全的引用转换;结构化的内存访问(无指针算法);gc收集器;数组边界检查;空指针检查;④、安全管理器和java api)
- 支撑多线程(c++没有多线程机制,需调用系统的多线程功能来设计多线程程序,java语言提供了多线程的支持)
- 支持网络编程并且很方便(java诞生就是为了简化网络编程设计的)
- 编译与解释并存(java代码都是需要编译的,编译后的.class文件,java代码编译后不能直接运行,由jvm解释运行;现在jvm为了效率,都有一些JIT优化,将.class文件二进制代码编译成本地代码直接运行)
3、jvm、jdk和jre
- jvm java虚拟机(jvm)是运行java字节码的虚拟机。jvm有针对不同的操作系统的特定实现,目的就是实现一次编译,到处运行。字节码(.class文件)它不做任何特定的处理器,只面向jvm所以无需重新编译就可在各种操作系统上运行,解决了传统解释型语言执行效率低的问题,也保留了解释型语言的可移植性的特点。
- HotSpot采用惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分资源的只有那么一小部分代码,通过JIT来编译优化,JVM会根据执行的情况作出相应的优化,执行的越多,速度越快。
- 注:jdk9引入了一种新的编译模式AOT(Ahead of Time Compilation),它直接将字节码编译成机器码,便面了JIT预热等的开销。jdk支持分层编译和AOT协作使用。AOT编译的质量比不上JIT的。
- jdk 是Java Development Kit, java开发环境(编译器(javac)、工具(javadoc和jdb))和运行环境(JRE的一切),能够创建和编译程序。
- jre是java运行环境。运行编译的java程序和java虚拟机,java类库,java命令、基础构件。
4、oracle jdk 和 openjdk的对比
- 功能大致接近,oracle jdk增加了几个部分
- 部署代码,oracle的java插件和java WebStart的实现。源代码派对组件,如图形光栅化器;开源的第三方组件,如Rhino;文件,第三方字体等。
- 稳定性更高,持续新版本更新,响应性和JVM性能更好。
5、java和C++的区别
- 都是面向对象语言,都支持封装、继承、多态。
- java不提供指针来直接访问内存,程序内存更加安全。
- java类是单继承的,c++是多继承的;java的接口可多继承。
- java有自己的内存管理机制,不需要程序员手动释放无用内存。
- java里的一切是对象,对象的字符串有长度,因此不需要增加一个字节来存放结束符。C语言会使用‘/0’来表示字符串或数组的结束。