测试开发常问面试题整理-----java基础篇

1.接口和抽象类的区别?
答:抽象类有构造方法,接口中没有构造方法;
抽象类只能单继承,接口可以多继承;
抽象类可以有普通方法,接口中所有方法都是抽象方法;
接口的属性都是public static final 修改,而抽象类的不是;

2.Java 中会存在内存泄漏吗?请简述
答:理论上Java因为垃圾回收机制(GC)不会存在内存泄漏问题,然而在实际开发中,可能会存在无用但可达的对象,这些对象不能被GC回收,因此也会导致内存泄漏的发生;
如:hibernate的session(一级缓存)中的对象属于持久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象,如果不及时关闭(close)或者清空(flush)一级缓存就可能导致内存泄漏;

3.什么是单例,哪些地方用到了单例模式?
答:1,保证一个类只有一个实例,并且提供一个访问全局访问点
哪些地方用到:线程池,redis(jdeis客户端),controlller就是单例的;

4.单例模式创建方式:
答:1.饿汉式:类初始化时,会立即加载该对象,线程天生安全,调用效率高;
2.懒汉式:类初始化时,不会初始化该对象,真正需要使用的时候才会创建该对象;
5.int和Integer哪个会占用更多的内存?
答:Integer

6.解释下Java堆空间及GC?
答:当通过Java命令启动Java进程的时候,会给它分配内存,内存的一部分用于创建堆空间,当程序中创建对象的时候,就从堆空间分配内存,GC是JVM内部的一个进程,回收无效对象的内存用于将来的分配;

7.什么是死锁?
答:是指多个进程在运行过程中因争夺资源而造成的一种僵局,当进程处于这种僵持状态时,若无外力作用,他们都将无法再向前推进;

8.什么是“依赖注入”和控制反转“为什么使用?
答:控制反转是spring框架的核心思想,用自己话说就是你要做一件事,别自己可劲new了,你就说你要干啥,然后外包出去就好;
依赖注入:在我
浅薄的想法中,就是通过接口的引用和构造方法的表达将一些事情整理好了,反过来传给需要用到的地方;

9.使用aop的好处?
答:降低模块之间的耦合度
更好的代码复用
使系统容易扩展

10.判断两个对象是否相同,能使用equals比较吗?
答:不能,equals大多用来做字符串比较,要判断基本数据类型或对象类型,需要使用==

11.==和equals有什么区别?
答:==可以判断基本数据类型值是否相等,也可以判断两个对象指向的内存地址是否相同,也就是说判断两个对象是否是同一个对象,equals通常用来做字符串比较;

12.接口和抽象类有什么区别?
.抽象类有构造方法,接口没有构造方法;
.抽象类只能单继承,接口可以多实现;
.抽象类可以有普通方法,接口中的所有方法都是抽象方法;
.接口的属性都是public static final 修饰 ,而抽象的不是

13.list特点?
顺序存储,可以有重复值

14.set特点?
无序存储,不能有重复值;不可重复(equals判断),无序(实际上由hashcode决定)

15.Arraylist与Linkedlist有什么区别?
Arraylist 与 Linkedlist都实现了list接口;
ArrayList是线性表,底层是使用数组实现的,它在尾端插入和访问数据时效率较高;
LinkedList是双向链表,它在中间插入或者头部插入时效率较高,在访问数据时效率较低;
访问一个元素的时间复杂度:LinkedList是O(n);ArrayList是O(1);

16.map有什么特点?
1.已键值对存储数据;2.元素存储顺序是无序的;3.不允许出现重复键;

17.Java 的IO流分为哪几种?
按功能来分:输入流(input)输出流(output)
按类型来分:字节流(inputstream/outputstream),字符流(reader/writer)
18.常用IO类有哪些? File,FileInputStream,FileoutputStream,BufferInputStream;BufferOutputStream;FileReader,FileWriter,BufferReader,BufferWrite;

19.redis的5种数据类型?
String 字符串
list 列表(实现队列,元素不唯一,先入先出原则)
set 集合(各不相同元素)
hash hash散列表(hash的key必须是唯一的)
zset(sort set) 有序集合

20.JDBC操作的步骤?
1.加载数据库驱动类
Class.forName(“oracle.jdbc.driver.OracleDriver”);
2.打开数据库连接
Connection conn=DriverManager.getConnection(“jdbc:oracle:thin:@loaclhost:1521:orcl”;“scott”,“tigger”);
3.执行sql语句
PreparedStatement ps = con.preparedStatement("select * from emp where id =“100”);
4.处理返回结果
ResultSet rt=ps.executeQuery();
5.关闭资源
con.close();

21.JDBC 中如何进行事务处理?
Connection提供了事务处理的方法,通过调用setAutoCommit(false)可以设置手动提交事务,当事务完成后用Commit()显示提交事务,如果在事务处理过程中发生异常,则通过rollback()进行事务回滚;

22.Hashtable和HashMap有什么不同之处?
1.Hashtable 是同步的,比较慢,但是hashMap没有同步策略,所以会更快
2.Hashtable不允许空的key,但hashMap允许有一个空(null)的key

23.java中的hashset 内部是如何工作的?
hashset的内部采用hashMap来实现,由于map需要key和value,所以所有的key都有一个默认的value,类似于HashMap;Hashset不允许重复的key,只允许有一个null的key;

24.5个jdk8引入的新特性?
1.Lambda 表达式允许像对象一样传递匿名函数;
2.Stream API 充分利用现代多核CPU,可以与写出很多简洁的代码;
3.Date 与Time API 有一个稳定简单的日期和时间库;
4.扩展方法,接口可以有静态默认方法;
5.可以将相同的注解在同一类型上使用多次;

25.集合和数组的区别?
1.数组是固定长度的,集合是可变长度的;
2.数组可以存储基本数据类型,也可以存引用数据类型,集合只能存储引用数据类型;
3.数组存储的元素必须是同一个数据类型;集合存储对象可以是不同数据类型;

26.HashMap原理:
JDK1.8之前,HashMap是由数组+链表组成,数组是HashMap的主体,链表则是为了解决哈希冲突而存在的,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,已减少搜索的时间;
存储的是键值对,线程不安全,非同步,存储比较快,键和值可以为空
工作原理:
map的put(key,value)来存储,通过get(key)来得到value值
通过hash算法来计算hashcode的值

27.如何实现数组和List 之间的转换?
数组转list:Array.aslist(array) 进行转换;
List转数组:使用List有带的toArray()方法;

28解释内存中的栈(stack),堆(heap)和方法区(method area)的用法?
1)基本数据类型变量,一个对象的引用,还有就是函数调用的保存都使用JVM中的栈空间,
2)而通过new关键字和构造器创建的对象,则放在堆空间;
堆是垃圾收集器管理的主要区域,由于现在的垃圾收集器都采用分代收集算法,所以堆空间还可以细分为新生代和老生代,在具体一点分为Eden,survivor,Tenured;方法区和堆都是各个线程共享的内存区域,用于存储已经被JVM加载的类信息,常量,静态变量等数据;栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间,栈和堆的大小都是通过JVM的启动参数来进行调整的,栈空间用光了会引发stackOverFlowError,而堆和常量池空间不足则会引发OutOfMemoryError
String str = new String(“hello”);
变量 str 放在栈上,用new创建出来的字符串对象放在堆上;
而”Hello“这个放在方法区(常量池是方法区一部分);

29.#{} 和KaTeX parse error: Expected 'EOF', got '#' at position 15: {}的区别是什么? 1).#̲{} 是预编译处理,{}是字符串替换
2).mybatis 在处理#{}时,会将sql中的#{}替换为?号,调用preparedstatement的set方法来赋值;
3).mybatis 在处理 时,就是把 {}时,就是把 时,就是把{}替换成变量的值
4).使用#{}可以有效的防止SQL注入,提高系统安全性;

30.mybatis是如何进行分页的?分页插件的原理是什么?
1).mybatis 使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页
2).分页插件的基本原理:是使用mybatis提供的插件接口,实现自定义插件在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数;

31.xml 映射文件中,除了常见的select | insert|update|delete 标签外还有哪些标签?
,,,,其中为sql片段标签,通过标签引入sql片段;

32.mybatis的一级,二级缓存?
1).一级缓存:基于perpetualCache的HashMap本地缓存,其存储作用域为session,当session flush 或 close 之后,该session中的所有cache 就将清空,默认打开一级缓存;
2).二级缓存与一级缓存企机制相同,也是采用perpetualCache的HAshMap存储,不同在于其存储作用域为Mapper(namespqce),并可自定义存储源,如Ecache,默认不打开二级缓存,要开启二级缓存,需要在配置文件中配置

33.SQL语句分类:
DQL(数据查询语言) select
DML(数据操作语言)insert,delete ,update
DDL (数据定义语言) create drop,alter,Truncate
TPL(TCL事务控制语言) commit,rollback
DCL(数据金额控制语言) Grant,deny

34.Union 和union all 区别:
union:不包含重复值,默认按第一个查询的第一列升序排序
union all :完全并集包含重复值,不排序

35.数据库三大范式:
第一范式:原子性,要求每一列值都不能再拆分;
第二范式:一张表只描述一个实体(若列中有冗余数据,则不满足)
第三范式:所有列与主键值直接相关

36.事务的特性(ACID)是指什么?
1.原子性:事务中的各项操作,要么全做,要么全不做,任一项操作的失败都会导致整个事务的失败;
2.一致性:事务结束后系统状态是一样的;
3.隔离性:并发执行的事务彼此无法看到对方的中间状态;
4.持久性:事务完成后,及时发生灾难性故障,通过日志和同步备份,可以在故障后重建数据;

37.怎么创建一个索引,索引使用的原则,及优缺点?
1.创建标准索引:
create index 索引名 on 表名(列名)tablespace 表空间名;
2.创建唯一索引:
create unique index 索引名 on 表名(列名)tablespace 表空间名;
3.创建组合索引
CREATE UNIQUE INDEX 索引名 ON 表名( col1, col2, col3 ) tablespace 表空间名 ;
索引使用原则:
1.索引字段建议建立not null 约束;
2.经常与其他表进行连接的表,在连接字段上应该建立索引;
3.经常出现where 子句中的字段且过滤性很强的,特别是大表的字段应建立索引
4.频繁DML的表,不要建立太多的索引,不要将那些频繁修改的列作为索引
索引的优缺点:
优点:创建唯一性索引,保证数据库表中的每一行数据的唯一性;
大大加快数据的检表速度,这也是创建索引的最重要原因;
加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义
缺点:
索引创建在表上,不能创建在视图上
每一个索引还要占一定的物理空间

38.什么是内存泄漏?什么是内存溢出?
内存溢出:指你的应用的内存已经不能满足正常使用了
堆栈已经达到系统设置的最大值,进而导致崩溃,这是一种结果描述;
内存泄漏:指你的应用使用资源之后没有及时释放,导致应用内存中持有了不需要的资源,这是一种状态描述;

39.git提交或者更新冲突怎么解决?
当本地有修改时,你执行了git stash ,然后又从服务器上pull了最新代码,出现了冲突文件解决冲突
1.涨到冲突文件,解决冲突
2.执行git add XXX
3.git commit;
4.git pull;
5.git push;

40.TreeSet 和 HashSet区别?
TreeSet 是二叉树(红黑树的数据结构)实现的;
TreeSet中的数据是自动排序的,不允许放入null值;
HashSet 是哈希表实现的,
HashSet中的数据是无序的可以放入null,但只能放入一个null,
两者中的值都是不能重复

41.数据库的左连接,右连接,内连接?
left join :左连接,返回左边中所有记录以及右表中连接字段相等的记录;
right join :右连接,返回右边中所有记录以及左表中连接字段相等的记录;
inner join:内连接,又叫等值连接,只返回两个表中连接字段相等的行;

42.什么是”依赖注入“和控制反转
控制反转(IOC)是spring 框架的核心思想,用自己的话说,就是你要做一件事,别自己可劲new,你就说你要干啥,然后外包出去就好了;
依赖注入(DI):在我浅薄的想法中,就是通过接口的引用和构造方法的表达,将一些事情整好了,反过来传给需要用到的地方

43.软件测试的目的:
1.验证软件是否满足各类文档说明书等规定的软件质量要求
2.找到软件缺陷
3.为软件产品的质量测量和评价提供依据

44.测试方法:
白盒测试:逻辑覆盖(语句覆盖,条件覆盖,分支覆盖),路径覆盖
黑盒测试:测试大纲法(将功能从大到小全部罗列出来),做功能拆分的场景法,边界值分析法,等价类划分(输入的合法/非法)错误猜测法(哪些容易出现问题)

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值