软件测试面试题--Java基础常见面试题

本文介绍了Java编程中的关键概念,包括面向对象的封装、继承和多态,基本数据类型,String与相关类的区别,重载与重写、继承与多态、抽象类与接口,内存模型、垃圾回收机制,以及数组、链表、类加载、内存溢出、final与finally等概念。
摘要由CSDN通过智能技术生成

1、面向对象的三大特征:封装、继承和多态

封装是把对象的属性和实现细节隐藏起来,仅对外提供公共的访问方法
继承的作用是避免重复代码,提高代码复用性。有一个父类动物类,它有公共的的属性和方法name和eat();然后它有一个子类狗,它继承了动物类,所以子类狗不需要重新定义name和eat()方法,而是直接可以使用这些属性和方法
多态是指同一个父类,不同的子类可以有不同的状态。举例,一个动物类和它的子类猫和狗。每种动物都会发出不同的声音,但我们可以使用相同的方法调用来让它们发出声音

2、Java中基本数据类型有哪些?

byte:1个字节
short:2个字节
int:4个字节
long:8个字节
float:4个字节(单精度)
double:8个字节(双精度)
boolean:表示布尔值,只有两个取值:true和false ,4个字节
char:2个字节,用于表示单个字符

3、String和StringBuffer、StringBuider的区别

String 声明的是不可变的对象,每次操作都会生成新的 String 对象,然后会指向新的 String 对象.
StringBuffer、StringBuilder 可以在原有对象的基础上进行操作
StringBuffer 和 StringBuilder 最大的区别在于,StringBuffer 是线程安全的,而 StringBuilder 是非线程安全的,但 StringBuilder 的性能高于 StringBuffer

4、重载和重写的区别

重载: 在同一个类中,允许存在一个以上的同名方法,只要它们的参数个数或者参数
类型不同。举例:例如制作意大利面:一种是用肉酱做,另一种是用奶油酱做。它们都叫做“意大利面”,但是它们的配料不同,也就是参数不同。
**重写:**当子类需要改变父类的方法实现时,可以在子类中重新定义这个方法。比如父亲是一位动物管理员,他教我如何喂养一只狮子。我学会他的方法后,我在喂狮子时改变了喂食的方式,虽然我们都在喂食同一只狮子,但是我的方法和父亲的方法可能会有一些细微的不同。

5、继承与多态的区别

继承:子类继承父类,子类可以拥有父类的成员变量和成员方法
1.多态就是同一操作作用于不同的对象,可以有不同的解释,产生出不同的执行结果,就叫做多态. 就是用基类的引用指向子类的对象
2.可以利用区动物园买到学生票和成人票的不同来理解多态的实现/作用

6、抽象类与接口的区别

  1. 声明方法:抽象类使用 abstract 关键字进行声明,使用 class 关键字定义类。接口使用 interface 关键字进行声明。
  2. 继承关系:抽象类通过使用 extends 关键字继承其他类或者抽象类。一个类只能继承一个抽象类。接口通过使用 implements 关键字实现一个或多个接口。一个类可以实现多个接口。
  3. 方法实现:抽象类可以包含实现的方法和抽象的方法。接口只能包含抽象的方法,不包含具体的方法实现。所有的方法都隐式地被声明为抽象方法,不需要使用 abstract 关键字。实现接口的类必须提供方法的具体实现。

7、Java内存模型

JVM的内存结构主要包括堆、栈、方法区等部分。
堆内存:用于存储对象实例,是所有线程共享的内存区域。
栈内存:每个线程在创建时都会创建一个虚拟机栈,用于存储方法调用的状态信息,包括局部变量表、操作数栈、动态链接、方法出口等。

8、Java的垃圾回收机制

垃圾回收机制,它的主要任务就是找出那些不再被程序使用的对象,然后自动释放它们所占用的内存空间,可以让内存可以被重新利用。它会定期扫描你的程序,找出不再被引用的对象,并将它们标记为"垃圾"。然后,在适当的时候,这些垃圾对象所占用的内存就会被释放掉。

9、== 和 equals的区别

【==】如果比较的是基本数据类型, 比较的是变量的值
如果比较的是引用数据类型, 比较的是地址值 (两个对象是否指向同一块内存)
【equals】如果没重写 equals 方法,比较的是两个对象的地址值
如果重写了 equals 方法,比较的是对象中的属性的内容

10、数组和链表的区别

  1. 数组的存储空间是连续,链表是动态内存分布
  2. 数组大小固定,不能拓展;链表大小不固定,可以拓展
  3. 数组查询方便,插入删除不方便;数组查询不方便,插入删除方便

11、类加载机制,对象实例化的过程

类加载机制:虚拟机把类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型的过程。

12、内存溢出的场景

1、内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2、集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3、代码中存在死循环或循环产生过多重复的对象实体;
4、使用的第三方软件中的BUG;
5、启动参数内存值设定的过小;

13、static介绍一下,代码块执行顺序

static是一个关键字,用于定义与类而不是实例相关联的成员。通过引入静态元素,能够在不创建类的实例的情况下访问类级别的变量和方法,提高代码的可重用性和性能。

执行顺序是:父类的静态代码块,子类的静态代码块 父类的构造方法,子类的构造方法

14、final, finally, finalize 的区别是什么?

final用于声明属性,方法和类,表示属性不可变,方法不可以被覆盖,类不可以被继承。
finally是异常处理语句结构中,表示总是执行的部分。
finallize表示是object类一个方法,在垃圾回收机制中执行的时候会被调用被回收对象的方法。允许回收此前未回收的内存垃圾。所有object都继承了

15、List和Set的区别?

  1. List是有序集合,可以按照元素的添加顺序或者索引进行访问和操作,允许元素重复。而set是无序的集合,不允许元素重复。
  2. List可以添加重复元素,因为它是按照添加顺序存储的。而Set会自动去除重复元素 List提供了索引方法,而set集合没有索引的方法
  3. List通常用于存储有序的数据,如:列表、队列等。而set通常用于存储唯一的数据,如哈希表等

16、arraylist和hashmap的区别

  1. 底层数据结构不同:ArrayList底层是基于数组实现的,而HashMap底层是基于哈希表实现的。
  2. 用途不同:ArrayList主要用于存储一组有序的对象,可以根据下标进行快速访问;而HashMap主要用于存储键值对,可以根据键快速查找对应的值。
  3. 添加元素的过程不同:ArrayList添加元素时,如果数组已满,需要进行扩容操作,将原数组复制到一个新的更大的数组中;而HashMap添加元素时,需要先计算键的哈希值,然后根据哈希值找到对应的桶,如果桶中已经有元素,则需要进行链表或红黑树的操作。
  4. 线程安全性不同:ArrayList不是线程安全的,如果多个线程同时对同一个ArrayList进行修改,可能会导致数据不一致的问题;而HashMap也不是线程安全的,但可以通过使用ConcurrentHashMap等线程安全的Map来保证线程安全。
  • 14
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值