JAVA关键词汇
- 一: java
- 二:注解
- 三:理论
- 四:安全认证(session、cookie、token)
- 五:细碎知识点
-
- 5.1 多态
- 5.2 浅拷贝和深拷贝的区别?
- 5.3 反射中,Class.forName 和 ClassLoader 区别。
- 5.4 .如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。
- 5.5描述动态代理的几种实现方式,分别说出相应的优缺点。
- 5.6 数组与链表的优缺点和区别
- 5.7 error 和 exception 的区别,CheckedException,RuntimeException 的区别
- 5.8 JVM
- 5.9 自定义一个java.lang.String类,这个类是否可以被类加载器加载?为什么
- 5.10 jdk1.5 中,引入了泛型,泛型的存在是用来解决什么问题。
- 5.11 string 、stringbuffer、stringbuilder区别
- 5.12 volatile和synchronized的区别
- 5.13单点登录的原理,你们jwt中包含哪些信息?
- 5.14 红黑树的实现原理和应用场景
- 5.15 HashMap和Hashtable的区别
- 5.16 线程池有哪些类型
- 5.17 Redis三种模式对比
- 5.18 项目中的搜索功能是怎么实现的?
- 5.19 引入第三方登录时,怎么使得你自己的token和第三方的token关联起来?
- 5.20 Thread 类中的start() 和 run() 方法有什么区别?
- 5.21 Java中Runnable和Callable有什么不同?
一: java
https://blog.csdn.net/sinat_35512245/article/details/59056120
记录java项目中的关键词汇
1.1 HandleInterceptor拦截器
SpringMVC的处理器拦截器,类似于Servlet开发中的过滤器Filter,用于对请求进行拦截和处理。
- preHandle:在业务处理器处理请求之前被调用。预处理,可以进行编码、安全控制、权限校验等处理;
- postHandle:在业务处理器处理请求执行完成后,生成视图之前执行。后处理(调用了Service并返回
- ModelAndView,但未进行页面渲染),有机会修改ModelAndView (这个博主就基本不怎么用了);
afterCompletion:在DispatcherServlet完全处理完请求后被调用,可用于清理资源等。返回处理(已经渲染
单个实现类的执行顺序
preHandler -> Controller -> postHandler -> model渲染-> afterCompletion
1.2 instanceof
用来在运行时指出对象是否是特定类的一个实例,返回布尔类型
if (anObject instanceof String){
}else{
}
1.3 分布式跟踪技术
1.3.1 Dapper
- Dapper:大规模分布式系统的跟踪系统,帮助理解系统行为,用于分析性能问题,
1.3.2 Sleuth框架
用于跟踪服务的调用过程
Sleuth借鉴了Google Dapper的设计,先了解两个概念
- Trace 表示整个跟踪过程,从用户发起请求到最终的响应。一次跟踪包括多个跨度,这些跨度以树状结构进行保存。
- Span:跨度,表示一次调用的过程,一次跟踪包含多次调用过程。假设用户向A服务发起请求,A服务又要调用B服务,那么此时将会产生两个跨度。用户调用A服务、A服务调用B服务。
1.3.3 RPC
- RPC(Remote Procedure Call Protocol)–远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
- RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。
1.3.4 Zipkin
- Zipkin是一个分布式跟踪系统,主要用于收集、管理微服务产生的数据。Zipkin的设计基于Google Dapper,在实际用时,我们需要让各个微服务Zipkin服务器报告过程数据。
- 对于Spring Cloud来说,已经提供了几个模块来实现数据报告功能,仅需要加入依赖,以及简单配置,即可实现向Zipkin“写入”数据
1.4 Thymeleaf
- Thymeleaf是一个流行的模板引擎,
- 页面模板技术
- Thymeleaf的主要目标在于提供一种可被浏览器正确显示的、格式良好的模板创建方式,因此也可以用作静态建模。你可以使用它创建经过验证的XML与HTML模板
传统的Spring WEB技术,使用JSP页面技术,spring boot 已不推荐,spring boot 支持以下页面模板语言
- Thymeleaf
- FreeMarker
- Velocity
- Groovy
- JSP
1.4 安全幂等
get:安全幂等
post:不安全不幂等:当插入一条数据时,遇到网络不佳,可能会多插入,所以不幂等
update:多次更新,扔一个条数据,所以幂等
幂等:对数据库操作成功之后会不会产生影响,如果有影响则是不幂等
Post
1.5 snowflake (雪花)算法
- 用于生成不同的ID,总共64位。
1.6 JPA
类似与mybatis
1.7 RESTful API
1.7.1 介绍
- RESTful API就是一套协议来规范多种形式的前端和同一个后台的交互方式。
- RESTful API由后台也就是SERVER来提供前端来调用。前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。也就是说RESTful 是典型的基于HTTP的协议
1.7.2 设计原则和规范
- 资源:资源就是网络上的一个实体,一段文本,一张图片或者一首歌曲。资源总是要通过一种载体来反应它的内容。文本可以用TXT,也可以用HTML或者XML、图片可以用JPG格式或者PNG格式,JSON是现在最常用的资源表现形式。
- 统一接口:RESTful风格的数据元操CRUD(create,read,update,delete)分别对应HTTP方法:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源,这样就统一了数据操作的接口。
- URL:可以用一个URI(统一资源定位符)指向资源,即每个URI都对应一个特定的资源。要获取这个资源访问它的URI就可以,因此URI就成了每一个资源的地址或识别符。一般的,每个资源至少有一个URI与之对应,最典型的URI就是URL。
- 无状态:所谓无状态即所有的资源都可以URI定位,而且这个定位与其他资源无关,也不会因为其他资源的变化而变化。
二:注解
2.1 @Component
泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标记
2.2 @CrossOrigin
在微服务中,在controller层加上该注解,允许跨域请求
2.3@ConfigurationProperties和@EnableConfigurationProperties
- @ConfigurationProperties注解主要用老吧properties配置文件转换为bean使用,
- @EnableConfigurationProperties作用是为了让ConfigurationProperties注解生效,如果只使用前者,则无法将配置文件装成bean。
三:理论
3.1 CAP理论
CAP理论:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
- 一致性:即更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致,所以,一致性,说的就是数据一致性。
- 可用性:服务一直可用,而且是正常响应时间。对于一个可用性的分布式系统,每一个非故障的节点必须对每一个请求作出响应。所以,一般我们在衡量一个系统的可用性的时候,都是通过停机时间来计算的。
- 分区容错性:分布式系统在遇到某节点或网络分区故障的时候,仍然能够对外提供满足一致性和可用性的服务。简单点说,就是在网络中断,消息丢失的情况下,系统如果还能正常工作,就是有比较好的分区容错性。
假设在N1和N2之间网络断开的时候,有用户向N1发送数据更新请求,那N1中的数据V0将被更新为V1,由于网络是断开的,所以分布式系统同步操作M,所以N2中的数据依旧是V0;这个时候,有用户向N2发送数据读取请求,由于数据还没有进行同步,应用程序没办法立即给用户返回最新的数据V1,怎么办呢?
有二种选择
- 第一,牺牲数据一致性,保证可用性。响应旧的数据V0给用户;
- 第二,牺牲可用性,保证数据一致性。阻塞等待,直到网络连接恢复,数据更新操作M完成之后,再给用户响应最新的数据V1。
这个过程,证明了要满足分区容错性的分布式系统,只能在一致性和可用性两者中,选择其中一个。
四:安全认证(session、cookie、token)
cookie:数据只会保存在浏览器中,当需要开发安卓IOS时,使用cookie比较麻烦,需要更改
4.1 session
会话标识:客户端和服务器中都需要保存,
客户端(浏览器)如何保存这个“身份标识”,一般默认采用 Cookie 的方式,这个会话标识(Session id)会存在客户端的Cookie中。
4.2 cookie
数据保存在浏览器中,
session的id一般存于cookie中。
- session和cookie一般配合使用,cookie值保存在浏览器中,而session保存在服务端。但是当用户量太大的时候,会造成存储多,需要的服务多。
4.3 token
4.3 登录有状态、无状态区别
- 有状态:服务器端保存记录(cookie、session)
- 无状态:服务器端不用保存记录(JWT、token)
4.4 RBAC
RBAC基于角色的访问控制(Role-Based Access Control)是按角色进行授权,比如:主体的角色为总经理可以查
询企业运营报表,查询员工工资信息等,访问控制流程如下:
五:细碎知识点
5.1 多态
- 必须满足的条件:
继承
重写
父类引用指向子类对象
5.2 浅拷贝和深拷贝的区别?
- 浅拷贝可以使用列表自带的copy()函数(如list.copy()),或者使用copy模块的copy()函数。
- 深拷贝只能使用copy模块的deepcopy()
区别
- 浅拷贝仅仅复制所考虑的对象,而不复制它所引用的对象,当对象中含有对象时,则复制子对象的地址
- 深拷贝把要复制的对象所引用的对象都复制了一遍。当对象中含有对象时,则将子对象也复制。改变子对象后,复制出来的对象里面的属性不会发生变化。而浅拷贝则会变化
5.3 反射中,Class.forName 和 ClassLoader 区别。
- 在Java中,类装载器把一个类装入Java虚拟机中,要经过三个步骤来完成:装载、链接和初始化,其中链接又可以分成校验、准备和解析三 步,除了解析外,其它步骤是严格按照顺序完成的,各个步骤的主要工作如下:
装载:查找和导入类或接口的二进制数据;
链接:执行下面的校验、准备和解析步骤,其中解析步骤是可以选择的;
校验:检查导入类或接口的二进制数据的正确性;
准备:给类的静态变量分配并初始化存储空间;
解析:将符号引用转成直接引用;
初始化:激活类的静态变量的初始化Java代码和静态Java代码块。 - Class.forName(className)方法,其实调用的方法是Class.forName(className,true,classloader);注意看第2个boolean参数,它表示的意思,在loadClass后必须初始化。比较下我们前面准备jvm加载类的知识,我们可以清晰的看到在执行过此方法后,目标对象的 static块代码已经被执行,static参数也已经被初始化。
- 再看ClassLoader.loadClass(className)方法,其实他调用的方法是ClassLoader.loadClass(className,false);还是注意看第2个 boolean参数,该参数表示目标对象被装载后不进行链接,**这就意味这不会去执行该类静态块中间的内容。**因此2者的区别就显而易见了。
5.4 .如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。
hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠
- equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
- hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。
5.5描述动态代理的几种实现方式,分别说出相应的优缺点。
jdk、cglib
- jdk动态代理是由java内部的反射机制来实现的,
- cglib动态代理底层则是借助asm来实现的。
jdk动态代理的应用前提,必须是目标类基于统一的接口。如果没有上述前提,jdk动态代理不能应用。由此可以看出,jdk动态代理有一定的局限性,cglib这种第三方类库实现的动态代理应用更加广泛,且在效率上更有优势。
5.6 数组与链表的优缺点和区别
- 数组
**是将元素在内存中连续存放,由于每个元素占用内存相同,可以通过下标迅速访问数组中任何元素。**但是如果要在数组中增加一个元素,需要移动大量元素,在内存中空出一个元素的空间,然后将要增加的元素放在其中。同样的道理,如果想删除一个元素,同样需要移动大量元素去填掉被移动的元素。
如果应用需要快速访问数据,很少插入和删除元素,就应该用数组。 - 链表
元素在内存中不是顺序存储的,而是通过存在元素中的指针联系到一起