java基础面试题(持续更新)

1.equals和==的区别?
  • == 是一个比较操作符

    • 对于基本类型,== 比较的是值

    • 对于引用类型,== 比较的是地址

  • equals不能用于基本类型的比较

  • 如果没有重写equals,equals 就相当于 ==

  • 如果重写了equals,equals比较的是对象的内容

2.String、StringBuffer和StringBuilder的区别?

1.可变性:

  • String是不可变的类,一旦被创建就不能修改。每次对String进行操作时,都会创建一个新的String对象

  • StringBuffer和StringBuilder是可变的类,可以动态修改字符串的内容

2.安全性:

  • String是线程安全的,因为它是不可变的。多个线程可以同时访问同一个String对象而无需担心数据的修改问题。

  • StringBuffer是线程安全的,它的方法使用了synchronized关键字进行同步,保证在多线程环境下的安全性。

  • StringBuilder是非线程安全的,不使用synchronized关键字,所以在多线程环境下使用时需要手动进行同步控制。

3.性能:

  • 由于String是不可变的,每次对String进行操作都会创建一个新的String对象,频繁的操作字符串会导致大量的对象创建和内存消耗。

  • StringBuffer是可变的,对字符串的修改是在原有对象上进行,不会创建新的对象,因此在频繁的字符串拼接场景下比String更高效。

  • StringBuilder与StringBuffer类似,但不保证线程安全性,因此在单线程环境下性能更高。

综上,如果在单线程环境下进行字符串操作,且不需要频繁修改字符串,推荐使用String;如果在多线程环境下进行字符串操作,或者需要频繁修改字符串,优先考虑使用StringBuffer;如果在单线程环境下进行频繁的字符串拼接和修改,推荐使用StringBuilder以获取更好的性能。

3.静态内部类和非静态内部类的含义和区别?
  • 静态内部类:在外部类中,静态内部类中的静态成员和静态方法,可以直接由类名.静态成员 || 类名.静态方法

  • 而静态内部类中的非静态成员和非静态方法,只能通过创建实例来调用非静态成员和非静态方法

  • 非静态内部类:非静态内部类里面不能使用static去修饰成员变量和成员方法,只能通过创建实例来调用其中的成员变量和成员方法

4.什么是值传递和引用传递?
  • 值传递:在函数调用时,将实际参数的值复制一份传递给形参。

    • 在值传递中,对形参的修改只作用于函数内部

  • 引用传递:在函数调用时,将实际参数的引用或地址传递给形参。

    • 在引用传递中,对形参的修改会直接作用于函数外部的变量

5.String类能被继承吗,为什么?
  • 在Java中,String类是被final关键字修饰的,即不可继承

  • final表示一个类不允许被其他类继承,也就是说String类不能被任何类继承

  • String类具有不可变性和安全性

6.java中基本数据类型有哪些?
  • 整数类型:

    • byte: 1个字节,在内存中范围为-128~~127

    • short: 2个字节 ,在内存中范围为-32768~~32767

    • int: 4个字节

    • long: 8个字节

  • 浮点数类型:

    • float: 4个字节

    • double: 8个字节

  • 字符类型:

    • char: 2个字节

  • 布尔类型:

    • boolean: 1个字节,在内存中只能表示true或false

7.重载和重写的区别?
  • 重载:

    • 重载发生在本类中,方法名必须相同,但参数个数,参数类型,参数顺序不同

    • 重载方法的返回类型可以相同,也可以不同

    • 重载是为让同一个方法名的方法对不同情况进行处理

  • 重写:

    • 重写是指在子类中,对父类的方法进行重写

    • 重写方法必须与被重写的方法拥有相同的方法名、返回值类型和参数列表

    • 构造方法不能被重写

    • 重写的访问权限不能比父类中被重写的方法的访问权限更低

    子类中的重写方法访问权限高

    父类中被重写方法访问权限低

    • 重写的作用是实现多态性,通过父类的对象调用子类的重写方法,对同一个方法名的不同实现

8.接口和抽象类有什么区别?
  • 接口 interface:

  • 接口不能被实例化,类可以实现多个接口

  • 接口的权限修饰符只能为public

  • 在接口中,包含抽象方法,普通方法,静态方法,不包含实例变量和构造器

  • java8之后:在接口中,静态方法必须有方法体,普通方法和抽象方法没有方法体,需要在实现类中被实现;

小知识(重点)

在接口的静态方法,需要通过接口名.静态方法实现

在接口的抽象方法和普通方法,通过创建实现类的实例对象,再通过实例对象调用方法

  • 抽象类 abstract:

  • 抽象类中的抽象方法一定要被实现

  • 抽象类包含构造器,普通方法,和抽象方法,不能包含静态方法

    • 在抽象类中,普通方法需要有方法体

    • 在抽象类中,抽象方法不需要方法体

  • 抽象类不能被实例化,抽象类只能单继承

    • 如果子类实现了所有的抽象方法,子类可以不是抽象类

    • 如果子类没有实现所有的抽象方法,子类仍然是抽象类

9. 怎样理解oop面向对象?

OOP 面向对象编程:Object Oriented Programming

三个特性:

  1. 继承:从已有的类继承信息并创建新类

  2. 封装:把数据和操作数据的方法绑定起来,对数据的访问只能通过已定义的接口

  3. 多态:不同类的对象在调用同一个方法时,表现出多种不同行为

10. 深拷贝和浅拷贝的理解?

都是指对对象的拷贝

一个对象存在两种类型的属性:

  • 基本数据类型

  • 实例对象的引用

  • 浅拷贝:

    • 只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会复制一份引用地址所指向的对象

    • 浅拷贝出来的对象,内部的类属性指向的是同一个对象

  • 深拷贝:

    • 即会拷贝基本数据类型的值,也会对实例对象的引用地址所指向的对象进行复制

    • 深拷贝出来的对象,内部的类执行指向的不是同一个对象

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

执至心之所念

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

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

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

打赏作者

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

抵扣说明:

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

余额充值