一、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三段式提交事务 ?
|