🌐 Java基础面试题

1、Java 的数据类型有哪些?

java的数据类型有:

  1. 基本数据类型:byte,short,int,long,float,double,char,boolean
  2. 空类型:void
  3. 引用数据类型:数据、类、枚举、注解等

2、变量的三要素是什么?变量使用有什么要求?

  • 变量的三要素:

数据类型、 变量名、变量值

  • 变量使用的要求:

    变量必须先声明再使用;

    变量必须初始化,其中成员变量有默认值;

    局部变量有作用域,同一个作用域中变量不能重复声明:

    给变量赋值时要求值的类型<=变量声明的类型;

3、基本数据类型变量和引用数据类型变量有什么区别?

基本数据类型的变量:存储数据值,数据类型不同,宽度不同

引用数据类型的变量:存储地址值

4、Java 的运算符+有几种意

(1)作为一元运算符:表示正号

(2)当+左右两边有字符串出现时表示拼接

(3)其他情况表示求和

5、自减运算符在自增变量前后有什么区别?

首先,

自增运算符++,表示自增变量自增 1

自减运算符--,表示自增变量自减 1。

其次,以自增为例

(1)如果自增表达式直接加;构成语句,自增运算符在自增变量前后没有区别

a++; 和 ++a; 没区别

(2)如果自增表达式 和其他运算符一起运算,或者自增表达式作为实参使用时,则

有区别。

自增运算符在前:表示先自增,再取自增变量的值运算,

自增运算符在后:表示先取自增变量的值,然后自增变量再自增 1,计算用的是

自增之前取的值。

6、Java 的与运算符& 和 && 的区别?

&:

逻辑与,按位与,不会发生短路现象

&&:

逻辑与,会发生短路现象,也称为短路与。

当&&左边是 false,右边就不看了。

7、Java 的运算符| 和 || 的区别?

|

逻辑或,按位或,不会发生短路现象

||

逻辑或,会发生短路现象,也称为短路或。

当||左边是 true,右边就不看了。

8、Java 的运算符<<,>>,>>>的区别?

<<

称为左移,左移几位相当于乘以 2 的 n 次方。

可能发生正变负,负变正的情况。

》》

称为右移,右移几位相当于除以 2 的 n 次方。

不会发生正变负,负变正的情况。

》》》

无符号右移

正数的右移,和>>一样。

负数的右移,直接变正数。

9、Java 的分支结构 if.else 和 switch...case 有什么区别?

(1)if...else 适用于任何条件的判断,

switch...case 只适用于 byte,short,char,int,string,枚举类型的常量判断。

即能够使用 switch...case 的都可以使用 if...else,反过来不可以。

(2)if.else 不会发生分支贯穿/穿透的现象,case 可能发生分支贯穿/穿透的现象。

10、的循环有几种情况?

Java 的循环有3种形式:for,while,do...while

11、Java 的普通 for 循环和增强 for 循环的区别?

普通 for 循环:

任何需要重复执行某些代码的场景都可以使用它。增强 for 循环:

只能用于遍历数组,或实现了 java.lang.Iterable 接口的集合。

增强 for 循环遍历数组时,本质上底层是用普通 for 循环。

增强 for 循环遍历集合时,本质上底层是用 Iterator 迭代器遍历。

12、关键字 break、continue、return 的区别?

break:

用于 switch 或循环,表示提前结束当前 switch 或循环。

continue:

用于循环,表示提前结束本次循环体的执行。

return:

用于方法体中,结束当前方法体的执行。

return;表示直接结束当前方法体的执行。

return 结果;表示结束当前方法的执行,并返回结果

13、类和对象的关系?

类是创建对象的模板。

对象是类的实例。

14、类的成员有哪些?

成员变量

成员方法

构造器

代码块

成员内部类

15、静态变量、实例变量、局部变量的区别?

  1. 局部变量:

声明在方法、构造器、代码块里面,没有默认值,必须手动初始

化,在栈中分配内存,有严格的作用域,只能加 final 修饰。

  1. 实例变量:

声明在类中,其他成员外面,有默认值,也可以在声明后面手动

初始化,或者使用非静态代码块和构造器初始化,在堆中分配内

存,每一个对象的实例变量都是独立的,可以加 public,

protected,private,transient,final 等修饰符。

  1. 静态变量:

声明在类中,其他成员外面,必须有 static 修饰,有默认值,也

可以在声明后面手动初始化,或者使用静态代码块初始化,在方

法区中分配内存,每一个类的静态变量是所有对象共享的,可以

加 public,protected,private,transient,final 等其他修饰符。

16、构造器的特点?

构造器的名字必须和类名相同

构造器没有返回值类型

构造器的首行必须是 this() 或 this(输出列表)或 super()或 super(实参列 表),如果这 4 句都没写,默认是 super()

构造器不会被继承,但是子类构造器一定会调用父类的构造器

如果一个类没有编写任何构造器,那么编译器将会给这个类自动添加默 认的无参构造器

构造器只能加权限修饰符 public,protected,缺省,private

枚举类和单例类的构造器一定是私有化的

构造器的调用必须用 new 关键字

17、方法重载和重写的区别?

重载:同一个类中,或者父子类之间的方法,名称相同,参数列表不同,跟返回值访问权限无关

重写:子类重写父类方法,名称相同,参数列表相同,返回值相同或者是其子类,访问权限不能让严于父类,实例方法不能重写为静态方法,静态方法可以被继承,但是不能被重写,不能声明、抛出比父类更多的异常

18、可变参数是什么意思?

可变参数:

参数类型后面出现...形式,就称为可变参数。

在声明可变参数的方法中,可变参数就是数组。

在调用时,可变参数可以传入对应类型的数组,或者传入 0~n 个对应类型的元素。

19、什么是递归?

方法出现自己调用自己就是递归。

20、静态代码块和非静态代码块的区别?

静态代码块:

有 static 修饰的代码块。是给静态变量初始化的。在类初始化时执行,一个类

的静态代码块只会执行一次。

非静态代码块:

没有 static 修饰的代码块。是给实例变量初始化的。在实例初始化时执行,每

次 new 对象时,都会执行。

21、静态方法和非静态方法有什么区别?

静态方法:

  • 在本类中的任意成员中都可以被调用。

  • 父类的静态方法可以被子类继承,但不能被重写。

  • 父接口的静态方法不会被实现类继承,也不能被重写。

非静态方法:

  • 只能在本类的非静态成员中被调用。

  • 非 final 修饰的非静态方法,只要子类、实现类可见,就可以选择重写。

22、抽象方法和非抽象方法的区别?

抽象方法:

有 abstract 修饰,没有方法体,不能由 private,static,final,native 修饰。

在子类或实现类中需要重写。

抽象方法只能出现在抽象类或接口中。

非抽象方法:

没有 abstract 修饰,有方法体

23、关键字 class、interface、enum 的区别

class: 声明类

interface: 声明接口

@interface: 声明注解(这个可选)

enum: 声明枚举类

24、继承的关键字是什么?

extends

25、实现接口的关键字是什么?

implements

27、包的作用是什么

(1)避免类的重名

(2)限制某些类或成员的可见性范围

(3)组织管理不同主题的类

28、package 和 import 的区别

package: 声明包

必须在.java 文件的首行

import: 导包

在 package 语句和类定义之间

29、this 和 super 的意思

this:当前对象

super:引用父类/父接口中声明的成员

31、如何理解面向对象的 3 个基本特征

封装:

为了体现高内聚、低耦合的开发原则。

为了安全、隐藏类的内部实现细节、提高代码的复用性。

继承:

为了提高代码复用性、便于代码扩展。

为了表示 is-a 的事物关系。

多态:

为了代码编写更灵活,可以实现虚方法的动态绑定。

32、如何理解多态性?

对象的多态性

(1)一个类可以引用本类对象,也可以引用各种子类对象

(2)一个对象可以让编译器按照本类处理,也可以按照父类或父接口类型,但是运行

时类型不变

35、使用接口有什么好处?

(1)避免单继承

(2)表示 has-a 的关系

37、包装类有什么作用?

当必须使用对象时,基本数据类型就会自动装箱为包装类对象。

当对包装类进行计算时,可以自动拆箱为基本数据类型

38、int,Integer,BigInteger 的区别?

int:基本数据类型

Integer:包装类

BigInteger:任意大小的整数

39、final、finally、finalize 的区别

final:修饰符

final 修饰类,表示不能被继承

final 修饰方法,表示不能被重写

final 修饰变量,表示不能修改值

finally:

和 try...catch 结构一起使用,

表示无论是否有异常,是否可以捕获异常,是否有 return 语句,都要执行的 fin

ally 块。

finalize:

finalize 是 Object 类的一个方法,由 GC 调用,在对象被回收时调用,适用于

释放 JVM 之外的内存。

41、两种实现多线程的方式?

继承 Thread 类

或实现 Runnable 接口

42、String、StringBuffer、StringBuilder 的区别

String:

字符串对象不可变,字符串常量可以共享。

StringBuffer 和 StringBuilder:可变字符序列。

StringBuffer:线程安全

StringBuilder:线程不安全

43、ArrayList 和 Vector 的区别

ArrayList:

线程不安全的动态数组,数组初始化长度为 0,默认扩容为 1.5 倍。

Vector:

线程安全的动态数组,数组初始化长度为 10,默认扩容为 2 倍。

44、ArrayList、Vector 和 LinkedList 的区别

ArrayList、Vector:动态数组

需要扩容。

非末尾位置增加、删除元素,需要移动元素。

ArrayList、Vector 实现 List 接口。

LinkedList:双向链表

不需要扩容和移动元素。

LinkedList 实现 List、Queue、Deque 接口。

45、Stack 和 LinkedList 的区别

Stack:是 Vector 的子类,是顺序栈,底层是数组。

LinkedList:是链式栈,底层是双向链表

46、List 和 Set 的区别

List:

元素有序:元素的存储和添加顺序一致。

元素可重复。

Set:

元素存储和添加顺序无关。

元素不可重复

47、Collection 和 Map 的区别

Collection: 存储一组对象

Map: 存储键值对

48、Hashtable 和 HashMap 的区别

Hashtable: 线程安全的,不允许 key 和 value 为 null

HashMap: 线程不安全的,允许 key 和 value 为 null

49、Hashtable 和 HashMap、TreeMap 的底层实现

Hashtable: 数组+链表

HashMap:

JDK1.8 之前:数组+链表

JDK1.8 及之后:数组+链表/红黑树

TreeMap: 红黑树

61、两个字符串比较用什么方法

eqauls 方法,如果要忽略大小写,用 equalsIgnoreCase 方法

62、TCP/UDP 协议有什么区别

TCP: 面向连接的可靠的基于字节流的传输控制协议

UDP: 非面向连接的不可靠的基于用户数据报的协议

63、线程安全问题是什么,如何解决

当多个线程使用共享数据时,就会有线程安全问题。

可以加同步 synchronized 解决。

同步代码块或同步方法。

同步代码块:手动选择同步锁对象。

同步方法:静态方法的同步锁对象是当前类的 Class 对象,非静态方法的同步锁对象

是 this 对象

64、IO 流的四个抽象基类是什么

InputStream:字节输入流

OutputStream:字节输出流

Reader:字符输出流

Writer:字符输出流

66、Class 类对象如何获取

类型名.class

对象.getClass

Class.forName(类型全名称)

类加载器对象.loadClass(类型全名称)

67、反射的作用

实现 Java 语言的动态性。

在运行时动态获取类信息,动态创建对象,动态操作属性,动态调用方法。

68、什么是函数式接口

只有一个抽象方法的接口,即 SAM 接口(Single Abstract Inteface)

69、什么是 Lambda 表达式?

Lambda 表达式是一种实现函数式接口的新语法

70、Comparable 和 Comparator 的区别

Comparable: 自然比较接口

Comparator: 定制比较接口

71、Iterable 和 Iterator 的区别

Iterable: 可迭代接口,实现它的集合就可以支持 foreach 循环遍历

Iterator: 迭代器接口

73、请解释 Java 异常处理机制相关的 5 个关键字

try: 尝试执行可能发生异常的代码。

catch: 尝试捕获 try 部分发生的异常。可以存在多个 catch,如果多个 catch 的异

常类型有继承关系,那么遵循子上父下。finally:不管是否发生异常都要执行的代码放在 finally 块中。

throws: 方法声明时显示抛出异常,指定该方法可能抛出的异常类型列表。

throw: 手动抛出异常,可以抛出系统预定异常,也可以抛出用户自定异常,而且用户

自定义异常必须用 throw 语句抛出,可以代替 return 语句结束方法运行

相关推荐
LuckyLay13 分钟前
Spring学习笔记_27——@EnableLoadTimeWeaving
java·spring boot·spring
向阳121826 分钟前
Dubbo负载均衡
java·运维·负载均衡·dubbo
Gu Gu Study36 分钟前
【用Java学习数据结构系列】泛型上界与通配符上界
java·开发语言
测试19981 小时前
2024软件测试面试热点问题
自动化测试·软件测试·python·测试工具·面试·职场和发展·压力测试
小码编匠1 小时前
一款 C# 编写的神经网络计算图框架
后端·神经网络·c#
WaaTong1 小时前
《重学Java设计模式》之 原型模式
java·设计模式·原型模式
m0_743048441 小时前
初识Java EE和Spring Boot
java·java-ee
AskHarries1 小时前
Java字节码增强库ByteBuddy
java·后端
佳佳_1 小时前
Spring Boot 应用启动时打印配置类信息
spring boot·后端
小灰灰__1 小时前
IDEA加载通义灵码插件及使用指南
java·ide·intellij-idea