测试开发面试题汇总

1.抽象类和接口的区别
抽象类可以有具体的方法和属性;接口只能有抽象方法和不变常量(static final)。
抽象类可以有私有的方法;接口没有私有方法。
抽象类主要来抽象类别;接口主要来抽象功能。
抽象类只可以单一继承;接口可以多继承;
抽象类和接口的抽象方法必须被类全部实现,否则继承者是抽象类。
2.多线程的实现方式
继承Thread类(Thread是Runnable的实现类)。
实现Runnable接口(最终交给Thread来执行)。
实现Callable接口,用FutureTask包装(最终交给Thread来执行)。
实现Callable接口(交给线程池ExcutorService来执行,Future类获取可阻塞的线程结果)。
使用SpringBoot注解@EnableAsync@Async来执行异步操作。
3.volatile
java关键字,具备3重含义,可见性,原子性,有序性。
可见性表示某一线程对变量的操作对于其它线程都是可见的。线程写操作直接更新主内存,线程读操作会侦听工作内存和主内存的值,不一致置工作内存失效,读取主内存的变量值。
原子性表示对变量的操作不会操作一半终止,其他线程会等待当前线程操作完毕再进行对变量的操作,是Syschronize的缩小版。
有序性表示变量前的操作一定在变量前,变量后的操作一定在变量后。编译器和cpu为了提高执行效率,都会对指令进行重排序,对于多线程来说,重排序会使得结果不可预期,在变量前后设置内存屏障有效的限制了编译器对变量的重排序,让每个线程都得到相同得结果。
4.ThreadLocal
jdk1.2就有得线程类,1.5扩展为泛型。ThreadLocal为每个使用它得线程提供了独立的变量副本,所以每个线程都可以使用它独立的变量副本,而不会影响其他线程。ThreadLocal类提供了一个静态内部类ThreadLocalMap,K值为线程id,value为变量,用空间换取时间的线程变量安全方式。
相比线程共享,是同一个线程同一时刻只能有一个对变量进行操作,是时间换空间。
变量不安全并且不需要进行交互的时候使用TreadLocal。
5.HashMap和HashTable,以及ConCurrentHashMap,区别原理
HashMap不是线程安全的。
HashTable对于新增或删减映射结构是线程安全的,单纯更改映射值需要对变量惊醒额外安全封装。
Collections.synchronizedMap来包装HashMap保证线程安全。
ConCurrentHashMap 高性能的线程安全HashMap方案,在jdk1.7之前使用分段锁机制,并发效率受控于哈希表分段的数量,1.8之后采用数组+链表+红黑树结构,采用CAS(比较交换)和synchronized实现。
6.左连接,右连接,内连
select * from A as a left join B as b on a.age=b.age (临时表数据是A所有数据+B满足条件的数据)
select * from A as a right join B as b on a.age=b.age (临时表数据是B所有数据+A满足条件数据)
select * from A as a inner join B as b on a.age=b.age (临时表数据是A&B满足条件数据)
7.tcp和udp的区别
有连接和无连接(TCP需要进行3次握手,UDP直接进行数据传输)
TCP要求系统资源较多
UDP程序结构比较简单
TCP流模式,UDP数据报模式
TCP保证数据正确性,UDP可能丢包
TCP保证数据正确性,UDP不保证
8.List,Set,Map区别
LIST是可重复集合 继承Collection接口,实现类有ArrayList,LinkedList,Vector。ArrayList和Vector是线性动态数组结构,查询效率高,相对于ArrayList,Vector是线程安全的,查询效率较低。LinkedList是双向链表数据结构,只能按照序号索引进行前后遍历,查询效率较低,但插入时只需要记住前后项即可,插入效率较高。
Set时不可重复集合,继承Collection接口,实现类有HashSet,TreeSet。
HashSet内部由hash表支持,不保证set元素的迭代顺序。TreeSet按照自然元素进行排序或者按照创建set时的comparator进行排序。
Map是单独的接口,实现类有HashMap,HashTable,TreeMap,LinkedHashMap。
HashMap和HashTable内部键值对是无序的且按照哈希方式进行排序的存储方式,不同的是HashTable是线程安全的,键和值不允许为null。TreeMap基于红黑树的排序方式实现,按key排序,默认升序。LinkedHashMap是先进先出栈。
9.hash表和HashCode
Hash表(散列表)是一种数据存储结构,可以根据Key值直接定位对象的数据存储位置,并找出对象的值。
HashCode是java中支持散列数据结构的一种方法。HashCode相同的对象,不一定相等,equals判断相等的对象HashCode一定相等。
10.排序和算法的时间复杂度&空间复杂度
冒泡排序:O(n2) O(1)
插入排序:O(n2) O(1)
选择排序:O(n2) O(1)
二叉树排序:O(n2) O(n)
快速排序: O(n2) O(log2n)~O(n)
堆排序: O(n*log2n) O(1)
希尔排序:O O(1)
顺序查找:O(n)
二分查找:O(logn)
二叉排序树查找:O(logn)
哈希表法:O(1)
分块查找:O(1)
11.日志输出都有哪些框架,log4j日志框架有哪些优势
common-log、log4j、log4j2、slf4j。
log4j可以定义日志级别、指定输出到不同的目的地,如控制台、数据库、文件,不同的目的地定义不同的日志级别,让代码中的日志输出更灵活,更实用。

完待续~~持续编辑中

  • 6
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值