Java基础----常见的面试题(第一篇)

 声明:本专栏只是个人学习JavaGuide的过程笔记记录;

JavaGuide: JavaGuide(Java学习&面试指南) | JavaGuide

目录

1 基础概念与常识

1.1 Java语言的特点 

1.2 Java SE vs Java EE

1.3 JVM vs JDK vs JRE

1.4 什么是字节码?采用字节码的好处是什么?

1.5 为什么说 Java 语言“编译与解释并存”?

1.6 AOT 有什么优点?为什么不全部使用 AOT 呢?(不懂,后面更新)

1.7 Oracle JDK vs OpenJDK

1.8 Java 和 C++ 的区别?

2 基本语法

2.1 Java的注释类型

2.2 标识符和关键字的区别

2.3 Java语言的关键字有哪些?

2.4 自增自减运算符

2.5 移位运算符

2.6 continue、break和return的区别?

3 基本数据类型

3.1 Java数据类型分类

3.2 基本类型与包装类型的区别?

3.3 包装类型的缓存机制

3.4 自动装箱、拆箱以及其底层原理(底层代码)

3.5 为什么涉及到浮点数计算要使用BigDecimal

4 变量

4.1 成员变量与局部变量的区别

4.2 静态变量有什么作用

4.3 字符型常量与字符串型常量的区别

5 方法

5.1 方法分为哪几种类型,什么是方法的返回值?

5.2 静态方法为什么不能调用非静态成员?

5.3 静态方法与实例方法有什么不同

5.4 可变长参数


1 基础概念与常识

1.1 Java语言的特点 

  • 简单易学(Java是一种强类型语言,强制的语法规定,学起来比较容易掌握);
  • 跨平台(平台无关性);
  • 面向对象(封装、继承、多态);
  • 支持多线程(C++没有内置的多线程操作,只能根据操作系统的多线程功能进行多线程的程序设计,Java具有内置的多线程操作,比如Thread类与Runablle接口);
  • 可靠性(具备异常处理和内存管理机制GC);
  • 安全性,Java支持使用同步锁实现线程安全;
  • 支持网络编程;
  • 编译与解释共存;
  • 高效性(通过 Just In Time 编译器等技术的优化,Java 语言的运行效率还是非常不错的);

1.2 Java SE vs Java EE

        Java SE是面向桌面应用和小型设备的Java平台标准版。它提供了Java编程语言的核心库和虚拟机,适用于一般的应用程序开发。

        Java EE是面向大型企业级应用的Java平台企业版。它在Java SE的基础上提供了一系列的API和服务,以满足企业级应用的需求。

        总体而言,Java SE适用于一般的应用程序开发,而Java EE则专注于大型、分布式、事务性的企业级应用。在实际开发中,根据项目需求选择使用Java SE或Java EE,或者两者结合使用。最近的发展中,Java EE已经转移到Eclipse Foundation,并在Jakarta EE下继续发展。

1.3 JVM vs JDK vs JRE

JDK( J ava D evelopment K it Java 开发工具包 ):
        JDK是提供给 Java 开发人员使用的,其中包含了 java 的开发工具,也包括了JRE。所以安装了 JDK ,就不用在单独安装 JRE 了。
        其中的开发工具:编译工具(javac.exe) 打包工具 (jar.exe)

JRE(Java Runtime Environment Java运行环境)

        包括Java 虚拟机 (JVM J ava V irtual M achine) Java 程序所需的核心类库等,如果想要 运行 一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JVM(Java Virtual Machine,Java 虚拟机) 

        Java 虚拟机(JVM)是运行 Java 字节码的虚拟机。JVM 有针对不同系统的特定实现(Windows,Linux,macOS),目的是使用相同的字节码,它们都会给出相同的结果。字节码和不同系统的 JVM 实现是 Java 语言“一次编译,随处可以运行”的关键所在。

    JDK = JRE + 开发工具集(例如Javac编译工具等)

    JRE = JVM + Java SE标准类库
JVM、JRE、JDK关系图

1.4 什么是字节码?采用字节码的好处是什么?

        在Java中,Java虚拟机(JVM)所能理解识别的即为字节码,(使用javac.exe编译后的文件,.class后缀的文件)。这是Java“一次编译,到处运行”的关键,字节码文件只面向虚拟机,不因平台的不同而需要多次编译。

        它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。

1.5 为什么说 Java 语言“编译与解释并存”?

  • 编译型编译型语言open in new window 会通过编译器open in new window将源代码一次性翻译成可被该平台执行的机器码。一般情况下,编译语言的执行速度比较快,会产生中间代码,所以翻译成目标程序的时与具体的硬件机器有关,开发效率比较低。常见的编译性语言有 C、C++、Go、Rust 等等。
  • 解释型解释型语言open in new window会通过解释器open in new window一句一句的将代码解释(interpret)为机器代码后再执行。解释型语言开发效率比较快,不会生成中间代码,所以翻译成目标程序时与硬件无关,执行速度比较慢。常见的解释性语言有 Python、JavaScript、PHP 等等。

         Java语言即包含了编译型语言的特性,又包含了解释型语言的特性。因为Java会将Java源程序一次编译成JVM可识别的字节码文件(.class文件)。再由Java虚拟机去对该字节码进行解释执行;所以一共包含两个过程:①编译成JVM可识别的机器码文件;②JVM解释执行该字节码文件。

1.6 AOT 有什么优点?为什么不全部使用 AOT 呢?(不懂,后面更新)

1.7 Oracle JDK vs OpenJDK

  1. 是否开源:OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是基于 OpenJDK 实现的,并不是完全开源的(个人观点:众所周知,JDK 原来是 SUN 公司开发的,后来 SUN 公司又卖给了 Oracle 公司,Oracle 公司以 Oracle 数据库而著名,而 Oracle 数据库又是闭源的,这个时候 Oracle 公司就不想完全开源了,但是原来的 SUN 公司又把 JDK 给开源了,如果这个时候 Oracle 收购回来之后就把他给闭源,必然会引起很多 Java 开发者的不满,导致大家对 Java 失去信心,那 Oracle 公司收购回来不就把 Java 烂在手里了吗!然后,Oracle 公司就想了个骚操作,这样吧,我把一部分核心代码开源出来给你们玩,并且我要和你们自己搞的 JDK 区分下,你们叫 OpenJDK,我叫 Oracle JDK,我发布我的,你们继续玩你们的,要是你们搞出来什么好玩的东西,我后续发布 Oracle JDK 也会拿来用一下,一举两得!)OpenJDK 开源项目:https://github.com/openjdk/jdkopen in new window
  2. 是否免费:Oracle JDK 会提供免费版本,但一般有时间限制。JDK17 之后的版本可以免费分发和商用,但是仅有 3 年时间,3 年后无法免费商用。不过,JDK8u221 之前只要不升级可以无限期免费。OpenJDK 是完全免费的。
  3. 功能性:Oracle JDK 在 OpenJDK 的基础上添加了一些特有的功能和工具,比如 Java Flight Recorder(JFR,一种监控工具)、Java Mission Control(JMC,一种监控工具)等工具。不过,在 Java 11 之后,OracleJDK 和 OpenJDK 的功能基本一致,之前 OracleJDK 中的私有组件大多数也已经被捐赠给开源组织。
  4. 稳定性:OpenJDK 不提供 LTS 服务,而 OracleJDK 大概每三年都会推出一个 LTS 版进行长期支持。不过,很多公司都基于 OpenJDK 提供了对应的和 OracleJDK 周期相同的 LTS 版。因此,两者稳定性其实也是差不多的。
  5. 协议:Oracle JDK 使用 BCL/OTN 协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。

著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/java/basis/java-basic-questions-01.htm

既然 Oracle JDK 这么好,那为什么还要有 OpenJDK?

答:

  1. OpenJDK 是开源的,开源意味着你可以对它根据你自己的需要进行修改、优化,比如 Alibaba 基于 OpenJDK 开发了 Dragonwell8:https://github.com/alibaba/dragonwell8open in new window
  2. OpenJDK 是商业免费的(这也是为什么通过 yum 包管理器上默认安装的 JDK 是 OpenJDK 而不是 Oracle JDK)。虽然 Oracle JDK 也是商业免费(比如 JDK 8),但并不是所有版本都是免费的。
  3. OpenJDK 更新频率更快。Oracle JDK 一般是每 6 个月发布一个新版本,而 OpenJDK 一般是每 3 个月发布一个新版本。(现在你知道为啥 Oracle JDK 更稳定了吧,先在 OpenJDK 试试水,把大部分问题都解决掉了才在 Oracle JDK 上发布)

著作权归JavaGuide(javaguide.cn)所有 基于MIT协议 原文链接:https://javaguide.cn/java/basis/java-basic-questions-01.html

1.8 Java 和 C++ 的区别?

相同:面向对象、都支持封装、继承和多态

差异:

  1. Java 不提供指针来直接访问内存,程序内存更加安全
  2. Java 的类是单继承的,C++ 支持多重继承;虽然 Java 的类不可以多继承,但是接口可以多继承。
  3. Java 有自动内存管理垃圾回收机制(GC),不需要程序员手动释放无用内存。
  4. C ++同时支持方法重载和操作符重载,但是 Java 只支持方法重载(操作符重载增加了复杂性)。

2 基本语法

2.1 Java的注释类型

        Java有三种注释类型,单行注释、多行注释以及文档注释;注释不参与代码的执行。

   单行注释通常作为单行代码的解释;

   多行注释通常作为一段代码的解释;

   文档注释通常作为一个方法或者一个类的解释,并且会随着Java代码的编译生成开发者文档。

        代码的注释不是越详细越好。实际上好的代码本身就是注释,我们要尽量规范和美化自己的代码来减少不必要的注释。若编程语言足够有表达力,就不需要注释,尽量通过代码来阐述。

2.2 标识符和关键字的区别

        Java当中所有自己命名的名字都可称为标识符,比如包名,类名,接口名,参数名,变量名等都是标识符,并且每一类的命名有对应的规范。

说明:所有的标识符命名都要求见名思意;

包名多单词组成时所有字母都小写:xxxyyyzzz

类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz

变量名、方法名多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz

常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ

        关键字:被Java语言赋予了特殊含义,用做专门用途的字符串(单词);特点是关键字中所有字母都为小写

    注意:定义合法标识符规则:

  • 由26个英文字母大小写,0-9 ,_或 $ 组成;
  • 数字不可以开头。
  • 不可以使用关键字和保留字,但能包含关键字和保留字。
  • Java中严格区分大小写,长度无限制。
  • 标识符不能包含空格

2.3 Java语言的关键字有哪些?

用于定义类,函数,变量修饰符的关键字
abstractfinalstaticsynchronized
用于定义类与类之间的关键字
extendsimplements
用于建立实例、引用实例、判断实例的关键字
newthissuperinstanceof
用于异常处理的关键字
trycatchfinallythrowthrows
用于包的关键字
packageimport
其他修饰符关键字
native
strictfptransient volatileassert
用于定义数据类型值得字面值
truefalsenull

2.4 自增自减运算符

        在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1,Java 提供了一种特殊的运算符,用于这种表达式,叫做自增运算符(++)和自减运算符(--)。

运算符运算范例结果
++
自增(前):先运算后取值
a=2;b=++a;
a=3;b=3
自增(后):先取值后运算
a=2;b=a++; a=3;b=2
--
自减(前):先运算后取值
a=2;b=- -a
a=1;b=1
自减(后):先取值后运算a=2;b=a- - a=1;b=2

        ++ 和 -- 运算符可以放在变量之前,也可以放在变量之后,当运算符放在变量之前时(前缀),先自增/减,再赋值;当运算符放在变量之后时(后缀),先赋值,再自增/减。例如,当 b = ++a 时,先自增(自己增加 1),再赋值(赋值给 b);当 b = a++ 时,先赋值(赋值给 b),再自增(自己增加 1)。也就是,++a 输出的是 a+1 的值,a++输出的是 a 值。用一句口诀就是:“符号在前就先加/减,符号在后就后加/减”。

2.5 移位运算符

2.6 continue、break和return的区别?

        在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词:

continue指跳出当前的这一次循环,继续下一次循环。

break:指跳出整个循环体,继续执行循环下面的语句。

return 用于跳出所在方法,结束该方法的运行。return 一般有两种用法:

  • return:直接使用 return 结束方法执行,用于没有返回值函数的方法
  • return value:return 一个特定值,用于有返回值函数的方法

3 基本数据类型

3.1 Java数据类型分类

        Java数据类型可分为基础数据类型和引用性数据类型(注:String属于引用性数据类型):

注:1、Java 里使用long类型的数据一定要在数值后面加上 L,否则将作为整型解析。

       2、char a = 'h' char :单引号,String str = ''hello'' :双引号。

        这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean。

3.2 基本类型与包装类型的区别?

3.3 包装类型的缓存机制

3.4 自动装箱、拆箱以及其底层原理(底层代码)

3.5 为什么涉及到浮点数计算要使用BigDecimal

4 变量

4.1 成员变量与局部变量的区别

4.2 静态变量有什么作用

4.3 字符型常量与字符串型常量的区别

5 方法

5.1 方法分为哪几种类型,什么是方法的返回值?

5.2 静态方法为什么不能调用非静态成员?

5.3 静态方法与实例方法有什么不同

5.4 可变长参数

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值