您现在的位置是:首页 >其他 >热乎的面经——不屈不挠网站首页其他
热乎的面经——不屈不挠
⭐️前言⭐️
?欢迎点赞 ? 收藏 ⭐留言评论 ?私信必回哟?
?博主将持续更新学习记录收获,友友们有任何问题可以在评论区留言
?博客中涉及源码及博主日常练习代码均已上传GitHub
?一面
1.封装、继承和多态
封装:
封装是指将数据和行为封装在一个类中,并对外部隐藏实现细节
这样可以保护数据的完整性,防止外部直接访问和修改数据。
继承:
继承是指一个类可以继承另一个类的属性和方法,并在此基础上进行扩展。
抽象多个类的共性,实现代码的复用。
多态:
多态是指一个对象可以表现出多种形态,在Java中,多态可以通过继承和接口实现。
主要在向上转型和动态绑定上体现
向上转型:父类引用指向子类对象
动态绑定:调用类的方法,究竟执行的是父类的方法还是子类的方法,要看这个引用指向的是父类对象还是子类对象,这个过程是运行时决定的,因此称为动态绑定。
2.抽象类和接口的区别
1、抽象类可以包含非抽象方法,但接口中只能包含抽象方法
2、类只能继承一个抽象类,但可以实现多个接口
3、抽象类的目的是为了实现代码重用,而接口则是为了实现多态性和松耦合
4、抽象类可以包含构造方法,但接口不能包含构造方法。
5、抽象类中的方法可以有访问修饰符,但接口中的方法都是公共的。
3.ArrayList和LinkedList的区别
1、在存储空间上,ArrayList一定在物理上是连续的(因为其底层是顺序表),而LinkedList在逻辑上连续,但是物理上不一定连续(因为其底层是链表)
2、ArrayList支持随机访问,时间复杂度达到O(1);而LinkedList不支持随机访问,其搜索的时间复杂度为O(N)。
3、ArrayList在空间不够时需要扩容,LinkedList没有容量的概念
4、ArrayList支持元素的高效存储和频繁访问,而LinkedList支持任意位置的插入和删除。
4.哪些排序算法不稳定
直接插入、冒泡、归并排序是稳定的,其他排序算法都不稳定。
5.哪些场景下会使用索引
1、数据库表中的数据量比较大,查询速度较慢,需要使用索引来提高查询效率。
2、经常使用where
、join
、order by
等查询语句的场景,使用索引可以加速查询速度。
3、查询条件使用到了非主键列或者非唯一性列,这时使用索引可以减少扫描行的数量,提高查询速度。
6.数据库底层索引数据结构
MySQL底层使用B+树结构作为索引
B+树是一种基于B树的树形结构(B树其实就是一棵N叉搜索树),相对于B树,B+树具有更高的磁盘读写效率和更好的数据查询性能。
其特点如下:
1、所有数据都存储在叶子节点上,非叶子节点只存储索引信息,这样可以减少非叶子节点的存储空间,提高效率。
2、叶子节点之间使用指针连接,形成一个有序的链表,这样可以方便范围查询和排序操作。
3、所有叶子节点之间高度相同,可以形成一个平衡的树结构,这样可以保证查询的性能稳定,不会受到数据分布的影响。
7.左右连接和内连接
左连接和右连接是SQL中的外连接的两种连接方式,用于将两个表中的数据联合起来,其主要区别在于连接的方向和结果集的组成:
1、左连接(Left Join):左连接返回左表中的所有记录和右表中匹配的记录,如果右表中没有匹配的记录,那么就返回NULL值。左连接的连接方向是从左表到右表。
2、右连接(Right Join):右连接返回右表中所有记录和左表中匹配的记录,如果做左表中没有匹配的记录,那么就返回NULL值。右连接的连接方向是从右表到左表。
内连接是取两个表中的匹配交集。
1、内连接只包括两个表中都存在的数据行,而左连接和右连接则可以包括其中一个表中不存在的数据行。
2、内连接不包括NULL值,而左连接和右连接则可以包括NULL值。
8.项目中如何使用数据库的
9.项目开发遇到什么问题,是怎么解决的
10.分页是如何实现的
11.Linux常用命令
12.项目是怎样去测试的
13.测试过程中遇到问题是怎样定位并解决的
1、重现问题,找到问题出现的具体步骤,并确认问题是否可以重现。
2、日志分析,查找异常信息,确定问题的具体原因。
3、使用调试工具辅助分析,深入了解应用程序的内部结构和运行机制,定位问题的具体原因。
4、进行回归测试,确保应用程序的其他功能和性能没有受到影响。
5、及时记录和跟踪问题,多方面思考和分析问题,综合使用各种方法和工具定位和解决问题。
14.为什么选择selenium工具
1)开源免费
2)支持多浏览器。如Chrome、Firefox、edge浏览器等
3)支持多系统。如Linux、Windows、MacOS
4)支持多语言。Java、python、CSharp、Roby、JavaScript
5)selenium包提供了很多可供测试使用的API
15.为什么选择应聘测试岗位
首先,个人对软件测试是比较感兴趣的,我喜欢在软件中发现错误、解决问题和提高软件质量;其次,软件测试岗位需要的一些特质和能力是比较契合我的,比如说沟通能力、耐心和细心等方面;最后,我想谈下我对软件测试的理解,一个产品在完成开发后,不经过我们测试是不敢轻易上线的,那样将会把bug遗留给用户,直接造成公司的损失,这也让我认识到了这个岗位的重要性。
16.提bug不认可
● 1.首先反思自己是不是bug描述的不够清楚
● 2.bug等级要有理有据
● 3.合理友好的沟通,站在用户的角度反问:如果你是用户,能够接受这样的体验吗
● 4.不仅能够提出问题,最好能够给出解决方案。
● 5.组织bug评审
邀请代表参加bug评审:产品代表、开发代表、测试代表,进行以下工作:
1)如何解决bug?
2)如何预防类似的bug?
17.对公司的了解
18.反问
?二面
1、多态
多态是指一个对象可以表现出多种形态,在Java中,多态可以通过继承和接口实现。
主要在向上转型和动态绑定上体现
向上转型:父类引用指向子类对象
动态绑定:调用类的方法,究竟执行的是父类的方法还是子类的方法,要看这个引用指向的是父类对象还是子类对象,这个过程是运行时决定的,因此称为动态绑定。
2、介绍一下单例模式
懒汉-饿汉
单例模式能保证某个类在程序中只存在唯一一份实例,而不会创建出多个实例.
单例模式的具体实现方式,分成"饿汉"和"懒汉"两种.
饿汉模式
在类加载阶段就把实例创建出来.
static class Singleton {
// 把构造方法设为private,防止在类外面调用构造方法,也就禁止了调用者在其他地方创建实例的机会.
private Singleton() {
}
private static Singleton instance=new Singleton();
public static Singleton getInstance() {
return instance;
}
}
懒汉模式
类加载时不创建实例,第一次使用的时候才创建实例
static class Singleton {
private Singleton() {}
private static Singleton instance=null;
public static Singleton getInstance() {
if(instance==null) {
instance=new Singleton();
}
return instance;
}
}
3、懒汉模式是否存在线程安全问题,该如何解决线程安全问题。
在实例尚未创建时,多线程调用涉及到LOAD和SAVE两步操作,所以懒汉模式存在线程安全问题,如果在多线程的情况下要通过以下代码实现.
static class Singleton {
private Singleton() {}
private static volatile Singleton instance =null;
public static Singleton getInstance() {
if(instance==null) {
synchronized (Singleton.class) {
if(instance==null) {
instance=new Singleton();
}
}
}
return instance;
}
}
双重if判定:
加锁/解锁是一件开销比较高的事情,而懒汉模式的线程不安全只是发生在首次创建实例的时候.
因此后续使用的时候,就不必再进行加锁了,外层的if就是判定当前是否已经把instance实例创建出来了,如果已经创建出来了实例,就不必再加锁了,节省了开销;而里层的if判断的是是否要创建实例.
理解volatile:
避免"内存可见性"导致读取的instance出现偏差(后续批次的线程通过第一层if的时候,也需要判定instance的值,但是这个判定不一定是从内存读取的数据,也可能是从寄存器读取的数据),于是补充上volatile.
4、hashcode相同对象一定相同吗
不一定,在Java中,hashCode方法是从Object类继承而来的,它默认返回对象的内存地址的哈希值。因此,如果两个对象的内存地址不同,它们的hashCode值也会不同。但是,如果在类中重写了hashCode方法,使得不同的对象返回相同的hashCode值,这并不意味着这些对象是相等的。
5、Java实现同步线程的方式有哪些
在Java中,常用的同步机制包括以下几种:
- synchronized 关键字:synchronized 是Java内置的同步机制,可以实现线程的互斥和同步,使用 synchronized 修饰的方法或代码块在同一时间只能被一个线程执行,其他线程需要等待锁的释放。
- ReentrantLock:ReentrantLock 是Java提供的一种可重入的互斥锁,使用 ReentrantLock 可以实现与 synchronized 相同的功能,但 ReentrantLock 提供了更多的功能和灵活性,如可中断锁、公平锁等。
- CountDownLatch:CountDownLatch 是Java提供的一个同步工具类,可以实现等待某个事件完成后再执行后续操作,它通过一个计数器来实现,每当一个事件完成时,计数器就减一,当计数器减为0时,等待的线程就会被唤醒。
- Semaphore:Semaphore 是Java提供的一个同步工具类,可以用来控制同时访问某个资源的线程数量,它通过一个计数器来实现,每当一个线程访问资源时,计数器就减一,当计数器减为0时,其他线程就需要等待资源的释放。
- CyclicBarrier:CyclicBarrier 是Java提供的一个同步工具类,可以用来实现多个线程之间的同步,它通过一个栅栏来实现,当所有线程都到达栅栏时,栅栏就会打开,所有线程就可以继续执行后续操作。
- ReadWriteLock:ReadWriteLock 是Java提供的一个读写锁,它允许多个线程同时读取共享资源,但只允许一个线程写入共享资源,这可以提高程序的并发性能。
6、SpringBoot的自动装配
1.自动装配:SpringBoot提供了大量的自动配置功能,可以快速地构建和部署应用程序。
2.条件装配:根据条件自动装配和配置应用程序中的各种组件和功能,使用@Conditional
注解
3.自动扫描:通过自动扫描,自动装配和配置应用程序中的各种组件和功能,使用@Controller、@Service、@Repository
等注解。
4.属性配置:通过配置文件(application.properties或者application.yml)定义属性,自动装配和配置应用程序中的各种组件和功能。
7、服务之间进行通信的话有什么方式
1.RESTful API:通过HTTP协议进行通信,常用于Web应用之间的交互
2.消息队列:通过消息队列,实现异步、解耦、高可用的服务之间通信,常用于高并发、高可用的场景。
3.WebSocket:实现双向通信,常用于实时通信场景,如在线聊天、实时游戏等。
8、sql语句的执行顺序
1.from子句:查询数据的来源表。
2.where子句:筛选符合条件的记录。
3.group by子句:对查询结果进行分组。
4.having子句:对分组后的结果进行筛选。
5.select子句:查询需要返回的列。
6.order by子句:对查询结果进行排序。
7.limit子句:限制返回结果的数量。
9、MySQL中字符类型用什么表示
定长字符串:char
可变字符串:varchar
10、char和varchar的区别(大数据量做检索时,哪个更快)
1.char存储固定长度字符串类型;varchar存储可变长度字符串类型
2.char在存储空间上比varchar更占用空间,但在查询和排序操作可能会更快。
大数据量做检索时,char会更快。
11、selenium工作原理
● selenium脚本代码创建HTTP请求,并且发送给浏览器驱动WebDriver
● 浏览器驱动中包含一个Http Server来接受HTTP请求
● Http Server接受到请求后根据请求来具体操控浏览器,执行测试步骤
● 浏览器将测试执行结果返回给Http Server
● Http Server再将结果返回给selenium脚本代码
12、微信发消息设计测试用例
13、测接口的话从哪些方面去重点关注
1.功能测试:测试接口是否按照预期实现了所需的功能。
2.性能测试:测试接口的性能,包括响应时间、吞吐量、并发性等方面。
3.安全测试:测试接口的安全性,包括防止SQL注入、XSS攻击、CSRF攻击等方面。
4.兼容性测试:测试接口在不同的浏览器、操作系统、设备等多个平台上的兼容性。
5.可靠性测试:测试接口的可靠性,包括接口的稳定性、可重复性、容错性等方面。
6.接口文档测试:测试接口的文档是否准确、完整、易懂。
14、为什么选择走测试
首先,个人对软件测试是比较感兴趣的,我喜欢在软件中发现错误、解决问题和提高软件质量;其次,软件测试岗位需要的一些特质和能力是比较契合我的,比如说沟通能力、耐心和细心等方面;最后,我想谈下我对软件测试的理解,一个产品在完成开发后,不经过我们测试是不敢轻易上线的,那样将会把bug遗留给用户,直接造成公司的损失,这也让我认识到了这个岗位的重要性。
15、想象中的测试是做什么工作的
16、反问
⭐️最后的话⭐️
总结不易,希望uu们不要吝啬你们的?哟(^U^)ノ~YO!!如有问题,欢迎评论区批评指正?