一、hashMap 数据结构:
1、底层原理:
1)1.7版本以前,底层是通过数组加链表实现的
2)1.8版本 ,底层是数组+链表+红黑树实现的,引入红黑树是因为链表查询效率低,
效率低:1.7 当我们的多个KEY ,计算吃的index 值发生冲突的情况下,会存放在同一个链表中,查询效率较低,从头查到尾,时间复杂度为O(n)
1.8 当数组容量大于等于64 且列表长度大于8时,会将链表转换为红黑树,从而提高多个KEY ,如果发生Index 值冲突时
时间复杂度: 1.7 index 不冲突 ,复杂度为O1,一次即可以查询到,发生冲突就需要从头查到尾,复杂度为O(n)
1.8 index 链表转为红黑树 时间复杂度为 Ologn
二、hashMap有序吗?
无序,因为他是散列表,会根据输入的值去计算存储,1——10 ,有可能存储到 index2 位置,
实现有序存储,可以使用linkHashMap (使用双向链表)
三、key =null 存放在什么位置? 存放在index0
四、hashMap如何解决hash冲突 需要从三个方面回答:
1、了解hash算法与hash表
(1)哈希算法:把任意长度的输入,变成固定长度的输出,输出为散列值,压缩映射,散列值的空间通常远小于输入的空间,不同的输入可能会散列成不同的输出,不能通过散列值确定输入的唯一值
(2)hash表:hash 表又叫做散列表,通过key直接访问到内存存储位置的数据结构,通过hash函数,把key映射到表中的某个位置,获取某个数据的位置,从而加快数据的查找
2、由于哈希算法被计算的数据是无限的,而计算后的结果范围是有限的,会出现不同的数据经过计算得到的值是一样的
3、常用的hash 算法:
MD4:
MD5:
SHA-1:
等
解决hash冲突的方法(四种)
1、开放定址法(线性探测法):寻找一个新的空闲的哈希地址
2、链地址法
3、再哈希法
4、建立公共溢出区法
五、hashTable 数据结构:
六、hashMap与hashTable 区别
1、hashTable 线程安全,方法都加了Synchronized 同步锁,内部使用 数组+ 链表
2、hashMap 线程不安全,内部 数组+链表 (1.7以前) 数组+链表+红黑树(1.8)
3、hashMap 初始容量是16 ,hashTable 初始容量是11
4、hashMap 可以使用null 作为key ,放在index0 位置,hashTable 不允许
5、两个key 的散列算法不同,hashMap 做了二次散列(避免Key分布不均匀,影响性能),提高性能, hashTable 对hashCode做取模
七、list
1、数据结构
2、ArrayList 和LinkList(双向链表)
区别:1)原理区别: ArrayList:数组实现 元素连续存储
LinkList: 链表实现 随机访问 (从头结点访问到尾结点)
2)使用区别: ArrayList: 增删慢、查询快
LinkList: 增删快、查询慢
八、ConcurrentHashMap
原理:保证线程安全,分段加锁(根据Segment 对于不同段加锁)
jdk7 ;数据结构:ReentrantLock+ Segment + HashEntry
jdk8 : Synchronized +CAS(乐观锁) +node +红黑树
锁链表head节点,锁粒度更细,效率更高
九、Cookie与session
cookie:客户端浏览器保存服务端信息的一种方式。把一些状态数据以 Key-value 的形式存储到客户端浏览器(针对客户端)
session :是一个会话,属于服务端的一个容器对象,(针对服务端) 对于浏览器的请求,servelet容器对象会分配一个Session 对象,存储当前会话
产生的状态数据,弥补http协议的无状态,产生的sessionId 存储有状态的数据
十、jdk\jre\jvm 区别 jdk {jre(jvm + lib库) + java工具}
jdk: java开发工具
jre: java运行环境
jvm: 虚拟机 编译.class 文件 ,解释程序
十一、 == 与equals
1) == : 对比栈中的值, 比较两个变量值是否相等
2)equals : 比较两个独立对象的内容是否相等, equals 重写,两个对象相等时,hashcode一定相等
十二、string、stringBuffer、stringBuilder
string : final修饰的,不可改变,每次操作都会产生新的对象
stringBuffer: 在对象上操作, 线程安全 方法都是Synchronized 修饰
stringBuilder: 在对象上操作,线程不安全
性能: stringBuilder >stringBuffer >string
十三、list set
list : 有序 按顺序,可重复 ,允许多个null,取值时:用迭代器和 get(index )
set: 无序 ,不可重复 最多一个null 取值时:只能用迭代器
十四、mybabtis mybatis-plus
1、mybatis 是如何进行分页的
逻辑分页与物理分页
三种分页方式:mybatis mapper 配置文件里面直接写分页sql
通过RowBounds 实现逻辑分页(一次性查询,在内存中去分页) 适用小数据量
Inteceptar 拦截器实现,拦截需要分页的select数据,select语句中动态拼接分页关键字
2、mybatis 里面的缓存机制
设计了二级缓存,提升数据的检索效率,一级缓存是SqlSession 缓存(减少查询数据库的次数)跨SqlSesssion 不满足一级缓存,会重新查询数据库(多个用户访问相同数据)
二级缓存会把任何一个sqlsession 拿到了数据,就会放到二级缓存
实现原理:一级缓存:sqlsession 会持有一个executor , 每个executor 会有一个localCache 的对象,用户发起查询时,回去localCache 中查找,如果有
数据,直接返回,负责查询数据库,写入到localCache
二级缓存:再一级的基础上,给executor 做了一个装饰器,CachingExecutor ,先进行二级缓存查询,开启二级缓存,是一个全局缓存,会被多个
sqlsession 共享 ,
3、#{} 与${} 区别
都是实现动态Sql的一种方式,通过这种方式将参数传递到xml中。执行时会对这两个占位符进行解析
#{} :等同于jdbc 里面的? 占位符, preparedStatment 会进行预编译,会将特殊字符进行转义处理。# 可以防止sql注入
${} : 直接把参数拼接到sql 中
4、mybabtis 优缺点:
优点:解耦(sql单独写、接触与程序代码的耦合)。减少代码量(不需要手动开关连接)、支持动态sql 、能够与spring很好的整合、提供映射标签
缺点:sql 语句编写量大,尤其是字段比较多、关联表多
sql 语句依赖于数据库,导致数据库的移植性差,不能随意更换数据库
5、mybatis-plus
基于mybatis 的一个增强工具,简化开发、提高效率
分页: 内置分页,配置一个分页插件,引入依赖
自定义分页,在xml中写sql ,mapper接口中 返回Ipage 即可实现分页
6、条件构造器:Wrapper
queryWrapper(查询)
updateWrapper(更新)
lambdaWrapper --- 避免出现硬编码
7、mybatis 与 mybatis-plus 如何选择
mybatis : 优点: 轻量、高效,使用标签
mybatis-plus :简化开发
十五、微服务开发
1、springboot约定优于配置的理解(不同方面)
1) 他是一种软件设计的范式,核心思想是减少软件开发人员对配置项的维护
2)是一个约定优于配置理念下的一个产物,是spring下的脚手架,使我们基于spring框架快速开发
3)基于传统的spring框架,要做很多的配置项,只需要做一次(如:jar 依赖,web.xml维护等),springboot 不需要做这些配置
4)体现: 启动依赖 (start 会自动管理jar ,其次内置tomcat容器去运行web应用)
2、springboot 自动装配的原理
自动装配简单来说,就是把第三方组件的bean装载到ioc容器里面,不需要去写装配bean的配置,只需要在启动类上架注解@SpringBootApplication 就可以
复合注解(@EnableAutoConfiguration),实现主要依靠三个核心的技术:1、引入Starter 2、配置类放在第三方的jar 包,通过SpringBoot 约定优于配置
的理念,把这个配置类的全路径 放在 classPath>/META_INF/spring.factories 3、springboot 拿到第三方jar包声明的配置类之后,再通过spring提供的ImportSelector
接口,实现对这些配置类的动态加载,完成自动装配
3、springboot如何解决跨域问题
同源策略下 解决跨域的方式:
1)jsonp
2) cors 服务器后端解决跨域的一种
使用注解 @CrossOrigin (指定域名)
WebMvcConfigurer接口
十六、SpringCloud生态
1、Dubbo请求失败如何处理
Dubbo 是一个RPC框架,提供远程通信的能力,涵盖了服务注册、动态路由、容错、服务、负载均衡等
默认提供重试,服务消费者会向服务提供者进行重新请求,次数2次