1. 面向对象和面向过程的区别
- 面向过程 :单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发。面向过程没有面向对象易维护、易复用、易扩展。
- 面向对象 :面向对象易维护、易复用、易扩展。 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。
2、Java性能比C/C++低的原因
Java 是半编译语言,执行时需要将字节码转换为机器码,C/C++直接执行机器码。
3. Java 语言有哪些特点
- 简单易学
- 面向对象(封装,继承,多态)
- 平台无关性( Java 虚拟机实现平台无关性)
- 可靠性
- 安全性
- 支持多线程
- 支持网络编程并且很方便
- 编译与解释并存(解释:JVM将字节码转换为机器码,并执行)
4、JVM
Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。
什么是字节码?采用字节码的好处是什么?
在 Java 中,JVM 可以理解的代码就叫做
字节码
(即扩展名为.class
的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。
字节码=>机器码,源代码=>机器码,Java 程序运行时比解释型语言要高效。
字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。
Java 程序从源代码到运行一般有下面 3 步:
.class->机器码 这一步, JVM 类加载器首先加载字节码文件,然后通过解释器逐行解释执行,这种方式的执行速度很慢。
有些方法和代码块是经常需要被调用的(也就是所谓的热点代码),所以后面引进了 JIT 编译器,JIT 属于运行时编译,当 JIT 编译器完成第一次编译后,其会将字节码对应的机器码保存下来,下次可以直接使用。
HotSpot 采用了惰性评估(Lazy Evaluation)的做法,根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。JDK 9 引入了一种新的编译模式 AOT(Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。JDK 支持分层编译和 AOT 协作使用。但是 ,AOT 编译器的编译质量是肯定比不上 JIT 编译器的。
5、JDK 和 JRE
JDK 即 Java Development Kit,它是功能齐全的 Java SDK。它拥有 JRE 所拥有的一切,还有编译器(javac)和工具(如 javadoc 和 jdb)。它能够创建和编译程序。
JRE 是 Java 运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java 虚拟机(JVM),Java 类库,java 命令和其他的一些基础构件。但是,它不能用于创建新程序。
如果你只是为了运行一下 Java 程序的话,那么你只需要安装 JRE 就可以了。如果你需要进行一些 Java 编程方面的工作,那么你就需要安装 JDK 了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何 Java 开发,仍然需要安装 JDK。例如,如果要使用 JSP 部署 Web 应用程序,那么从技术上讲,只是在应用程序服务器中运行 Java 程序。那为什么需要 JDK 呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。
6、 Oracle JDK 和 OpenJDK 的对比
- OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;
- Oracle JDK 比 OpenJDK 更稳定。OpenJDK 和 Oracle JDK 的代码几乎相同,但 Oracle JDK 有更多的类和一些错误修复。如果想开发企业/商业软件,建议选择 Oracle JDK。
- 在响应性和 JVM 性能方面,Oracle JDK 比 OpenJDK更出色。
- Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过更新到最新版本来获得支持。
7. Java 和 C++的区别
- 都是面向对象的语言,都支持封装、继承和多态
- Java 不提供指针来直接访问内存,程序内存更加安全
- Java 的类是单继承的(只能直接继承一个父类,但可以同时实现多个接口),C++ 支持多重继承。 Java 的类不可以多继承,但是接口可以多继承,一个接口可以同时继承多个父接口。
- Java 有自动内存管理机制,不需要程序员手动释放无用内存
在 C 语言中,字符串或字符数组最后都会有一个额外的字符‘