java 基础 知识点,易错点,面试点 总结

2019-07-23  本文已影响0人  吾心仔

1. 关于JVM、JDK和JRE

JVM
如何理解Java字节码

在 Java 中,JVM可以理解的代码就叫做字节码(即扩展名为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效,而且,由于字节码并不针对一种特定的机器,因此,Java程序无须重新编译便可在多种不同操作系统的计算机上运行。

Java 程序从源代码到运行一般有下面两步:

  1. 源代码 ==> 字节码文件
  1. 字节码文件 ==> 可执行的机器码
JDK 和 JRE
JDK (Java Development Kit)

功能齐全的Java SDK。等同于 JRE + 编译器(javac)+ 工具(如javadoc和jdb)。能够创建和编译程序。

JRE (Java Runtime Environment)

Java运行时环境。它是运行已编译 Java 程序所需的所有内容的集合,包括 Java虚拟机(JVM),Java类库,java命令和其他的一些基础构件。但是,它不能用于创建新程序。

总结

要运行一下 Java 程序的话,只需要安装 JRE 就可以了。如果需要进行一些 Java 编程方面的工作,那么你就需要安装JDK了。但是,这不是绝对的。有时,即使您不打算在计算机上进行任何Java开发,仍然需要安装JDK。例如,如果要使用JSP部署Web应用程序,那么从技术上讲,您只是在应用程序服务器中运行Java程序。那你为什么需要JDK呢?因为应用程序服务器会将 JSP 转换为 Java servlet,并且需要使用 JDK 来编译 servlet。

2. Java和C++的区别

3. 接口和抽象类的区别

4. String StringBuffer 和 StringBuilder的差异

String

使用 final 关键字修饰字符数组来保存字符串,内部持有一个final 类型的字符数组,所以 String 对象是不可变的。
StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串char[]value 但是没有用 final 关键字修饰,所以这两种对象都是可变的。

StringBuffer

内部方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。
每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。

StringBuilder

没有对方法进行加同步锁,所以是非线程安全的。
对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。

使用总结

5. == 与 equals 的区别

==

它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象(基本数据类型==比较的是值,引用数据类型==比较的是内存地址)。

equals

判断两个对象是否相等

  1. 类没有覆盖 equals() 方法。则通过 equals() 比较该类的两个对象时,等价于通过“==”比较这两个对象。
  2. 类覆盖了 equals() 方法。一般,我们都覆盖 equals() 方法来比较两个对象的内容是否相等;若它们的内容相等,则返回 true (即,认为这两个对象相等)。
String 的 equals 方法说明

6. hashCode() 和 equals()

hashCode() 的作用

hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。

equals上述已有说明
更多可见 Java hashCode() 和 equals()的若干问题解答

7. 线程的状态

image.png

由图片可知:

8. Java关键字

可见 Java 关键字总结

9. Arraylist 与 LinkedList 区别

  1. 底层结构
  1. 是否保证线程安全
  1. 操作时间复杂度
  1. 是否支持快速随机访问(快速随机访问就是通过元素的序号快速获取元素对象(对应于get(int index) 方法))

具有快速随机访问主要看是否实现了 RandomAccess 接口,但是源码 RandomAccess 接口中什么都没有定义。所以, RandomAccess 接口是一个标识, 标识实现这个接口的类具有随机访问功能。

  1. 内存空间占用

10. HashMap 和 Hashtable 的区别

  1. 线程是否安全
  1. 对Null key 和Null value的支持
  1. 底层数据结构
  1. 初始容量大小和每次扩充容量大小的不同
备注

关于详细分析HashMap 可见: Java 8系列之重新认识HashMap

11. 如何理解分析Java内存区域

Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。

详情可见: 可能是把 Java 内存区域讲的最清楚的一篇文章

12. Thread sleep() 和 wait() 方法的区别

上一篇 下一篇

猜你喜欢

热点阅读