蚂蚁金服+阿里巴巴+支付宝+菜鸟网络Java和python相关的面试题【杭州多测师】【杭州多测师_王sir】【重点】
用Java怎么做的接口自动化测试==》https://www.cnblogs.com/xiaoshubass/p/16479180.html
蚂蚁金服+阿里巴巴+支付宝+菜鸟网络Java和python相关的面试题
1、Java中string和stringbuffer和stringbuilder的区别是什么?==》https://www.cnblogs.com/xiaoshubass/p/16925285.html
2、Java中==和equals的区别 ==》https://www.cnblogs.com/xiaoshubass/p/16925296.html
3、Java中final的作用 ==》https://www.cnblogs.com/xiaoshubass/p/16925304.html
4、Java中多线程创建的方式有哪些 ==》继承Thread类、实现Runnable接口、实现Callable接口(这个不太常用)
5、this是什么意思 ==》this指的是当前类的对象
6、Java中的arraylist和linkedarraylist区别
ArrayList:当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高
LinkedList:当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高
7、Java的8大基本数据类型 ==》byte,short,int,long,float,double,boolean,char
8、finally和final的区别? ==》final关键字的特点:
final修饰的类是不能被继承的,因为其是一个最终类
final修饰的变量是一个常量,只能被赋值一次
final修饰的方法也不能重写,但能被重载
final可以修饰类、方法、变量
内部类只能访问被final修饰的局部变量
finally块:一般放在try、catch的后面,finally中的语句是正常执行或者处理异常之后必须执行的语句,finally块一般是用来关闭(释放)物理资源(数据库连接,网络连接,磁盘文件等)。无论是否发生异常,资源都必须进行关闭,finally块中的代码总能执行,这就说明无论try、catch块中执行怎样的代码,是否发生异常,还是正常运行,finally块一定会被执行
9、map怎么转set ==》通过map.keySet() 方法和 map.entrySet()方法
10、重载和重写的区别 ==》重载是在类里面定义多个构造函数,每个构造函数有相同的方法名、但是参数个数不同,重写的话就是子类继承父类,然后子类重写父类的方法,然后父类和子类的方法可以实现不同的功能
11、Java的String是什么类型的,里面有哪些方法 ==》应用数据类型,char charAt(int index)返回指定索引处的 char 值,int compareTo(Object o)把这个字符串和另一个对象比较,String concat(String str),boolean endsWith(String suffix)测试此字符串是否以指定的后缀结束,String replaceAll,String[] split(String regex),String toLowerCase()
12、Java当中接口和抽象类的区别? ==》https://www.cnblogs.com/xiaoshubass/p/16925629.html
13、Java的三大特性有哪些?==》封装,继承和多态
14、Java的三大特性各自聊一下你的理解? ==》
封装:最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段,一般可以通过加private修改属性的可见性来限制对属性的访问,通过setter来设置,然后通过getter进行取值
继承:子类继承父类就可以拿到父类当中所有的方法或者属性,Java 中一般通过 extends关键字来实现子类继承父类class 父类 {} class 子类 extends 父类 { }
多态:多态就是同一个行为具有多个不同表现形式或形态的能力,首先子类继承父类,然后子类重写父类的方法,要想调用父类中被重写的方法,则必须使用关键字 super
15、Java中数组和集合的区别? ==》数组可以存储基本数据类型和对象,而集合只能存储对象(可以存储基本数据类型作为包类,数组长度是固定的,集合的长度可以改变,定义数组时必须指定数组元素的类型。 集合在默认情况下其中的所有要素都是Object,不能直接获取数组中实际存储的要素个数。 length用于获取数组的长度,但可以直接获取集合中实际存储的元素数量(size )
16、Java中有参构造函数和无参构造函数的区别 ==》参数名称和类名相同,无参构造函数没有入参,有参构造函数一个类里面可以有很多个,并且参数的个数可以是不一样的
17、Java当中list 、set、 map的区别?
首先都是Java里面的集合框架
List:是有序、可重复的。
Set:是无序、不可重复的集合。重复元素会覆盖掉。
Map:键值对,键唯一、值不唯一。Map 集合中存储的是键值对,键不能重复,值可以重复。
18、hashmap和hashtable的区别 ==》HashTable:直接使用对象的hashCode,HashMap:重新计算hash值,HashMap:null能够作为键,这样的键只有一个,能够有一个或者是多个键所对应的值为null,Hashtable:key和value都不允许出现null值,HashMap是线程不安全的,多线程并发的情况下,能够直接使用Hashtable,因为它加了Synchronize锁,HashTable继承Dictionary类,而hashMap继承了AbstractMap类,但是二者都实现了map接口
19、hashmap和Hashtable的底层原理是怎么样 ==》HashMap底层是由数组和链表两种数据结构组合而成的,采用这种数据结果既能方便地读取数据,又可以方便地进行增加和删除的操作,HashTable的底层是哈希表
20、Java做接口自动化中数据驱动这块用什么做的? ==》首先在基类里面封装了一个readYamlUtil的方法去读取存放在yaml文件里面的接口数据,然后在组建用例的数据,通过加入dataprovider数据提供者作为数据的入参
21、Java的中静态类和抽象类的区别?==》抽象类:不能实例化,一般用来构造基类,abstract关键字修饰,一个类中如果有抽象方法,那么这个类一定是抽象类,抽象类中可以存在普通属性、方法、静态属性和静态方法,抽象类中可以存在构造方法,抽象类里面不一定有抽象方法
静态类:需要加上static,不管实例化多少个,调用的都是最初实例化的那个。一般做程序中的全局变量(唯一实例)时。
22、数组转集合 ==》通过Arrays.asList方法转换 String[] array = new String[]{"1","2","3"}; List<String> list = Arrays.asList(array);
23、集合转数组 ==》通过toArray方法转换
List<String> newStrList = new ArrayList<>();
String[] strings1 = (String[]) newStrList.toArray();
24、Java当中拼接字符串用哪些方式? ==》 StringBuilder和StringBuffer调用append方法、+号、concat函数
25、hashmap里面添加和删除调什么方法 ==》put和remove
26、自己有没有用Java写过工具用什么写的? ==》springMVC或者springboot框架去写的
27、在工作中用Java主要干嘛 ==》用来做了接口自动化测试,用的是Java+testng+maven+httpclient+yaml文件去写的,也通过JDBC封装了一些工具类
28、Java接口自动化里面怎么读取yaml文件的 ==》一般封装一个readYamlUtils工具类
29、Java里面的异常处理是怎么样的 ==》使用 try 和 catch 关键字可以捕获异常
30、Java做ui自动化元素定位方式有哪些 ==》id、name、xpath、css等等
31、Java里面做数据驱动用什么做的?==》Java里面用dataprovider数据提供者转换为二维数组做数据驱动
32、Java里面的普通变量和静态变量的区别 ==》实例变量是属于对象的属性,只有对象被实例化(new对象)之后才能分配内存空间;静态变量是属于整个类的,可以直接通过类名来引用,所以也叫类变量,在类加载的时候就被分配内存空间了!实例变量可以通过public和private等等修饰符修饰,静态变量前面一般需要加上static
33、静态变量的一致性是怎么理解的 ==》静态变量也称为类变量,属于类对象所有,位于方法区,为所有对象共享,共享一份内存,一旦值被修改,则其他对象均对修改可见,所以它是线程非安全的,加静态全局的变量,在多线程访问下定会出现数据的不一致性,最好使用synchronized关键字,确保数据的一致性,典型的代表就是单例模式。
34、静态变量在多线程里面的安全是怎么保证的 ==》静态变量static是线程非安全的,在多线程访问下定会出现数据的不一致性,所以需要使用synchronized关键字加锁,确保数据的一致性,典型的代表就是单例模式。
35、Java中int数据类型怎么转换为字符串 ==》String str=String.valueOf(num)和String str=Integer.toString(num)
36、Java的集合框架有哪些? ==》接口有Collection、List、Set、Map ,它的实现类主要是有:ArrayList、LinkedList、HashSet、HashMap
37、Java中的spring mvc和spring boot的区别 ==》https://www.cnblogs.com/xiaoshubass/p/16925311.html
38、Java的Scanner类创建对象的时候需要加入什么入参? ==》System.in
39、spring boot的优点、为什么要用spring boot这个框架 ==》基于注解开发,Spring Boot实现了自动配置,降低了项目搭建的复杂度
40、Java中空指针是怎么引起的? ==》在调用方法前,因为对象没有进行初始化操作所以就会导致NullPointException空指针异常
41、Java的中的string是基本数据类型吗? ==》不是,是引用数据类型
42、Java用的哪些框架? ==》后端用了springMVC和springboot框架,写自动化测试用例用了testNG单元测试框架,testng单元测试框架介绍==》https://www.cnblogs.com/xiaoshubass/p/17130034.html
43、Java中截图或者录屏用代码怎么实现的 ==》可以通过java.awt这个包里面,创建一个Robot对象,然后调用createScreenCapture方法来进行截屏和通过write方法保存截图
44、Java中log4J日志分什么级别,怎么实现的 ==》通过导入log4J这个库,主要是有ERROR、WARN、INFO、DEBUG这些日志级别
45、Java里面的bean知道是什么吗 ==》Java Bean其实就是基于Java的组件模型,由属性、方法和事件3部分组成,可以进行重复使用的,使用它的对象只能通过接口来操作
46、Java的IOC和AOP知道吗 ==》https://www.cnblogs.com/xiaoshubass/p/16931822.html ==》控制反转IOC容器,主要作用的话,就是用了IOC不在需要手动去new一个对象了,将创建对象的过程交个一个组件,用这个组件去创建就可以了,并且直接可以通过注解进行开发
47、Java框架spring中有哪些注解?springboot中用什么注解可以变成一个服务 ==》https://www.cnblogs.com/xiaoshubass/p/16925555.html,通过@Service注解
48、springboot分层、有自己写过服务吗 ==》有的,主要的分层有View层、Controller层、Service层、Mapper层、pojo层==》详情看这个==》https://www.cnblogs.com/xiaoshubass/p/16925574.html
49、Java的修饰符有哪些?
default (即默认,什么也不写): 在同一包内可见,不使用任何修饰符。使用对象:类、接口、变量、方法。
private : 在同一类内可见。使用对象:变量、方法。 注意:不能修饰类(外部类)
public : 对所有类可见。使用对象:类、接口、变量、方法
protected : 对同一包内的类和所有子类可见。使用对象:变量、方法。 注意:不能修饰类(外部类)。
50、Java当中的异常类大概聊一下?常见的异常有哪些?==》 java.lang.Exception 类继承的子类。Exception 类是 Throwable 类的子类。除了Exception类外,Throwable还有一个子类Error,异常类有两个主要的子类:IOException 类和 RuntimeException 类。 常见的异常有:NullPointerException空指针异常,ClassNotFoundException找不到相应的类异常,NoSuchMethodException请求的方法不存在等等
51、在Java中用什么定义一个抽象类 ==》在 Java 语言中使用 abstract class 来定义抽象类
52、在Java中用什么来定义一个接口和枚举==》interface声明一个接口,Enum声明枚举类
53、用什么关键字创建一个对象 ==》new 关键字
54、Java的循环结构有哪些? ==》while 循环、do…while 循环、for 循环(Java还有增强型for循环,for(声明语句 : 表达式){ //代码句子 })
55、Java中break和continue的区别? ==》break 跳出最里层的循环,并且继续执行该循环下面的语句。continue 适用于任何循环控制结构中。作用是让程序跳出当前循环,立刻跳转到下一次循环的迭代。
56、java的反射了解吗讲解下?==》在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的。这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制。Java 反射机制主要提供了以下功能:在运行时判断任意一个对象所属的类,在运行时构造任意一个类的对象,在运行时判断任意一个类所具有的成员变量和方法,在运行时调用任意一个对象的方法。 ==》https://www.cnblogs.com/xiaoshubass/p/16955599.html
三种获取类的字节码对象的方式
//第1种:
Class<Student> clazz = Student.class;
//第2种:
Class<?> clazz1= Class.forName("com.mysql.jdbc.Driver");
//第3种:
java.util.Date str = new java.util.Date();
Class<?> clazz2 = str.getClass();
57、Java接口自动化里面用什么进行断言的? ==》assert断言
58、Java中list集合的底层是什么?是数组吗?==》ArrayList底层是由动态数组实现的。动态数组就是长度不固定,随着数据的增多而变长, LinkedList底层是由双向链表的数据结构实现的。
59、spring框架创建的对象是单例的还是多例的 ==》spring的bean默认注入是单例的 ==》https://www.cnblogs.com/xiaoshubass/p/16955435.html
60、spring框架中怎么把单例变为多例 ==》在配置文件bean里面添加scope="prototype"
61、Java中线程池的理解是什么? ==》线程池就是用池化技术管理和使用线程的一种机制,我们传统线程的缺点每次都需要创建和销毁线程,是需要消耗系统资源的,当任务量比较大的时候没有任务队列对任务进行管理或者是拒绝任务,用了线程池之后,可以复用线程,从而避免了线程重复创建和销毁的性能开销,控制线程的数量,从而避免了因为线程创建过多而导致OOM的问题,提供了任务管理的功能,从而可以实现任务缓存和任务拒绝的功能等等 ==》https://www.cnblogs.com/xiaoshubass/p/16963797.html
62、Java中有哪些锁? ==》https://www.cnblogs.com/xiaoshubass/p/16955525.html
63、Java当中产生死锁的原因和解决方法 ==》https://www.cnblogs.com/xiaoshubass/p/16963620.html
64、Java多线程中,创建线程后通过什么方法来启动 ==》通过start方法启动,自己定义run方法来运行
65、Java中hashmap是线程安全的嘛? hashmap如何解决线程安全的问题? ==》非线程安全的,通过用ConcurrentHashMap对key进行加锁防止线程阻塞==》https://www.cnblogs.com/xiaoshubass/p/16979491.html
66、hashmap的初始容量是多少?它的负载因子是多少? ==》初始容量为16,负载因子默认为0.75
67、Java中HashMap有哪些方式可以保证线程安全 ==》https://www.cnblogs.com/xiaoshubass/p/16979538.html
68、Java中hashmap底层Hash冲突以及如何解决Hash冲突 ==》https://www.cnblogs.com/xiaoshubass/p/16979517.html
69、Java中怎么测试异步接口? ==》https://www.cnblogs.com/xiaoshubass/p/16980731.html
70、Java中把一个字符串实现反转 ==》https://www.cnblogs.com/xiaoshubass/p/16980740.html
81、java中的集合框架有哪些?
java中的集合分为单列集合和双列集合,单列集合顶级接口为Collection,双列集合顶级接口为Map。
Collection的子接口有两个: List和Set。
List接口的特点:元素可重复,有序(存取顺序)。
list接口的实现类:
ArrayList:底层实现是数组,查询快,增删慢,线程不安全,效率高;
LinkedList:底层实现是链表,增删快,查询慢,线程不安全,效率高;
Set接口的特点:元素唯一,不可重复,无序。
Set接口实现类:
HashSet:底层实现hashMap,数组+链表实现,不允许元素重复,无序。
TreeSet:底层实现红黑二叉树,实现元素排序
Map接口的特点:key-value键值对形式存储数据
Map接口实现类:
HashMap:底层数组+链表实现,线程不安全效率高;
TreeMap:底层红黑二叉树实现,可实现元素的排序;
LinkedHashMap:底层hashmap+linkedList 实现,通过hashmap 实现key-value 键值对存储,通过
链表实现元素有序。
82、说一下你对Spring的理解?
Spring这个框架做项目一直都在用吧现在用的最多的是SpringBoot和SpringCloudAlibaba里那些组件。我先说一下Spring吧Spring的核心主要的就三个点吧IOC,DI和AOP。
IOC控制反转,不用Spring框架的话如果想创建一个对象,就new一个。用了Spring以后就直接把类交给Spring来管理,让Spring给创建对象,Spring就是一个大工厂模式,底层创建对象的方式是通过配置文件+反射的方式
DI就是依赖注入,把Spring框架创建好的对象注入到使用的地方,我们项目中都是用@AutoWired按照类型注入的方式,直接获取到这个类的对象。
AOP就是面向切面编程,它的原理的话,我看过它的底层代码,它实际上就是实现了动态代理机制,以前的话用这个做过事务的控制,现在的话我们
都用@Transactionnal注解来控制事务其实他底层实现还是aop那一套。
83、哪些场景不适用索引?
大概分三种情况吧:
第一种情况是:做查询的时候很少用到的列、某个列中包含的数据很少
第二种情况是:数据类型的字段是TEXT、BLOB、BIT等数据类型的字段、
第三种情况是:当在数据表中修改数据的频率大于查询数据频率时等,这些场景不适合创建索引,还有查询字段不会做为 where条件或者order by字段时也不适合创建索引
84、什么是死锁
打个比方,假设有P1和P2两个进程,都需要A和B两个资源,现在P1持有A等待B资源,而P2持有B等待A资源,两个都等待另一个资源而不肯释放资源,就这样无限等待中,这就形成死锁,这也是死锁的一种情况。给死锁下个定义,如果一组进程中每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。竞争不可抢占资源引起死锁,也就是我们说的第一种情况,而这都在等待对方占有的不可抢占的资源。
85、mysql内部函数有哪些
concat,trim,replace,substring,curdate()#返回当前日期,curtime()#返回当前时间,now()#返回当前日期+时间if(value,true,false) #如果value值为真,则返回true,否则,返回false selectif (salary>3000,Hight',"Low) from salary; selectid,salary,if(salary <=> NULL,NULL,NOT NULL) from salary;
ifnull(valuel,value2)#如果value1不为空,则返回valuel,不然返回value2
#可以用来进行空值替换
selectifnull(salary,0.00)from salary等等
86、简单说一下SpringMVC与Spring是如何整合的?
j简单的说 springMVC在ssm中整合就是在 web.xml里边配置springMVC的核心控制器:Dispatch.erServlet;它就是对指定后缀进行拦截;然后在springMVCxml里边配置扫描器,可以扫描到带@controller注解的这些类现在用springMVC都是基与注解式开发,像@service,@Repository @Requestmapping,@responsebody 啦这些注解标签等等都是开发时用的每个注解标签都有自己的作用:它还配一个视图解析器,主要就是对处理之后的跳转进行统一配置,大致就是这些,如何使用springMVC获取表单里的数据?通过形参和表单里的name值保持一致就能获取到
87、说一下SpringBoot吧?
SpringBoot:约定大于配置:同样通过自动配置,引入依赖后,加载默认配置文件,如果要自定义的话可以通过iava类实现,
也可以在全局配置文件(application.properties,application.yml)中定义;
SpringBoot优点
1.快速创建独立运行的Spring项目以及与主流框架集成
2.使用嵌入式的Servlet容器应用无需打成WAR包(iar)
3.Starters(场景启动器)自动依赖与版本控制
4.大量的自动配置,简化开发,也可修改默认值
5.无需配置大量的XML,无代码生成,开箱即用
88、简单说一下sql语句是怎么优化的?
我们一般在开发的时候需要注意SQL规范,比如说最基本的不要用"查询所有字段,还要就是经常用表别名经常commit提交事务尽量让及时释放回滚点如果使用函数的话尽量使用内部的函数还有一个优化的地方是项目上线后,产生大量数据后,由测试人员发现某些的功能点响应比较慢,反馈给我们开发人员,我们开发人员找到这个功能点对应的sql语句,如果这个sql语句写的比较复杂,我们就得用explain去分析-
下SQL语句的执行计划,看下是不是索引失效了,或者是执行到某一个子查询的语句执行比较慢,然后我们去优化这些个sql,优化方式是什么?比如说加索引或者创建视图
89、主库从库数据延迟的问题有遇到过吗?
主要原因:数据库在业务上读写压力太大,CPU计算负荷大,网卡负荷大,硬盘随机I0太高。次要原因:读写binlog带来的性能影响,网络传输延迟
MySql数据库从库同步的延迟解决方案:
架构方面
1)业务的持久层采用分库架构,mysql服务能力水平扩展,分散压力
2)单个库读写分离,一主多从,主写读从,分散压力。这样从库比主库压力高,保护主库
3)服务在业务和DB之间加入memcache和redis 的cache层,降低读的压力
4)不同业务的mysql放在不同的物理机,降低压力
5)使用比主库更好的硬件设备,Mgsgl压力小,延迟就减少了
90、使用Redis缓存有没有遇到什么问题?
你是说的那个缓存雪崩和缓存穿透我知道缓存雪崩是因为redis中多个key同时失效后,又遇到高并发后就会造成大量的请求直接请求数据库,导致数据库服务器宕机的情况,一般这种情况我们会给redis中的key设置不同的生命周期就能解决,或者是我们给使用分布式锁来解决;还有缓存穿透的话就是大并发请求过来,查询一个连数据库都没有的数据,频繁的请求数据库导致数据库宕机,这种解决方案是我们会存到redis一个key值value为null,给个失效时间也可以避免这种问题
91、说一下redis集群吗?
Redis本身就支持集群操作redis cluster,另外redis还支持主从复制,以前的老版本中有一个哨兵模式,在主服务器宕机时,从服务器可以自动转换为主服务器。我们公司搭建的redis集群是用的ruby脚本配合搭建的,我们一共搭建了6台服务器3主3备,他们之间通信的原理是有一个乒乓协议进行通信的,他们判断一个节点的状态是用投票选举机制判断的,半数以上判断一个接口是宕机了的话备用节点就会启动对,我再给你说下一他们往里存储数据的机制吧,其实这个redis搭建好集群以后每个节点都存放着一个hash槽,每次往里存储数据的时候,redis都会根据存储进来的key值算出一个hash值,通过这个hash值可以判断到底应该存储到哪一个哈希槽中,取的时候也是这么取的,这就是我了解的redis集群。