1 ArrayList和linkedList的区别
Array(数组)是基于索引(index)的数据结构,它使用索引在数组中搜索和读取数据是很快的。Array获取数据的时间复杂度是O(1),但是要删除数据却是开销很大,因为这需要重排数组中的所有数据, (因为删除数据以后, 需要把后面所有的数据前移),缺点: 数组初始化必须指定初始化的长度, 否则报错。
List—是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式,它继承Collection。List有两个重要的实现类:ArrayList和LinkedList
ArrayList: 可以看作是能够自动增长容量的数组,因为它的底层的实现是Array, 数组扩容实现。ArrayList在初始化的时候指定长度肯定是要比不指定长度的性能好很多, 这样不用重复的申请空间,复制数组, 销毁老的分配空间了。
LinkList是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.当然,这些对比都是指数据量很大或者操作很频繁。另外,链表不需要连续的空间,大不确定。
总结:同样查找, ArrayList和LinkedList的时间复杂度都是O(N), 但是数组要比链表快。因为数组的连续内存, 会有一部分或者全部数据一起进入到CPU缓存, 而链表还需要在去内存中根据上下游标查找, CPU缓存比内存块太多。
2 Oracle SQL优化:
- 使用EXPLAIN PLAN分析SQL语句
- 采用临时表,比如使用with as语句
- 使用parellet并行查询
- 选择最优效率的表名顺序,Oracle的解析器按照从右到左的顺序处理from字句中的表名,所以必须选择将记录条数最少的表作为基础表放在from字句的最后面
- 合理使用索引,提高效率,并同时避免索引失效
(1)索引对不等号和NOT的限制:记住,索引只能告诉你什么存在于表中,而不能告诉你什么不存在于表中
(2)索引对函数的限制,避免在索引列上使用计算 注意: 对在WHERE子句中经常要使用函数时,应该建立基于函数的索引,且只有当查询语句包含该函数或者表达式时,基于函数的索引才会被调用。
(3)避免在索引列上使用IS NULL和IS NOT NULL:一般对要建立索引的列不要设置为可空,如果确实含有空值,建议使用默认值代替空值.
(4)注意通配符%的影响
(5)避免改变索引列的类型:当比较不同数据类型的数据时, ORACLE自动对列进行简单的类型转换.
- 对于一些联合索引,一定要按照索引顺序进行查询,确保使用索引的第一列,否则不会走索引。
- where子句的连接顺序:ORACLE采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾
3 设计模式:
对于模式,我的看法就是在开发过程中发现或是预见变化,然后用类而不是方法去封装变化。
我在项目中遇到的设计模式:工厂模式(消息中心kafka不同的topic对应不同的线程池对象,就是在运用工程模式)、策略模式(其实就是面向对象多态的运用,风控系统不同的风险维度采用不同的处理逻辑,采用的就是策略模式)、装饰者模式(风控大屏,由于业务会对大屏的展示内容会经常发生变动,所以这时采用装饰者模式方便后期变动调整)、facade模式、单例模式,还有一些比较熟悉的,代理模式、原型模式等。