蚂蚁⾦服⾯试题和答案
蚂蚁⾦服⾯试题和答案
1. ⾃我介绍、⾃⼰做的项⽬和技术领域
2. 项⽬中的监控:那个监控指标常见的哪些?
名词含义
TPS应⽤每秒处理的请求数
代码大全可复制表白AVG应⽤对每个请求响应的平均时间
TP9999%的请求响应时间⼩于等于该值
TP9090%的请求响应时间⼩于等于该值
TP5050%的请求响应时间⼩于等于该值
FAIL应⽤对请求响应的成功、失败⽐率
调⽤链接⼀次请求所经过的所有系统的集合产⽣的链条,反馈了系统将的依赖关系及时许
2.1服务端监控指标
性能测试通常需要监控的指标包括:
服务器 Linux (包括CPU、Memory、Load、I/O)
数据库:MySQL(缓存命中、索引、单条SQL性能、数据库线程数、数据池连接数)
中间件:1.tomcat 2、nginx 3、memcache 4、Redis(包括线程数、连接数、⽇志)
⽹络:吞吐量、吞吐率
应⽤:Jvm内存、⽇志、Full GC频率
2.2客户端监控指标
LoadRunner:⽤户执⾏情况、场景状态、事物响应时间、TPS、吞吐量
测试机资源:CPU、Memory、⽹络、磁盘空间
3.微服务涉及到的技术以及需要注意的问题有哪些?
1.每个微服务都很⼩,这样能聚焦⼀个指定的业务功能或业务需求。
2.微服务能够被⼩团队单独开发,这个⼩团队是2到5⼈的开发⼈员组成。
3.微服务是松耦合的,是有功能意义的服务,⽆论是在开发阶段或部署阶段都是独⽴的。
4.微服务能使⽤不同的语⾔开发。
5.微服务易于被⼀个开发⼈员理解,修改和维护,这样⼩团队能够更关注⾃⼰的⼯作成果。⽆需通过合作才能体现价值。
3.1微服务架构的缺点
1.微服务架构可能带来过多的操作。
2.需要DevOps技巧 (/wiki/DevOps)。
3.可能双倍的努⼒。
4.分布式系统可能复杂难以管理。
5.因为分布部署跟踪问题难。
6.当服务数量增加,管理复杂性增加。
4.注册中⼼你了解了哪些?
在微服务架构中,注册中⼼是核⼼的基础服务之⼀。在微服务架构流⾏之前,注册中⼼就已经开始出现在分布式架构的系统中。Dubbo是⼀个在国内⽐较流⾏的分布式框架,被⼤量的中⼩型互联⽹公司所采⽤,Dubbo
是⼀个⾮常实⽤的框架,提供了⽐较完善的服务治理功能,⽽服务治理的实现主要依靠的就是注册中⼼。
那么consul是啥?consul就是提供服务发现的⼯具
consul是分布式的、⾼可⽤、横向扩展的
ZooKeeper
历史悠久,数据存储格式类似⽂件系统,通过私有协议访问,集式架构。优点是成熟稳定,缺点是系统复杂,资源占⽤⾼
etcd
etcd是通过HTTP协议访问的k/v存储系统,采⽤集架构,容易部署和使⽤。但他更多功能是提供存储,要实现服务发现还得配合⼀些第三⽅的应⽤或者⾃⼰实现。 \* “registrator”, ⾃动注册⼯具,将服务提供⽅的信息
存储到etcd, consul这种kv存储系统 * ”confd“,轻量级的配置管理⼯具,他可以从etcd⾥取最新的服务信息⽣成配置⽂件,服务使⽤⽅就可以⽤它来实时更新配置⽂件
Consul
Consul 提供了⾼可⽤的kv存储,集架构,这点和etcd zookeeper类似。另外也提供了⾃动服务发现注册的套件,并且能否对服务进⾏健康检查。结合consul-template可以实现服务提供⽅信息更新(⽐如增加了API服
务器)时,⾃动⽣成配置⽂件给服务使⽤⽅⾃动更新配置。
7.项⽬⽤ Spring ⽐较多,有没有了解 Spring 的原理?AOP 和 IOC 的原理
Spring的两个核⼼概念是IOC(控制反转)和AOP(⾯向切⾯编程)
8.Spring Boot除了⾃动配置,相⽐传统的 Spring 有什么其他的区别?
从本质上来说,Spring Boot就是Spring,它做了那些没有它你也会去做的Spring Bean配置
SpringBoot的优点?Spring由于其繁琐的配置,⼀度被⼈认为“配置地狱”,各种XML、Annotation配置,让⼈眼花缭乱,⽽且如果出错了也很难出原因。SpringBoot帮助开发者快速启动⼀个Web容器;SpringBoot继承了原有Spring框架的优秀基因;SpringBoot的缺点?Spring Boot作为⼀个微框架,离微服务的实现还是有距离的。没有提供相应的服务发现和注册的配套功能,⾃⾝的acturator所提供的监控功能,也需要与现有的监控对接。没有配套的安全管控⽅案,对于REST的落地,还需要⾃
9.Spring Cloud 有了解多少?
10.Spring Bean 的⽣命周期
实例化>填充属性>调⽤BeanNameAware的setBeanName⽅法>调⽤BeanFactoryAware的setBeanDactory⽅法>调⽤ApplicationContext⽅法>调⽤BeanPostProcess的postProcessBeforeInitiali
zation⽅法>调⽤InitializingBean的afterPropertiesSet⽅法>调⽤定制的初始化⽅法>调⽤BeanPostProcess的postProcessAfterInitialization⽅法>Bean准备就绪>调⽤DispostbleBean的destory⽅法==>调⽤定制的销毁⽅法
Spring 只帮我们管理单例模式 Bean 的**完整**⽣命周期,对于 prototype 的 bean ,Spring 在创建好交给使⽤者之后则不会再管理后续的⽣命周期。
11.HashMap 和 hashTable 区别?
HashMap线程是不安全的,HashTable是安全的。HashTable的key和value都不能为null,HashMap的key和value可以为null
12.Object 的 hashcode ⽅法重写了,equals ⽅法要不要改?
个⼈观点:如果我们重写了equals⽅法的话,我们就必须重写hashcode⽅法,为什么equals()相等,那么hashCode()必须相等。因为,如果两个对象的equals()⽅法返回true,则它们在哈希表中只应该出现⼀次;如果hashCode()不相等,那么它们会被散列到表中不同的位置,哈希表中不⽌出现⼀次
如果只修改了hashcode的⽅法,equlas⽅法可以不必要修改
13.Hashmap 线程不安全的出现场景
我们都知道HashMap初始容量⼤⼩为16,⼀般来说,当有数据要插⼊时,都会检查容量有没有超过设定的thredhold,如果超过,需要增⼤Hash表的尺⼨,但是这样⼀来,整个Hash表⾥的元素都需要被重算⼀遍。这叫rehash 外⼀个⽐较明显的线程不安全的问题是HashMap的get操作可能因为resize⽽引起死循环(cpu100%)
14.线上服务 CPU 很⾼该怎么做?有哪些措施可以到问题
top oder by with P:1040 // ⾸先按进程负载排序到 axLoad(pid)
top -Hp 进程PID:1073 // 到相关负载线程PID
printf “0x%x\n”线程PID: 0x431 // 将线程PID转换为 16进制,为后⾯查 jstack ⽇志做准备
jstack 进程PID | vim +/⼗六进制线程PID - // 例如:jstack 1040|vim +/0x431 -
15.JDK 中有哪⼏个线程池?顺带把线程池讲了个遍
java封装的⼏个线程池介绍
FixedThreadPool:
FixedThreadPool并不是⼀个类,它是由Executors⼯具类创建出来的⼀个固定线程数的ThreadPoolEexcutor的对象。
SingleThreadPool:
SingleThreadPool是只有⼀个线程的线程池,内部实现和FixedThreadPool⼀样,不过就是线程数有区别。
CachedThreadPool:
⼀个可缓存线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若⽆可回收,则新建线程
ScheduledThreadPoolExecutor:
⼀个定长线程池,⽀持定时及周期性任务执⾏。
16.SQL 优化的常见⽅法有哪些
1.应尽量避免在 where ⼦句中使⽤!=或<>操作符,否则将引擎放弃使⽤索引⽽进⾏全表扫描
2.对查询进⾏优化,应尽量避免全表扫描,⾸先应考虑在 where 及 order by 涉及的列上建⽴索引
3.应尽量避免在 where ⼦句中对字段进⾏ null值判断,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,
如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,
然后这样查询:select id from t where num=0
4.尽量避免在 where ⼦句中使⽤ or 来连接条件,否则将导致引擎放弃使⽤索引⽽进⾏全表扫描,
如:select id from t where num=10 or num=20
可以这样查询:select id from t where num=10 unionall select id from t where num=20
5.下⾯的查询也将导致全表扫描 select id from t where name like ‘%c%’,左模糊和全模糊查询都会导致搜索引擎放弃索引直接全表扫描,要想使⽤索引可以使⽤右模糊查询
6.in 和 not in 也要慎⽤,否则会导致全表扫描
如:select id from t where num in(1,2,3)
对于连续的数值,能⽤ between 就不要⽤ in 了:select id from t where num between 1 and 3
7.如果在 where ⼦句中使⽤参数,也会导致全表扫描。因为SQL只有在运⾏时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运⾏时;它必须在编译时进⾏选择。然⽽,如果在编译时建⽴访问计划,变量
的值还是未知的,因⽽⽆法作为索引选择的输⼊项。
如下⾯语句将进⾏全表扫描:select id from t where num = @num
可以改为强制查询使⽤索引:select id from t with(index(索引名)) where num = @num
8.应尽量避免在 where ⼦句中对字段进⾏表达式操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。
如:select id from t where num/2=100
应改为: select id from t where num=100*2
9.应尽量避免在where⼦句中对字段进⾏函数操作,这将导致引擎放弃使⽤索引⽽进⾏全表扫描。
如:select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where date diff(day,createdate,’2005-11-30′)=0–’2005-11-30′⽣成的id
应修改为:select id from t where name like‘abc%’select id from t where createdate>=’2005-11-30′ andcreatedate<’2005-12-1′
10.不要在 where ⼦句中的“=”左边进⾏函数、算术运算或其他表达式运算,否则系统将可能⽆法正确使⽤索引
11.在使⽤索引字段作为条件时,如果该索引是复合索引,那么必须使⽤到该索引中的第⼀个字段作为条件时才能保证系统使⽤该索引,否则该索引将不会被使⽤,并且应尽可能的让字段顺序与索引顺序相⼀致
12.不要写⼀些没有意义的查询,如需要⽣成⼀个空表结构:
如:select col1,col2 into #t from t where 1=0这类代码不会返回任何结果集,但是会消耗系统资源的,
应改成这样:create table #t(…)
13.很多时候⽤ exists 代替 in 是⼀个好的选择
如:select num from a where num in(select num from b)
修改成 select num from a where exists(select 1 from b where num=a.num)
14.并不是所有索引对查询都有效,SQL是根据表中数据来进⾏查询优化的,当索引列有⼤量数据重复时,SQL查询可能不会去利⽤索引,如⼀表中有字段 sex,male、female⼏乎各⼀半,那么即使在sex上建了索引也
对查询效率起不了作⽤。
15.索引并不是越多越好,索引固然可以提⾼相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况⽽定。⼀个表的索
引数最好不要超过6个,若太多则应考虑⼀些不常使⽤到的列上建的索引是否有必要
16.尽量使⽤数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个⽐较字符串中每⼀个字符,⽽对于数字型⽽⾔只需要
⽐较⼀次就够了
17.尽可能的使⽤varchar/nvarchar 代替 char/nchar ,因为⾸先变长字段存储空间⼩,可以节省存储空间,其次对于查询来说,在⼀个相对较⼩的字段内搜索效率显然要⾼些。
18.任何地⽅都不要使⽤ select *from t ,⽤具体的字段列表代替“*”,不要返回⽤不到的任何字段。
19.尽量避免使⽤游标,因为游标的效率较差,如果游标操作的数据超过1万⾏,那么就应该考虑改写
20.在所有的存储过程和触发器的开始处设置SET NOCOUNT ON ,在结束时设置 SET NOCOUNT OFF 。⽆需在执⾏存储过程和触发器的每个语句后向客户端发送 DONE_IN_PROC 消息。
21.尽量避免向客户端返回⼤数据量,若数据量过⼤,应该考虑相应需求是否合理。
17.SQL 索引的顺序,字段的顺序
遵循最左原则
18.查看 SQL 是不是使⽤了索引?(有什么⼯具)
查看SQL语句是否引⽤了索引,可以使⽤EXPLAIN ⽅法如:EXPLAIN SELECT * FROM student WHERE cid=1;
以前有个⼯具叫做mysqlreport。现在他的⾝份就是。点击链接查看官⽅⽹站。可以。
19.TCP 和 UDP 的区别?TCP 数据传输过程中怎么做到可靠的?
TCP与UDP区别总结:
1、TCP⾯向连接(如打电话要先拨号建⽴连接);UDP是⽆连接的,即发送数据之前不需要建⽴连接
2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,⽆差错,不丢失,不重复,且按序到达;UDP尽最⼤努⼒交付,即不保证可靠交付
3、TCP⾯向字节流,实际上是TCP把数据看成⼀连串⽆结构的字节流;UDP是⾯向报⽂的
UDP没有拥塞控制,因此⽹络出现拥塞不会使源主机的发送速率降低(对实时应⽤很有⽤,如IP电话,实时视频会议等)
4、每⼀条TCP连接只能是点到点的;UDP⽀持⼀对⼀,⼀对多,多对⼀和多对多的交互通信
5、TCP⾸部开销20字节;UDP的⾸部开销⼩,只有8个字节
6、TCP的逻辑通信信道是全双⼯的可靠信道,UDP则是不可靠信道
TCP协议与UDP协议的区别
⾸先咱们弄清楚,TCP协议和UCP协议与TCP/IP协议的联系,很多⼈犯糊涂了,
⼀直都是说TCP协议与UDP协议的区别,我觉得这是没有从本质上弄清楚⽹络通信!
TCP/IP协议是⼀个协议簇。⾥⾯包括很多协议的,UDP只是其中的⼀个,之所以命名为TCP/IP协议,因为TCP、IP协议是两个很重要的协议,就⽤他两命名了。
TCP/IP协议集包括应⽤层,传输层,⽹络层,⽹络访问层。
其中应⽤层包括:
1、超⽂本传输协议(HTTP):万维⽹的基本协议;
2、⽂件传输(TFTP简单⽂件传输协议);
3、远程登录(Telnet),提供远程访问其它主机功能, 它允许⽤户登录internet主机,并在这台主机上执⾏命令;
4、⽹络管理(SNMP简单⽹络管理协议),该协议提供了监控⽹络设备的⽅法,以及配置管理,统计信息收集,性能管理及安全管理等;
5、域名系统(DNS),该系统⽤于在internet中将域名及其公共⼴播的⽹络节点转换成IP地址。
其次⽹络层包括:
1、Internet协议(IP);
2、Internet控制信息协议(ICMP);
3、地址解析协议(ARP);
4、反向地址解析协议(RARP)。
最后说⽹络访问层:
⽹络访问层⼜称作主机到⽹络层(host-to-network),⽹络访问层的功能包括IP地址与物理地址硬件的映射,以及将IP封装成帧.基于不同硬件类型的⽹络接⼝,⽹络访问层定义了和物理介质的连接. 当然我这⾥说得不够完善,TCP/IP协议本来就是⼀下⾯着重讲解⼀下TCP协议和UDP协议的区别:
TCP三次握⼿过程
第⼀次握⼿:主机A通过向主机B 发送⼀个含有同步序列号的标志位的数据段给主机B,向主机B 请求建⽴连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以⽤哪个序列号作为起始数据段来回应我。
第⼆次握⼿:主机B 收到主机A的请求后,⽤⼀个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要⽤那个序列号作为起始数据段来回应我
第三次握⼿:主机A收到这个数据段后,再发送⼀个确认应答,确认已收到主机B 的数据段:"我已收到回复,我现在要开始传输实际数据了,这样3次握⼿就完成了,主机A和主机B 就可以传输数据了。
3次握⼿的特点
没有应⽤层的数据 SYN这个标志位只有在TCP建⽴连接时才会被置1 握⼿完成后SYN标志位被置0。
TCP建⽴连接要进⾏3次握⼿,⽽断开连接要进⾏4次
第⼀次:当主机A完成数据传输后,将控制位FIN置1,提出停⽌TCP连接的请求;
第⼆次:主机B收到FIN后对其作出响应,确认这⼀⽅向上的TCP连接将关闭,将ACK置1;
第三次:由B 端再提出反⽅向的关闭请求,将FIN置1 ;
第四次:主机A对主机B的请求进⾏确认,将ACK置1,双⽅向的关闭结束.
名词解释
1、ACK 是TCP报头的控制位之⼀,对数据进⾏确认。确认由⽬的端发出,⽤它来告诉发送端这个序列号之前的数据段都收到了。⽐如确认号为X,则表⽰前X-1个数据段都收到了,只有当ACK=1时,确认号才有效,当ACK=0时,确认号⽆效,这时会
2、SYN 同步序列号,TCP建⽴连接时将这个位置1。
3、FIN 发送端完成发送任务位,当TCP完成数据传输需要断开时,,提出断开连接的⼀⽅将这位置1。
TCP的包头结构:
源端⼝ 16位;
⽬标端⼝ 16位;
序列号 32位;
回应序号 32位;
TCP头长度 4位;
reserved 6位;
控制代码 6位;
窗⼝⼤⼩ 16位;
偏移量 16位;
校验和 16位;
选项 32位(可选);
这样我们得出了TCP包头的最⼩长度,为20字节。
UDP(User Data Protocol,⽤户数据报协议)
1、UDP是⼀个⾮连接的协议,传输数据之前源端和终端不建⽴连接,当它想传送时就简单地去抓取来⾃应⽤程序的数据,并尽可能快地把它扔到⽹络上。在发送端,UDP传送数据的速度仅仅是受应⽤程序⽣成数据的速度、计算机的能⼒和传输带宽
2、由于传输数据不建⽴连接,因此也就不需要维护连接状态,包括收发状态等,因此⼀台服务机可同
时向多个客户机传输相同的消息。
3、UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很⼩。
4、吞吐量不受拥挤控制算法的调节,只受应⽤软件⽣成数据的速率、传输带宽、源端和终端主机性能的限制。
5、UDP使⽤尽最⼤努⼒交付,即不保证可靠交付,因此主机不需要维持复杂的链接状态表(这⾥⾯有许多参数)。
6、UDP是⾯向报⽂的。发送⽅的UDP对应⽤程序交下来的报⽂,在添加⾸部后就向下交付给IP层。既不拆分,也不合并,⽽是保留这些报⽂的边界,因此,应⽤程序需要选择合适的报⽂⼤⼩。
我们经常使⽤“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对⽅主机发送UDP数据包,然后对⽅主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么⽹络就是通的。
ping命令是⽤来探测主机到主机之间是否可通信,如果不能ping到某台主机,表明不能和这台主机建⽴连接。ping命令是使⽤ IP 和⽹络控制信息协议 (ICMP),因⽽没有涉及到任何传输协议(UDP/TCP) 和应⽤程序。它发送icmp回送请求消息给⽬的主ICMP协议规定:⽬的主机必须返回ICMP回送应答消
息给源主机。如果源主机在⼀定时间内收到应答,则认为主机可达。
UDP的包头结构:
源端⼝ 16位⽬的端⼝ 16位长度 16位校验和 16位
20.说下你知道的排序算法吧
冒泡排序、选择排序、插⼊排序、快速排序、堆排序、希尔排序、归并排序、计数排序、桶排序、基数排序、
算法最快时间复杂度平均时间复杂度最坏时间复杂度空间复杂度是否稳定
冒泡排序Ω(n)Θ(n2)O(n2)O(1)稳定
插⼊排序Ω(n)Θ(n2)O(n2)O(1)稳定
希尔排序Ω(nlogn)Θ(n(log(n))2)O(n(log(n))2)O(1)不稳定
选择排序Ω(n2)Θ(n2)O(n2)O(1)不稳定
堆排序Ω(nlogn)Θ(nlogn)O(nlogn)O(1)不稳定
归并排序Ω(nlogn)Θ(nlogn)O(nlogn)O(n)稳定
快速排序Ω(nlogn)Θ(nlogn)O(nlogn)O(logn)不稳定
phpexcel插件基数排序Ω(n+b)Θ(n+b)O(n+b)O(n+k)稳定
O表⽰上界(⼩于等于)Ω表⽰下界(⼤于等于)Θ表⽰即是上界也是下界(等于)
21.查⼀个数组的中位数?
22.http 默认端⼝,https 默认端⼝
⑴. HTTP协议代理服务器常⽤端⼝号:80/8080/3128/8081/9080
⑵. SOCKS代理协议服务器常⽤端⼝号:1080
⑶. FTP(⽂件传输)协议代理服务器常⽤端⼝号:21
⑷. Telnet(远程登录)协议代理服务器常⽤端⼝:23
HTTP服务器,默认的端⼝号为80/tcp(⽊马Executor开放此端⼝);
HTTPS(securely transferring web pages)服务器,默认的端⼝号为443/tcp 443/udp;
Telnet(不安全的⽂本传送),默认端⼝号为23/tcp(⽊马Tiny Telnet Server所开放的端⼝);
FTP,默认的端⼝号为21/tcp(⽊马Doly Trojan、Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端⼝);
TFTP(Trivial File Transfer Protocol),默认的端⼝号为69/udp;
SSH(安全登录)、SCP(⽂件传输)、端⼝重定向,默认的端⼝号为22/tcp;
SMTP Simple Mail Transfer Protocol (E-mail),默认的端⼝号为25/tcp(⽊马Antigen、Email Password Sender、Haebu Coceda、Shtrilitz Stealth、WinPC、WinSpy都开放这个端⼝);js数组随机点名不重复
删除文件不到该项目POP3 Post Office Protocol (E-mail) ,默认的端⼝号为110/tcp;
WebLogic,默认的端⼝号为7001;
Webshpere应⽤程序,默认的端⼝号为9080;
webshpere管理⼯具,默认的端⼝号为9090;
JBOSS,默认的端⼝号为8080;
TOMCAT,默认的端⼝号为8080;
WIN2003远程登陆,默认的端⼝号为3389;
Symantec AV/Filter for MSE,默认端⼝号为 8081;
Oracle 数据库,默认的端⼝号为1521;
ORACLE EMCTL,默认的端⼝号为1158;
Oracle XDB(XML 数据库),默认的端⼝号为8080;
Oracle XDB FTP服务,默认的端⼝号为2100;
MS SQL*SERVER数据库server,默认的端⼝号为1433/tcp 1433/udp;
MS SQL*SERVER数据库monitor,默认的端⼝号为1434/tcp 1434/udp;
23.DNS 你知道是⼲嘛的吗
DNS是Domain Name Service的缩写,翻译过来就是计算机域名服务器(也有扩写成Domain Name System,译为计算机域名系统)。⽽之所以本⽂称DNS服务器为“翻译官”,是因为DNS是进⾏域名(domain name)和与之相对应的IP地址(IP address)⼀个域名可以指向多个ip,⽤来做负载均衡嘛。
同样⼀个ip可以被多个域名指向,就是⼤家所购买的虚拟主机嘛;⼀个域名⾄少解析到⼀个IP地址,可以解析到多个个IP地址,DNS轮询和CDN加速就是这个原理。
24.git rebase 和 merge 有什么区别
marge 特点:⾃动创建⼀个新的commit
如果合并的时候遇到冲突,仅需要修改后重新commit
优点:记录了真实的commit情况,包括每个分⽀的详情
缺点:因为每次merge会⾃动产⽣⼀个merge commit,所以在使⽤⼀些git 的GUI tools,特别是commit⽐较频繁时,看到分⽀很杂乱。
rebase 特点:会合并之前的commit历史
优点:得到更简洁的项⽬历史,去掉了merge commit
缺点:如果合并出现代码问题不容易定位,因为re-write了history
25.常⽤的负载均衡,该怎么⽤
26.⽹关能够为后端服务带来哪些好处
27.hashcode 和 equals ⽅法常⽤地⽅
Java的基类Object提供了⼀些⽅法,其中equals()⽅法⽤于判断两个对象是否相等,hashCode()⽅法⽤于计算对象的哈希码。equals()和hashCode()都不是final⽅法,都可以被
重写(overwrite)。
28.hashmap put ⽅法存放的时候怎么判断是否是重复的
Map中判断key是否相同是通过containsKey()⽅法进⾏的,它就是先判断key的hashCode是否相同,再判断key是否相等或equals的。如果存放的key值重复那么会直接覆盖掉与
原来的Key值
29.ArrayList 和 LinkedList 区别
1.ArrayList是实现了基于动态数组的数据结构,每个元素在内存中存储地址是连续的;LinkedList基于链表的数据结构
2.LinkedList查询⽤的遍历,AyyayList查询⽤的是数组下标,所以对于查询ArrayList性能⾼于LinkedList,所以检索性能显然⾼于通过for循环来查每个元素的LinkedList。
3.元素插⼊删除的效率对⽐,要视插⼊删除的位置来分析,各有优劣:在列表⾸位添加(删除)元素,LnkedList性能远远优于ArrayList;在列表中间位置添加(删除)元素,总的来说位置靠前则LnkedList性能优于ArrayList,靠后则相反;在列表末尾30.Set 存的顺序是有序的吗?
我们经常听说List是有序且可重复的,Set是⽆序且不重复的。这是⼀个误区,这⾥所说的顺序有两个概念,⼀是按照添加的顺序排列,⼆是按,照⾃然顺序a-z排列。Set并不是⽆序的传统所说的Set⽆序指的是HashSet,它不能保证元素的添加顺序1,LinkedHashset : 保证元素添加的⾃然顺序
2,TreeSet : 保证元素的⾃然顺序
31.HashSet 是不是线程安全的?为什么不是线程安全的?
hashset其实就是⽤hashmap实现的,所以是不安全的
32.Java 中有哪些线程安全的 Map
Java中平时⽤的最多的Map集合就是HashMap了,它是线程不安全的。
看下⾯两个场景:
1、当⽤在⽅法内的局部变量时,局部变量属于当前线程级别的变量,其他线程访问不了,所以这时也不存在线程安全不安全的问题了。
2、当⽤在单例对象成员变量的时候呢?这时候多个线程过来访问的就是同⼀个HashMap了,对同个HashMap操作这时候就存在线程安全的问题了。
HashTable
HashTable的get/put⽅法都被synchronized关键字修饰,说明它们是⽅法级别阻塞的,它们占⽤共享资源锁,所以导致同时只能⼀个线程操作get或者put,⽽且get/put操作不能同时执⾏,所以这种同步的集合效率⾮常低,⼀般不建议使⽤这个集合。SynchronizedMap
这种是直接使⽤⼯具类⾥⾯的⽅法创建SynchronizedMap,把传⼊进⾏的HashMap对象进⾏了包装同步⽽已,这个同步⽅式实现也⽐较简单,看出SynchronizedMap的实现⽅式是加了个对象锁,每次对HashMap的操作都要先获取这个mutex的对象锁ConcurrentHashMap - 推荐
这个也是最推荐使⽤的线程安全的Map,也是实现⽅式最复杂的⼀个集合,每个版本的实现⽅式也不⼀样,在jdk8之前是使⽤分段加锁的⼀个⽅式,分成16个桶,每次只加锁其中⼀个桶,⽽在jdk8⼜加⼊了红⿊树和CAS算法来实现。
作者:Java技术栈
链接:www.jianshu/p/533bb7cf8901
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
33.Concurrenthashmap 是怎么做到线程安全的?
分段机制:segment,每段加reentrantLock可重⼊锁
定位元素:1 segment数组下标 2 segment的HashEntry数组下标
get⽅法:不需要加锁,value值使⽤了volatile关键字修饰
put⽅法:hash计算段---锁定段---hash计算HashEntry数组---若超多阈值---扩容---释放;
ConcurrentHashMap是线程安全的,那是在他们的内部操作,其外部操作还是需要⾃⼰来保证其同步的,特别是静态的ConcurrentHashMap,其有更新和查询的过程,要保证其线程安全,需要syn⼀个不可变的参数才能保证其原⼦性
34.你项⽬除了写 Java 代码,还有前端代码,那你知道前端有哪些框架吗
vue、React、Angular:是前段三⼤主流框架
35.MySQL 分页查询语句
mysql> SELECT * FROM table LIMIT 5,10; // 检索记录⾏ 6-15
//为了检索从某⼀个偏移量到记录集的结束所有的记录⾏,可以指定第⼆个参数为 -1:
mysql> SELECT * FROM table LIMIT 95,-1; // 检索记录⾏ 96-last.
//如果只给定⼀个参数,它表⽰返回最⼤的记录⾏数⽬:
mysql> SELECT * FROM table LIMIT 5; //检索前 5 个记录⾏
//换句话说,LIMIT n 等价于 LIMIT 0,n。
36.不可重复读会出现在什么场景?
事务不考虑隔离性可能会引发的问题
1、脏读
脏读指⼀个事务读取了另外⼀个事务未提交的数据。
这是⾮常危险的,假设A向B转帐100元,对应sql语句如下所⽰
1.update account set money=money+100 where name='B';
2.update account set money=money-100 where name='A';
当第1条sql执⾏完,第2条还没执⾏(A未提交时),如果此时B查询⾃⼰的帐户,就会发现⾃⼰多了100元钱。如果A等B⾛后再回滚,B就会损失100元。
2、不可重复读
不可重复读指在⼀个事务内读取表中的某⼀⾏数据,多次读取结果不同。
例如银⾏想查询A帐户余额,第⼀次查询A帐户为200元,此时A向帐户内存了100元并提交了,银⾏接着⼜进⾏了⼀次查询,此时A帐户为300元了。银⾏两次查询不⼀致,可能就会很困惑,不知道哪次查询是准的。
不可重复读和脏读的区别是,脏读是读取前⼀事务未提交的脏数据,不可重复读是重新读取了前⼀事务已提交的数据。
很多⼈认为这种情况就对了,⽆须困惑,当然是后⾯的为准。我们可以考虑这样⼀种情况,⽐如银⾏程序需要将查询结果分别输出到电脑屏幕和写到⽂件中,结果在⼀个事务中针对输出的⽬的地,进⾏的两次查询不⼀致,导致⽂件和屏幕中的结3、虚读(幻读)
虚读(幻读)是指在⼀个事务内读取到了别的事务插⼊的数据,导致前后读取不⼀致。
如丙存款100元未提交,这时银⾏做报表统计account表中所有⽤户的总额为500元,然后丙提交了,这时银⾏再统计发现帐户为600元了,造成虚读同样会使银⾏不知所措,到底以哪个为准。
37.前端浏览器地址的⼀个 http 请求到后端整个流程是怎么样?能够说下吗?
域名解析 --> 发起TCP的3次握⼿ --> 建⽴TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图⽚等) --> 浏览器对页
⾯进⾏渲染呈现给⽤户
http请求⽅法:
GET: 完整请求⼀个资源(常⽤)
HEAD: 仅请求响应⾸部
POST:提交表单(常⽤)
PUT: (webdav) 上传⽂件(但是浏览器不⽀持该⽅法)
DELETE:(webdav) 删除
OPTIONS:返回请求的资源所⽀持的⽅法的⽅法
TRACE: 追求⼀个资源请求中间所经过的代理(该⽅法不能由浏览器发出)
HTTP协议是⽆状态的,我们看到查到的⽤到的返回404,500,200,201,202,301.这些不是HTTP协议的状态码。是HTTP的状态码,就是HTTP请求服务器返回的状态码。HTTP协议和HTTP请求返回状态码是⼆回事。
**HTTP请求⽅法并不是只有GET和POST,只是最常⽤的。据RFC2616标准(现⾏的HTTP/1.1)得知,通常有以下8种⽅法:OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE和CONNECT。**
Code HTTP Operation Body Contents Description
200GET,PUT资源操作成功
201POST在资源,元数据对象创建成功
202POST,PUT,DELETE.PATCH N/A全请求已经被接受
204DELETE,PUT,PATCH N/A操作已经执⾏成功,但是没有返回数据
301GET link资源已被移除
303GET link重定向
304GET N/A资源没有被修改
400GET,POST,PUT,DELETE.PATCH错误提⽰(消息)参数列表错误(缺少,可是不匹配)
401GET,POST,PUT,DELETE.PATCH错误提⽰(消息)未授权
403GET,POST,PUT,DELETE.PATCH错误提⽰(消息)和访问受限,授权过期
404GET,POST,PUT,DELETE.PATCH错误提⽰(消息)资源,服务未到
405GET,POST,PUT,DELETE.PATCH错误提⽰(消息)不允许的http⽅法
409GET,POST,PUT,DELETE.PATCH错误提⽰(消息)资源冲突,或者资源被锁定
415GET,POST,PUT,DELETE.PATCH错误提⽰(消息)不⽀持的数据(媒体)类型
429GET,POST,PUT,DELETE.PATCH错误提⽰(消息)请求过多被限制
500GET,POST,PUT,DELETE.PATCH错误提⽰(消息)系统内部错误
501GET,POST,PUT,DELETE.PATCH错误提⽰(消息)接⼝未实现
Java中HTTP的CRUD⽅法
springer所有投稿状态HTTP⽅法数据处理说明
POST Create新增⼀个没有id的资源
GET Read取得⼀个资源
PUT Update更新⼀个资源。或新增⼀个含 id 资源(如果 id 不存在)mysql面试题及讲解
DELETE Delete删除⼀个资源
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论