1. JVM JDK 和 JRE的联系与区别
(1)JDK :JDK是Java开发工具包,是整个JAVA的核心,包括了Java的运行环境(JRE)、一堆Java工具(javac、java、jdb等)和Java基础的类库(即Java API包括rt.jar)。在jdk安装目录中,真正在运行java时起作用的是以下四个文件夹:bin、include(java和jvm交互用的头文件)、lib(类库)、 jre(java运行环境),JDK包含JRE,而JRE包含JVM。
JDK是用于java程序的开发,而jre则是只能运行class而没有编译的功能。
Java面试之Java基础(一)
(2)JRE:JRE包含JVM标准实现及Java核心类库。在Java平台下,所有的Java程序都需要在JRE下才能运行。只有JVM还不能进行class的执行,因为解释class的时候,JVM需要调用解释所需要的类库lib。JRE里面有两个文件夹bin和lib,这里可以认为bin就是JVM,lib就是JVM所需要的类库,而JVM和lib合起来就称为JRE。
(3)JVM:JVM是JRE的一部分,它是一个虚拟出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。JVM是Java实现跨平台最核心的部分,所有的Java程序会首先被编译为.class的类文件,JVM的主要工作是解释自己的指令集(即字节码)并映射到本地的CPU的指令集或OS的系统调用。Java面对不同操作系统使用不同的虚拟机,依次实现了跨平台。JVM对上层的Java源文件是不关心的,它关心的只是由源文件生成的 .class 文件。
联系与区别:

  1. 联系:我们利用JDK(调用JAVA API)开发了属于我们自己的JAVA程序后,通过JDK中的编译程序(javac)将我们的java文件编译成JAVA字节码,在JRE上运行这些JAVA字节码,JVM解析这些字节码,映射到CPU指令集或OS的系统调用。
  2. 区别:
    a.JDK和JRE区别:在bin文件夹下会发现,JDK有javac.exe而JRE里面没有,javac指令是用来将java文件编译成.class文件的,这是开发者需要的,而用户(只需要运行的人)是不需要的。JDK还有jar.exe,javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
    b.JRE和JVM区别:JVM并不代表就可以执行class了,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

2. Java语言的编译与解释并存
高级编程语言按照程序的执行方式分为编译型和解释型两种。简单来说,编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征,因为 Java 程序要经过先编译,后解释两个步骤,由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须由 Java 解释器来解释执行。因此,我们可以认为 Java 语言编译与解释并存。

3. JAVA中的几种数据类型
Java语言提供了八种基本数据类型。六种数据类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。

  • byte:1字节,表示范围是-128~127之间。
  • short:2字节,表示范围是-32768~32767之间。
  • int:4字节,表示范围是负的2的31次方到正的2的31次方减1。
  • long:8字节,表示范围为负的2的63次方到正的2的63次方减1。
  • float:4字节,表示范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
  • double:8字节,表示范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
  • boolean:只有true和false两个取值。
  • char:2字节,存储Unicode码,用单引号赋值。

4. String,StringBuffer,StringBuilder的区别

  • String为字符串常量(因为内部数组value[]有final修饰),而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。
  • 在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的,因为StringBuffer在append()方法上添加了synchronized修饰。
  • String,StringBuffer,StringBuilder都被final修饰,不能继承
  • String变量创建后是放入方法区的常量池(或者常量池)中,而StringBuilder和StringBuffer则是存入堆中。

构造String对象的四种方式:

  • 方式一:String str1=“123”;
    通过引号直接创建字符串对象,先会从常量池中判断是否存在"123"对象;
  • 方式二:String str2=new String(“123”);
    首先"123"是一个常量字符串,因此会先在常量池创建"123"字符串对象,然后在堆中再创建一个字符串对象,将"123"的字符数组复制到堆中新创建的对象字符数组中;
  • 方式三:String str3=“123”.intern();
    该种方式通过intern方法返回一个字符串引用,当常量池中存在"123"字符串常量时,则直接返回该常量池中的字符串引用;若不存在,则会先在常量池中创建"123"字符串对象,然后返回新创建对象的引用;
  • 方式四:String str4=str2.intern();
    intern 方法会先判断常量池中是否存在与str2 相同字符串的对象,若有,则返回该引用;若无,则在常量池创建一个引用指向 str2,然后返回该引用,实际上返回的是 str2 的引用。

5. ArrayList和LinkedList有什么区别

  • ArraryList:底层是基于动态数组,根据下标随机访问数组元素的效率高,向数组尾部添加元素的效率高;但是,删除数组中的数据以及向数组中添加数据效率低,因为需要移动数组。Arraylist在数组元素超过其容量大,Arraylist可以进行扩容。
  • LinkedList:基于链表的动态数组,数据添加删除效率高,只需要改变指针指向即可,但是访问数据的平均效率低,需要对链表进行遍历。

区别:

  • ArraryList是基于动态数组的数据结构,LinkeList是基于链表的数据结构(LinkedList是双向链表,有next也有previous)。
  • 对于随机访问get和set,ArrayList优于LinkedList,因为LinkedList要移动指针。
  • 对于新增和删除操作add和remove,LinkedList比较占优势,因为ArrayList要移动数据。

相关文章: