字节测试开发面试题总结

数据结构

HashMap和HashTable的区别
①、HashMap 是线程不安全的,HashTable 是线程安全的;
②、由于线程安全,所以 HashTable 的效率比不上 HashMap;
③、HashMap 最多只允许一条记录的键为 null,允许多条记录的值为 null,而 HashTable 不允许;
④、HashMap 默认初始化数组的大小为 16,HashTable 为 11,前者扩容时,扩大两倍,后者扩大两倍 + 1;
⑤、HashMap 需要重新计算 hash 值,而 HashTable 直接使用对象的 hashCode

MySQL相关

场景题:在一张表中查出成绩最高的10名学生

SELECT * FROM 表名 WHERE ROWNUM < 11 ORDER BY 列名 DESC;

你知道索引吗?索引的优缺点以及索引的实现

  • 索引是对数据库表中的一列或者多列的值进行排序的一种数据结构,如果把数据库中的表比作一本书,索引就是这本书的目录,通过目录可以快速查找到书中指定内容的位置。
  • 优点:
    a)可以保证数据库表中每一行的数据的唯一性。
    b)可以大大加快数据的索引速度。
    c)加速表与表之间的连接,特别是在实现数据的参考完事性方面特别有意义。
    d)在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间。
    f)通过使用索引,可以在时间查询的过程中,使用优化隐藏器,提高系统的性能。
  • 缺点:
    a) 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加。
    b) 索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间,如果需要建立聚簇索引,那么需要占用的空间会更大。
    c) 以表中的数据进行增、删、改的时候,索引也要动态的维护,这就降低了整数的维护速度。
    d) 建立索引的原则。
    e) 在经常需要搜索的列上,可以加快搜索的速度。
    f) 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
    g) 在经常用在连接的列上,这些列主要是一外键,可以加快连接的速度。
    h) 在经经常需要根据范围进行搜索的列上创建索引,国为索引已经排序,其指定的范围是连续的。
    i) 在经常需要排序的列上,国为索引已经排序,这样井底可以利用索引的排序,加快排序井底时间。
    j) 在经常使用在where子句中的列上,加快条件的判断速度。
  • 实现
    B+树
    哈希

Linux命令

在一个log文件中,统计包含"ERROR"的次数

cat  XXX.log|grep ''|grep 'ERROR'| wc -l   

常用的Linux命令

多线程

谈谈你对线程安全的理解
主内存中的变量是共享的,所有线程都可以访问读写,而线程工作内存又是线程私有的,线程间不可互相访问。那在多线程场景下,图上的线程 A 和线程 B 同时来操做共享内存里的同一个变量,那么主内存内的此变量数据就会被破坏。也就是说主内存内的此变量不是线程安全的。

线程安全的实现方式

  1. Synchronized 关键字

1.保证方法或代码块操作的原子性
2.保证监视资源的可见性
3.保证线程间操作的有序性

  1. Volatile 关键字

保证被 Volatile 关键字描述变量的操作具有可见性和有序性(禁止指令重排)

  1. java.util.concurrent.atomic

java.util.concurrent.atomic 包提供了一系列的 AtomicBoolean、AtomicInteger、AtomicLong 等类。使用这些类来声明变量可以保证对其操作具有原子性来保证线程安全。
实现原理上与 Synchronized 使用 Monitor(监视锁)保证资源在多线程环境下阻塞互斥访问不同,java.util.concurrent.atomic 包下的各原子类基于 CAS(CompareAndSwap) 操作原理实现。

  1. Lock

Lock 也是 java.util.concurrent 包下的一个接口,定义了一系列的锁操作方法。Lock 接口主要有 ReentrantLock,ReentrantReadWriteLock.ReadLock,ReentrantReadWriteLock.WriteLock 实现类。与 Synchronized 不同是 Lock 提供了获取锁和释放锁等相关接口,使得使用上更加灵活,同时也可以做更加复杂的操作

写一个死锁的Demo

public class DeadLock {
    public static final String LOCK_1 = "lock1";
    public static final String LOCK_2 = "lock2";

    public static void main(String[] args) {
        Thread threadA = new Thread(()->{
            try {
                while(true){
                    synchronized(DeadLock.LOCK_1){
                        System.out.println(Thread.currentThread().getName());
                        Thread.sleep(100);
                        synchronized(DeadLock.LOCK_2){
                            System.out.println(Thread.currentThread().getName());
                        }
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        Thread threadB = new Thread(()->{
            try {
                while(true){
                    synchronized(DeadLock.LOCK_2){
                        System.out.println(Thread.currentThread().getName());
                        Thread.sleep(100);
                        synchronized(DeadLock.LOCK_1){
                            System.out.println(Thread.currentThread().getName());
                        }
                    }
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        });
        threadA.start();
        threadB.start();
    }
}

网络原理

TCP和UDP的区别
1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保 证可靠交付
3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的,应用层交给UDP多长的报文,UDP就照样发送,即一次发送一个报文。UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)
4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信
5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

TCP是怎么建立连接的
通过三次握手

第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
HTTP的GET和POST方法

测试

电梯的测试用例
需求测试:
查看电梯使用说明书、安全说明书等

界面测试:
查看电梯外观

功能测试:
1.测试电梯能否实现正常的上升和下降功能。
2.电梯的按钮是否都可以使用。
3.电梯门的打开,关闭是否正常。
4.报警装置是否可用。
5.与其他电梯之间是否协作良好。
6.通风状况如何。
7.突然停电时的情况。
8.上升途中的响应。
1)电梯本来在1楼,如果有人按18楼,那么电梯在上升到5楼的时候,有人按了10楼,这时候是否会在10楼先停下来;
2)电梯下降到10层时显示满员,此时若8层有人等待电梯,是否在8层停。

可靠性:
1.门关上的一刹那出现障碍物。
2.同时按关门和开门按钮。
3.点击当前楼层号码。
4.多次点击同一楼层的号码等等。
5.同时按上键和下键会怎样。

易用性:
1.电梯的按钮的设计符合一般人使用的习惯吗.

负载/压力测试:
1.看电梯的最大限度的承受重量.在负载过重时是否有提醒。
2.在一时间内不断的让电梯上升,下降。

稳定性测试:
1.最大负载下平稳运行的最长时间。

文档测试:
1.使用手册是否对电梯的用法、限制、使用条件等有详细描述
刷抖音出现闪退问题应该怎么测试

1.空指针:对象没有初始化就使用了;
2.空函数:有事件源但没有对应的事件对象;
3死循环:没有合理的循环控制流;
4.内存泄露:同一个对象不停地开辟,而且没有释放;
5.内存溢出:程序所消耗的内存大于硬件提供的内存;
6.网络:异步加载时提前调用了数据(现象是在弱网时,根源是空指针);
7.界面UI:像拍照没有附加于ControlView;
8.主线程:需要主线程执行的,放于子线程里执行了。比如:网络电话——网络电话是用C语言写的,在高级语音中要调用中,需要加线程转换。

算法

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下一夜之内能够偷窃到的最高金额。
示例1:
输入: [1,2,3,4]
输出: 4
解释:偷窃1号房屋(金额=1),然后偷窃3号房屋(金额= 3)。偷窃到的最高金额= 1 +3=4。
示例2:
输入: [2,7,9,3,1]
输出: 12
解释:偷窃1号房屋(金额=2),偷窃3号房屋(金额=9),接着偷窃5号房屋(金额
= 1)。偷窃到的最高金额=2+9+1 =12。

  • 18
    点赞
  • 301
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值