面试总结!

一、java部分


1.描述对java中继承,多态,重载,重写四个概念的理解?


      继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。

     继承的作用:通过继承可以快速创建新的类,实现代码的重用,提高程序的可维护性,节省大量创建新类的时间,提高开发效率和开发质量。
在 Java 中通过 extends 关键字可以申明一个类是从另外一个类继承而来


注意:

子类不能选择性继承父类;
Java不支持多重继承,但一个类可以实现多个接口,从而克服单继承的缺点;
构造方法不会被子类继承,但可以从子类中调用父类的构造方法。


继承的优点
继承过来的字段和方法,可以像任何其他字段和方法一样被直接使用;
在子类中可以声明一个与父类中同名的新字段或静态方法,从而“隐藏”父类中的字段或方法;
可以在子类中声明一个在父类中没有的新字段和方法;
可以在子类中编写一个父类当中具有相同名的新实例方法,这称为“方法重写”或“方法覆盖”;
可以在子类中编写一个调用父类构造方法的子类构造方法,既可以隐式地实现,也可以通过使用关键字super来实现。


1.子类可以继承父类的属性和方法,但是不能继承构造方法
2.一个类只能有一个父类,java中继承是单继承的
3.一个类可以有多个子类
4.子类可以扩展父类的属性和方法
5.子类可以修改父类的属性和方法

2.描述java中反射的用途与实现?
用途:
1、反编译:.class-->.java
2、通过反射机制访问java对象的属性,方法,构造方法等

实现
1、通过Class.forName()方法加载字符串,就可以得到该字符串做代表的Class对象。
例如:Class<?> clazz = Class.forName("java.lang.String")就可以得到String类的Class对象。值得注意的是,字符串必须是类的全名,即包名+类名。
 2、通过类名调用class属性得到该类的Class对象。

例如:Class<?> clazz = String.class也可以得到String类的Class对象。

       3、调用实例的getClass()方法。

例如:Date date = new Date();
          Class<?> clazz = date.getClass();

通过上边的两句代码就可以得到date实例的Class对象。

        4、如果是基本类型的包装类,则可以通过调用包装类的Type属性来获得该包装类的Class对象。
    

例如:Class<?> clazz = Integer.TYPE;


3.HashMap、HashTable、HashSet、TreeSet四种集合的概念及其它们之间的区别?


HashMap java中以键值对的形式存储数据,可以通过key找到对应的value 采用数组+链表/红黑树的形式存储数据,jdk1.8以后HashMap采用数组+链表/红黑树的方式来存储数据

实现原理
第一步:通过key.hashCode()获取key的hashcode;
第二步:通过(h = key.hashCode()) ^ (h >>> 16)进行高16位的位运算;
第三步:通过(n - 1) & hash对计算的hash值取模运算,得到节点插入的数组所在位置。

HashMap可以接受null键值和值,而HashTable则不能,HashMap是非synchronized的;存储的是键值对。
HashMap几乎可以等价于Hashtable,除了HashMap是非线程安全的并且可以接受null键和null值。

HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。
HashSet 允许有 null 值。
HashSet 是无序的,即不会记录插入的顺序。
HashSet 不是线程安全的, 如果多个线程尝试同时修改 HashSet,则最终结果是不确定的。 您必须在多线程访问时显式同步对 HashSet 的并发访问。
HashSet 实现了 Set 接口。


一.HashSet
特点:

1.HashSet中不能有相同的元素,可以有一个Null元素,存入的元素是无序的。
2.HashSet如何保证唯一性?
     1).HashSet底层数据结构是哈希表,哈希表就是存储唯一系列的表,而哈希值是由对象的hashCode()方法生成。
     2).确保唯一性的两个方法:hashCode()和equals()方法。
3.添加、删除操作时间复杂度都是O(1)。
4.非线程安全

二.LinkedHashSet
特点:
1.LinkedHashSet中不能有相同元素,可以有一个Null元素,元素严格按照放入的顺序排列。
2.LinkedHashSet如何保证有序和唯一性?
    1).底层数据结构由哈希表和链表组成。
    2).链表保证了元素的有序即存储和取出一致,哈希表保证了元素的唯一性。
3.添加、删除操作时间复杂度都是O(1)。
4.非线程安全

三.TreeSet
特点:

1.TreeSet是中不能有相同元素,不可以有Null元素,根据元素的自然顺序进行排序。
2.TreeSet如何保证元素的排序和唯一性?
底层的数据结构是红黑树(一种自平衡二叉查找树)
3.添加、删除操作时间复杂度都是O(log(n))
4.非线程安全

四.总结:
通过以上特点可以分析出,三者都保证了元素的唯一性,如果无排序要求可以选用HashSet;如果想取出元素的顺序和放入元素的顺序相同,那么可以选用LinkedHashSet。如果想插入、删除立即排序或者按照一定规则排序可以选用TreeSet。


4.线程池的实现原理?


      其实java线程池的实现原理很简单,说白了就是一个线程集合workerSet和一个阻塞队列workQueue。当用户向线程池提交一个任务(也就是线程)时,线程池会先将任务放入workQueue中。workerSet中的线程会不断的从workQueue中获取线程然后执行。当workQueue中没有任务的时候,worker就会阻塞,直到队列中有任务了就取出来继续执行。

二、数据库部分


1.结合使用场景及设计方式,阐述分库与分表设计的概念及优点?

未答

2.SQL的优化方式?

见笔记


3.如何选择合适的分布式主键方案?
数据库自增长序列或字段。

UUID。

Redis生成ID

Twitter的snowflake算法

利用zookeeper生成唯一ID

MongoDB的ObjectId


UUID
优点:
本地生成ID,不需要进行远程调用,时延低,性能高。
缺点:
UUID过长,16字节128位,通常以36长度的字符串表示,很多场景不适用,比如用UUID做数据库索引字段。
没有排序,无法保证趋势递增

Flicker 主要思路采用了MySQL自增长ID的机制(auto_increment + replace into)
优点:
充分借助数据库的自增ID机制,可靠性高,生成有序的ID。
缺点:
ID生成性能依赖单台数据库读写性能。
依赖数据库,当数据库异常时整个系统不可用。


 类snowflake方案
这种方案生成一个64bit的数字,64bit被划分成多个段,分别表示时间戳、机器编码、序号。
ID为64bit 的long 数字,由三部分组成:

41位的时间序列(精确到毫秒,41位的长度可以使用69年)。
10位的机器标识(10位的长度最多支持部署1024个节点)。
12位的计数顺序号(12位的计数顺序号支持每个节点每毫秒产生4096个ID序号)。


优点:
      时间戳在高位,自增序列在低位,整个ID是趋势递增的,按照时间有序。
性能高,每秒可生成几百万ID。可以根据自身业务需求灵活调整bit位划分,满足不同需求。

 
缺点:
       依赖机器时钟,如果机器时钟回拨,会导致重复ID生成。
在单机上是递增的,但是由于涉及到分布式环境,每台机器上的时钟不可能完全同步,有时候会出现不是全局递增的情况。

TDDL序列生成方式
TDDL是阿里的分库分表中间件,它里面包含了全局数据库ID的生成方式,主要思路:

使用数据库同步ID信息。
每次批量取一定数量的可用ID在内存中,使用完后,再请求数据库重新获取下一批可用ID,每次获取的可用ID数量由步长控制,实际业务中可根据使用速度进行配置。
每个业务可以给自己的序列起个唯一的名字,隔离各个业务系统的ID。
- 相比flicker方案,大大降低数据库写压力,数据库不再是性能瓶颈。
- 相比flicker方案,生成ID性能大幅度提高,因为获取一个可用号段后在内存中直接分配,相对于每次读取数据库性能提高了几个量级。
- 不同业务不同的ID需求可以用seqName字段区分,每个seqName的ID获取相互隔离,互不影响。

缺点:
强依赖数据库,当数据库异常时整个系统不可用。

4.数据库索引的原理?
非二叉平衡树


5.Redis如何实现持久化?


         Redis支持RDB和AOF两种持久化机制。持久化功能有效地避免因进程退出造成的数据丢失问题,下次重启时利用之前持久化的文件即可实现数据恢复。

RDB:RDB持久化是把当前进程数据生成快照保存到硬盘的过程,触发RDB持久化过程分为手动触发和自动触发。
RDB(快照)持久化:保存某个时间点的全量数据快照
AOF(Append -Only - File)持久化:保存写状态  默认是关闭的
RDB-AOF 混合持久化方式


三、分布式架构部分


1.阐述spring中IOC和AOP的概念?
2. springMVC运行的通用基本流程?


3.如何实现前后端分离?
前端的工作:实现整一个前端页面以及交互逻辑,以及利用ajax与nodejs服务器(中间层)交互
后端的工作:提供API接口,利用redis来管理session,与数据库交互
spring boot + vue.js


4.阐述微服务中数据一致性原理?
cap原理是由加州大学伯克利分校Eric Brewer教授提出来的。

指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可同时满足

一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。
可用性(A): 每个操作都必须以可预期的响应结束
分区容忍性(P): 即使出现单个组件无法可用,操作依然可以完成
实现
传统事务
分布式事务
2pc两段式提交事务
3pc三段式提交事务
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值