1.== 和 equals的区别?
== 比较的是两个变量的值是否相等,也就是用于比较变量所对应的内存中
所存储的数值是否相等. 要比较两个基本类型的数据或两个引用变量是否
相等,只能用==操作符。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个
人的长相是否相同,它比较的两个对象是独立的。
2.Array和ArrayList之间的区别?
1. Array类型的变量在声明的同时必须进行实例化(至少得初始化数组的
大小),而ArrayList可以只是先声明。
2. Array只能存储同构的对象,而ArrayList可以存储异构的对象。
同构的对象是指类型相同的对象.而ArrayList可以存放任何不同类型的数据
3 在CLR托管对中的存放方式:Array是始终是连续存放的,而ArrayList的
存放不一定连续。
4 初始化大小
Array对象的初始化必须只定指定大小,且创建后的数组大小是固定的,
而ArrayList的大小可以动态指定,其大小可以在初始化时指定,也可以不指
定,也就是说该对象的空间可以任意增加。
Array和ArrayList的相似点
1 都具有索引(index),即可以通过index来直接获取和修改任意项。
2 他们所创建的对象都放在托管堆中。
3 都能够对自身进行枚举(因为都实现了IEnumerable接口)。
ArrayList的一些特性
3. Redis 常见的性能问题和解决方法
性能问题:
1.Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,
当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最
好不要写内存快照。
2.Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响
是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复
速度
3.Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的C
PU和内存资源,导致服务load过高,出现短暂服务暂停现象。
4.Redis主从复制的性能问题,Redis的主从复制是建立在内存快照的持久化
基础上,只要有Slave就一定会有内存快照发生。虽然Redis宣称主从复制无
阻塞,但由于磁盘io的限制,如果Master快照文件比较大,那么dump会耗费
比较长的时间,这个过程中Master可能无法响应请求,也就是说服务会中断,
对于关键服务,这个后果也是很可怕的。
5.单点故障问题,由于目前Redis的主从复制还不够成熟,所以存在明显的单
点故障问题,这个目前只能自己做方案解决,如:主动复制
解决方法:
1.Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是
不要启用内存快照做持久化。
2.如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
3.为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网
内。
4.尽量避免在压力较大的主库上增加从库
5.为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,
即主从关系为:Master<--Slave1<--Slave2<--Slave3.......,这样的
结构也方便解决单点故障问题,实现Slave
4.GC是什么,为什么会有GC?显示调用GC会立即进行垃圾回收吗?为什么?
- GC: GC是垃圾收集的意思.特指java中jvm的垃圾回收机制.
- GC存在的原因:及时的清理内存,让程序执行更流畅,避免内存泄漏和浪费资源.
java的垃圾回收不需要程序员手动去处理,而是jvm自动的进行.让程序员更注重
业务开发.
- 但是gc本身是一个单独的线程,而且是一个优先级很低的线程.不可预知的情况
下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能
实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
- 垃圾回收主要是对jvm的堆进行操作.
- 显示调用GC不会立即进行垃圾回收,因为他是一个优先级比较低的线程,所以当
时如果有其他线程在运行就不会立即执行垃圾回收.
5.Java 中会存在内存泄漏吗,请简单描述。
理论上Java因为有垃圾回收机制(GC)不会存在内存泄露问题(这也是Java被广泛使用于服务
器端编程的一个重要原因);然而在实际开发中,可能会存在无用但可达的对象,这些对象不能
被GC回收也会发生内存泄露。一个例子就是Hibernate的Session(一级缓存)中的对象属于持
久态,垃圾回收器是不会回收这些对象的,然而这些对象中可能存在无用的垃圾对象。
6.MQ(消息队列)是什么,应用场景有哪些?
MQ是系统之间进行通信。使用Activemq的话可以对系统之间的调用进行解耦,实现系统间的异
步通信。原理就是生产者生产消息,把消息发送给activemq。Activemq接收到消息,然后查
看有多少个消费者,然后把消息转发给消费者,此过程中生产者无需参与。消费者接收到消息后
做相应的处理和生产者没有任何关系。
应用场景:在项目中主要是完成系统之间通信,并且将系统之间的调用进行解耦。例如在添加、
修改商品信息后,需要将商品信息同步到索引库、同步缓存中的数据以及生成静态页面一系列
操作。在此场景下就可以使用activemq。一旦后台对商品信息进行修改后,就向activemq发
送一条消息,然后通过activemq将消息发送给消息的消费端,消费端接收到消息可以进行相
应的业务处理
Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发
送不成功此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢
失的
如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场
景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持
久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置
发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接
收后为止
7.抽象类和接口的区别?
含有abstract修饰符的class即为抽象类
1.抽象类可以有构造方法,接口中不能有构造方法。
2.抽象类中可以有普通成员变量,接口中没有普通成员变量
3.抽象类中可以包含非抽象的普通方法,接口中的所有方法必须都是抽象的,不能有非抽
象的普通方法 。
4. 抽象类中的抽象方法的访问类型可以是public,protected和default,但接口中的
抽象方法只能是 public类型的,并且默认即为public abstract类型。
5. 抽象类中可以包含静态方法,接口中不能包含静态方法
6. 抽象类和接口中都可以包含静态成员变量,抽象类中的静态成员变量的访问类型可以任意,
但接口 中定义的变量只能是public static final类型,并且默认即为public static
final类型。
7. 一个类可以实现多个接口,但只能继承一个抽象类。
8.递归与迭代的区别?
递归的基本概念:程序调用自身的编程技巧称为递归,是函数自己调用自己.
使用递归要注意的有两点:
1)递归就是在过程或函数里面调用自身;
2)在使用递归时,必须有一个明确的递归结束条件,称为递归出口.
递归分为两个阶段:
1)递推:把复杂的问题的求解推到比原问题简单一些的问题的求解;
2)回归:当获得最简单的情况后,逐步返回,依次得到复杂的解.
迭代:利用变量的原值推算出变量的一个新值.如果递归是自己调用自己的话,迭代就是A不
停的调用B.
递归中一定有迭代,但是迭代中不一定有递归,大部分可以相互转换.能用迭代的不用递归,
递归调用函数,浪费空间,并且递归太深容易造成堆栈的溢出.