Java面试题

时间:2019-04-19
本文章向大家介绍Java面试题,主要包括Java面试题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1. JDK和JRE有什么区别?

JDK:Java Development Kit 的简称,Java 开发工具包,提供了 Java 的开发环境和运行环境。
JRE:Java Runtime Environment 的简称,Java 运行环境,为 Java 的运行提供了所需环境。

具体来说:

JDK 其实包含了 JRE,同时还包含了编译 Java 源码的编译器 Javac,还包含了很多 Java 程序调试和分析的工具。

简单来说:

如果你需要运行 Java 程序,只需安装 JRE 就可以了,如果你需要编写 Java 程序,需要安装 JDK

2. 开发Java程序的步骤

  1. 编写Java源程序(后缀名.java)

  2. 编译,用javac命令编译Java程序(javac 源文件.java),生成字节码文件; 后缀名.class

  3. 编译完成会得到 .class 文件(文件名相同)

  4. 用java命令运行Java程序(java 类名),java 命令的类名,不要跟后缀名

3. 变量是什么?变量的三要素是什么?

变量:变量是存储信息(数据)的容器。

语法: [ 修饰符 ] 数据类型 变量名字 [赋值操作]

变量的三要素:

   1.数据类型

: 决定在内存中分配的空间

   2.变量名   : 空间别名

   3.值    :空间中存储的数据

4. 变量的命名规范

   1、变量名小写开头,第二个单词的首字母大写,如:xxxYyyZzz;

   2、由字母, 下划线, 数字, $符号组成

   3、数字不能开头

   4、不能为Java中的关键字或保留字

5. java 数据类型和默认值

   —— 基本数据类型;整型,浮点型,布尔型,字符型

   —— 引用数据类型,类类型,枚举,接口,数组

基本数据类型及其默认值:

整型:

byte : 0 short : 0 int: 0 long:0L

浮点型:

float:0.0F double:0.0D

布尔型:

boolean : false; 只有true和false两个取值。

字符型:

char : ‘\u0000’;

6. 基本数据类型转换的规则

当进行数学运算时,数据类型会自动发生提升到运算符左右之较大者(最少会提升到int型)

由小转大:自动类型提升,直接赋值即可;

由大转小:需强制转换;

7. ==与.equals()有什么不同

==是比较对象内存地址的值, equals是方法;

字符串的内容相同,引用地址不一定相同,用equals方法可以判断两个字符的值是否相等

8. 单| & 与 双|| && (短路)区别?

单| &:两边的表达式 无论结果如何,都会进行运算

双|| &&:当运算符的左边已经可以判断结果时,运算符的右边的表达式不会执行

|| 有真为真:左边true ,右边的表达式不会执行

&& 有假为假:左边false,右边的表达式不会执行

9. if…else…和写两个if 有什么区别

两个if为两次选择判断.两条语句,都会执行

if…else为一次判断,

if为选择条件1,else为除去选择条件1之外的其他情况.,一条语句只会执行一次

10. 列举出switch( )括号中能接受的所有数据类型

java5之前:
byte 、short、char、int

java5以上支持: enum枚举 java7以上支持: String 类型

11. break、continue和return的区别?

循环结构的控制:

break 语句可以立即退出循环,阻止再次反复执行循环代码。

continue 语句只是退出当前循环,根据控制表达式还允许继续进行下一次循环。

return 退出当前方法,终止当前方法的执行。

12. 什么是数组,它有什么特征?

概念: 数组是连续存储相同数据类型元素的集合

特点:

  1. 数据类型相同

  2. 数据是有顺序的

  3. 通过数组的下标访问数据

13. 数组的创建与使用方式

定义数组

声明 int[ ] arr;
初始化
new int[长度];
new int[]{元素1,元素2,…};
int[] arr = { 元素1,元素2,…};

数组的访问

     长度 arr.length  数组的长度固定

     索引 arr[索引],索引从0,最大到length-1

     遍历 通过循环遍历;foreach

 for( 数据类型 :  要遍历的数组){

 }

14. 方法的定义和使用

语法:

[修饰符] 返回的数据类型 方法名 ( 参数1,参数2,… ){

方法体 // 方法中执行的代码

[return 返回的数据] //当方法有返回值不可以省略

}

修饰符:public private protected
static …

返回的数据类型:
方法的返回的数据的类型,可以是基本数据类型和引用数据类型

如果方法没有返回值 void

return 返回的数据

方法名:我们给方法取的名称

命名规范:

1、首字母小写,第二个单词的首字母大写

2、字母 $ _ 数字不可以开头

3、不可以使用关键字和保留字

参数: 数据类型 变量名

方法体:调用方法时,会要执行的代码

          如果该方法拥有返回值,一定要提供 return 返回数据值。

15. Arrays工具类API有哪些常用方法?

sort(arr) 排序

binarySearch
(arr, key) 查找

copyOf ( arr,
length) 复制

fill ( arr,
value) 自动填充,一次性添加多个相同数据

toString(
arr) 把数组转换为字符串

equalse (arr1,
arr2) 判断两个数组是否相同

16. 什么是面向对象?

面向对象是一种编程思想,是一种思维方式:

通过创造和寻找对象的方式,由对象处理所遇到的问题,同时处理和维护好多个对象之间关系的过程。

17. 什么是对象?什么是类?类与对象的关系?

对象:

现实世界中,可以明确标识的一个具体的实体。

类:

类是对一批拥有相同属性和方法的对象的模板,是现实世界中的实体在计算机中的反映。

类与对象的关系:(Java 程序世界,先定义类,在创建对象)

类是对象的抽象描述,而对象是类的具体实例。

Java 中的类 --> 定义的Class

Java 中的对象 --> 通过new 创建的类的实例

18. 如何定义一个类

定义类:定义类其实是在定义类中的属性和方法


属性:对应类中的变量。


行为:对应类中的方法。

[<修饰符>] class
<类名>{

[<属性声明>]

[<构造器声明>]

[<方法声明>]

}

定义属性

属性声明的一般格式:

   [<修饰符>]  <类型>  <名称>;

定义方法

方法的基本语法:

[<修饰符>] <返回类型>
<名称>([<参数列表>]){

   [<执行语句>]

}

19. 什么是构造方法

构造方法就是类构造对象时调用的方法,主要用来实例化对象。

构造方法是特殊的方法

语法:

【修饰符】 类名(参数){

属性初始化操作;

注:

1、构造方法必须和类名相同

2、构造方法没有返回值(包括void也没有)

3、构造方法的调用,是在创建对象时,通过new关键字

20. 什么是封装?

封装:

隐藏属性,提供公开方法访问属性。

作用: 属性信息进行隐藏,保护信息。

封装的步骤:

实现封装的步骤:

1、修改属性的可见性,限制访问。通常设置为private。

2、提供访问器方法(getter、setter)对属性进行访问。

3、在访问器中添加控制语句,对属性读写的进行限制。

21. JAVA中访问修饰符有哪些?

访问修饰符:

           public 公共的(所有的类都可以访问)

           protected 受保护的

(同一个包,和外包的子类可以访问)

           default/package 默认不写

包内的(在同一个包内的类可以访问)

           private 私有的

(只在类的内部可以访问)

22. this、super的用法与区别?

this关键字代表当前类对象。

this用途:

普通的直接引用,作为方法的参数,返回值

解决局部变量和成员变量的二义性

  1. 在本类之间,构造方法之间的相互调用

super用途:

super表示超(父)类对象,this表示对象本身

super可用于访问父类的方法和属性,使用形式为super.方法(属性)

  1.   在类的继承中,子类的构造方法中默认会有super()语句存在(默认隐藏)
    
  2.   调用父类构造方法时,必须位于第一行(和this不能同时存在于构造方法中)
    

23. 重写(override)与重载(overload)的区别

1、方法重载是同一个类中的行为;方法重写是在子类和父类中的行为

2、方法重载要求不同同名方法的参数有所变化(无论是数量还是类型);而方法重写要求同名方法的参数等必须相同

3、重写是对功能的拓展;重载是对功能的重新实现

24. 抽象类必须要有抽象方法吗,和普通类有哪些区别?

不需要,抽象类不一定非要有抽象方法。

l 普通类不能包含抽象方法,抽象类可以包含抽象方法。

l 抽象类不能直接实例化,普通类可以直接实例化。

25. 抽象类能使用 final 修饰吗?

不能,定义抽象类就是让其他类继承的,如果定义为 final 该类就不能被继承,这样彼此就会产生矛盾,所以 final 不能修饰抽象类,编辑器也会提示错误信息。

26. 接口和抽象类有什么区别?

l 实现:抽象类的子类使用 extends 来继承;接口必须使用 implements 来实现接口。

l 构造函数:抽象类可以有构造函数;接口不能有。

l 实现数量:类可以实现很多个接口;但是只能继承一个抽象类。

l 访问修饰符:接口中的方法默认使用 public 修饰;抽象类中的方法可以是任意访问修饰符。

27. Java 容器都有哪些?

Java 容器分为 Collection 和 Map 两大类,其下又有很多子类,如下所示:

1). Collection

         List
         ArrayList
                   LinkedList
                   Vector

2). Set
HashSet
LinkedHashSet
TreeSet

3). Map
HashMap
LinkedHashMap
TreeMap
ConcurrentHashMap
Hashtable

28. List、Set、Map 之间的区别是什么?

List、Set、Map 的区别主要体现在两个方面:元素是否有序、是否允许元素重复。

三者之间的区别,如下表:

. 说一下 HashMap 的实现原理?

HashMap 基于 Hash 算法实现的,我们通过
put(key,value)存储,get(key)来获取。当传入 key 时,HashMap 会根据 key. hashCode() 计算出 hash 值,根据 hash 值将 value 保存在 bucket 里。当计算出的 hash 值相同时,我们称之为 hash 冲突,HashMap 的做法是用链表和红黑树存储相同 hash 值的 value。当 hash 冲突的个数比较少时,使用链表否则使用红黑树。

30. ArrayList 和 LinkedList 的区别是什么?

·
数据结构实现:

ArrayList 是动态数组的数据结构实现,而 LinkedList 是双向链表的数据结构实现。

·
随机访问效率:

ArrayList 比 LinkedList 在随机访问的时候效率要高,

因为
LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。

·
增加和删除效率:

在非首尾的增加和删除操作,LinkedList 要比 ArrayList 效率要高,

因为 ArrayList 增删操作要影响数组内的其他数据的下标。

·
综合来说:

在需要频繁读取集合中的元素时,更推荐使用 ArrayList,

而在插入和删除操作较多时,更推荐使用 LinkedList。