【JavaSE面试题】1.Java基础篇

1.什么是java?

Java是一门摒弃了C++的多继承,指针等概念,面向对象的编程语言。

2.Java语言有哪些特点?

1.平台无关性:由于Java文件编译生成.class文件,在JVM虚拟机中执行,所以只要安装了JVM虚拟机的平台都可以使用Java,实现了“一次实现,多处运行”
2.面向对象:Java具有封装,继承,多态等特点。
3.支持多线程:相比于C++要调用操作系统的多线程,Java本身就具有多线程
4.编译与解释并行:在其他语言中,有编译型语言,解释型语言,但是在Java中编译与解释并行,使用javac将java文件编译成.class文件给虚拟机,虚拟机再通过内部机制将.class文件解释成对应的字节码文件。

3.JVM,JDK,JRE有什么区别?

JVM(JAVA Virtual machine):Java虚拟机,针对不同系统,实现不同的Java虚拟机,因此Java实现跨平台性
JRE:JRE是Java的运行环境,包含JVM虚拟机,并还包括了Java的一些常用的类库,Java命令,和一些其他的构件。
JDK(Java development Kit):它是功能⻬全的 Java SDK。它拥有 JRE 所拥有的⼀切,还有编译器(javac)和⼯具(如 javadoc 和 jdb)。它能够创建和编译程序。

4.Java有哪些数据类型?

1.基本数据类型:数值型(byte,short,int,long)、浮点型(float,double)、字符型(char)、布尔型(boolean)
2.引用数据类型:类(class),接口(interface),数组([])

5.自动类型转换,强制类型转换?

Java所有的数值型变量可以互相转换,将一个范围较小的变量或数值直接赋给范围较大的变量,可以自动转换;反之则需要强制转换。
在这里插入图片描述

6.什么是自动拆箱,自动装箱?

装箱:将基本数据类型用其对应的引用类型包装起来
拆箱:将包装类型转换为基本数据类型

Java中可以实现自动拆箱和装箱

7.&和&&有什么区别?

&&:短路与运算,如果前者不满足,则不会再判断后者
&:逻辑与,前后都会进行比较
tips:|和||或运算也是同理

8.switch的作用范围?

Java5以前只能是byte、short、char、int
从Java5开始,引入了枚举类型(Enum)
Java7开始,引入了String类型
但不能作用于Long类型

9.break,continue,return的区别?

break直接跳出循环,continue跳过当次循环执行下一次循环,return程序返回,不再执行下面的代码

10.最有效的方法2乘以8?

位运算2<<3,得到2的3次方

11.面向对象和面向过程的区别?

面向过程:分析出解决问题所需要的步骤,用函数一步一步将其实现
面向对象:把构成问题的事务分解成各个对象,而建立对象的目的也不是为了完成一个个步骤,而是为了描述某个事件在解决整个问题的过程所发生的行为。 目的是为了写出通用的代码,加强代码的重用,屏蔽差异性。

12.重载(@overload)和重写(@Override)的区别?

重载 :在同一个类中,同一个方法名,参数类型不同,个数不同叫做重载
重写:在父类与子类中,子类继承父类的方法并将相同名称的方法重写,被重写方法与父类被重写方法有相同的返回类型,比父类被重写方法更好访问,不能比父类被重写方法声明更多的异常(里氏代换原则)

13.访问修饰符 public、private、protected、以及不写(默认)时的区别?

default: 在同一包内可见,不使用任何修饰符。可以修饰在类、接口、变量、方法。
private : 在同一类内可见。可以修饰变量、方法。注意:不能修饰类(外部类)
public : 对所有类可见。可以修饰类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。可以修饰变量、方法。注意:不能修饰类(外部类)。

14.抽象类(abstract class)和接口(interface)有什么区别?

1.接口的方法一般为public,所有方法均不能被实现;抽象类可以有非抽象方法
2.接口中除了static和final,不能有其他变量;抽象类中不一定
3.一个类可以实现多个接口,但只能实现一个抽象类。接口本身可以通过extends关键字扩展多个接口
4.接口方法默认是public,抽象方法可以是public,protected,default

15.final 关键字有什么作用?

1.被final修饰的不可以被继承
2.被final修饰的变量不可以被更改
3.被final修饰的方法不可以被重写

16.==和 equals 的区别?

1.==:比较基本数据类型是比较“”,引用数据类型比较地址
2.equals():没有被重写以前和“==”相等,被重写后由自定义的对象的值决定是否相等

17.hashCode 与 equals? 为什么重写 quals 时必须重写 hashCode ⽅法?为什么两个对象有相同的 hashcode 值,它们也不⼀定是相等的?

hashcode:作用是获取哈希码,也称为散列码,通常将对象的内存地址转换成整数返回
如果两个对象相等,则 hashcode ⼀定也是相同的。两个对象相等,对两个对象分别调⽤ equals ⽅法都返回 true。反之,两个对象有相同的 hashcode 值,它们也不⼀定是相等的 。因此,equals ⽅法被覆盖过,则 hashCode ⽅法也必须被覆盖。

因为可能会碰撞, hashCode() 所使⽤的散列算法也许刚好会让多个对象传回相同的散列值。越糟糕的散列算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode )。

18.什么是深拷贝和浅拷贝?

浅拷贝:拷贝对象的成员变量的值,也就是基本数据类型的值,和引用数据类型变量的地址值,而对于引用类型变量指向的堆中的对象不会拷贝。
深拷贝:完全拷贝一个对象,拷贝被拷贝对象的成员变量的值,堆中的对象也会拷贝一份。

19.Java创建对象有几种方式?

1.new创建对象
2.通过反射机制
3.采用clone机制克隆对象
4.通过序列化方式

20.Object类的常用方法?

在这里插入图片描述

21.Java 中异常处理体系?

在这里插入图片描述

22.什么是BIO、NIO、AIO?

BIO:同步阻塞IO,一个连接一个线程,发起请求,一直阻塞
NIO同步非阻塞IO,一个请求一个线程,多个连接多路复用一个线程(有Buffer缓冲区和channel)
AIO:异步非阻塞IO,一个有效请求一个线程

23.什么是序列化?什么是反序列化?

序列化:把java对象转为二进制字节流,方便存储和传输
反序列化:把二进制流恢复成对象
对于不想进行序列化的变量,使用transient关键字修饰。

24.说说有几种序列化方式?

1.java对象序列化:Java 原生序列化方法即通过 Java 原生流(InputStream 和 OutputStream 之间的转化)的方式进行转化,一般是对象输出流 ObjectOutputStream和对象输入流ObjectInputStream。
2.json序列化:Json 序列化的选择很多,一般会使用 jackson 包,通过 ObjectMapper 类来进行一些操作,比如将对象转化为 byte 数组或者将 json 串转化为对象
3.protoBuff序列化:是一种轻便高效的结构化数据存储格式,ProtoBuff 序列化对象可以很大程度上将其压缩,可以大大减少数据传输大小,提高系统性能。

25.Java 泛型了解么?什么是类型擦除?介绍一下常用的通配符?

泛型是jdk1.5中引入的新特性,提供了编译时类型安全监测机制,允许检测到非法的类型
泛型有三种使用方式:
1.泛型类 2.泛型接口,3.泛型方法

常用的通配符T、E、K、V、?
?:表示不确定的java类型
T(type):表示一个具体的java类型
K、V:key和value
E:代表Elemnt

java的泛型是伪泛型,在java编译期间,所有类型信息都会被擦掉,在运行时没有泛型
之所以要将其擦除,是为了向下兼容,因为JDK5以下不支持

26.说一下你对注解的理解?

注解本质上是一个标记,可以标记在类,方法,属性上。标记本身也可以设置一些值

注解生命周期有三大类:

  • RetentionPolicy.SOURCE:给编译器用的,不会写入 class 文件
  • RetentionPolicy.CLASS:会写入 class 文件,在类加载阶段丢弃,也就是运行的时候就没这个信息了
  • RetentionPolicy.RUNTIME:会写入 class 文件,永久保存,可以通过反射获取注解信息

27.什么是反射?应用?原理?

我们通常都是利用new方式来创建对象实例,这可以说就是一种“正射”,这种方式在编译时候就确定了类型信息。

而如果,我们想在时候动态地获取类信息、创建类实例、调用类方法这时候就要用到反射。

通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。

反射最核心的四个类:

  • class类:正在运行中的所有类的都是该类的实例对象,每个class类都包含本类的信息(基类)
  • Field类:…对象
  • Constructor类:…构造器
  • Method类:…方法
    我们使用 Spring 的时候 ,一个@Component注解就声明了一个类为 Spring Bean,都是基于反射操作类

28.反射的原理?

我们都知道 Java 程序的执行分为编译和运行两步,编译之后会生成字节码(.class)文件,JVM 进行类加载的时候,会加载字节码文件,将类型相关的所有信息加载进方法区,反射就是去获取这些信息,然后进行各种操作。

29.java8新特性?

  • 接口默认方法:Java 8 允许我们给接口添加一个非抽象的方法实现,只需要使用 default 关键字修饰即可
  • Lambda表达式和函数式接口:Lambda 表达式本质上是一段匿名内部类,也可以是一段可以传递的代码。Lambda 允许把函数作为一个方法的参数(函数作为参数传递到方法中),使用 Lambda 表达式使代码更加简洁,但是也不要滥用,否则会有可读性等问题,《Effective Java》作者 Josh Bloch 建议使用 Lambda 表达式最好不要超过 3 行。
  • Stream API:使用 Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。

简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

  • 日期时间 API:Java 8 引入了新的日期时间 API 改进了日期时间的管理。
  • **Optional 类:**用来解决空指针异常的问题

30.Stream流操作?

在这里插入图片描述


如果喜欢我的文章的话“一键三连”支持一下作者叭~,后续将不断更新,你的支持就是我持续更新的动力!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

漩涡编程,一鸣惊人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值