初级:9K-15K java基础、主流的开发技术:spring、springMVC、mybatis、servlet、restful、webservice、 前端:h5、c3、javaScript、jquery、ajax、angular、vue、 服务器:tomcat、apache、nginx maven、redis、dubbo、zookeeper、 多线程、设计模式、javaio、nio 网络方面:网络协议---tcp、udp、netty
中级:15k-25k springcloud、dubbo(精通)、中间件:分布式技术、rpc技术、缓存、消息系统 要有大规模高并发访问web应用的经验、熟悉一些虚拟化技术:docker、vmware、openstack 深入理解数据结构与算法、对设计模式精通(至少常用的七八中设计模式--精通) 高级:25k--35k 了解大数据的技术:hadoop、impala、fink、spark 精通jvm内存管理、jvm性能调优、熟悉分布式常用技术、rpc
目录
集合
-
Collection下有两个集合:list接口、和set接口。另外一个分支是map接口
-
list接口的特点:
-
元素有序
-
可重复
-
每个元素有自己的下标
-
-
set接口的特点:
-
元素无序
-
不可重复
-
每个元素没有下标
-
-
map接口的特点:
-
存放的数据是key-value形式,一对k-v存放在一个node对象中,有因为node实现了Entry接口,所以说一对k-v是一个Entry
-
key不允许重复,如果重复,新添加的会把旧的替换掉
-
key-value可以是任何引用类型的数据
-
-
list接口常用的实现类有Arraylist、LinkedList、Vector
-
Arraylist
-
可以存放任何值,多个null也可以重复存放
-
线程不安全,因为在源码中没有加synchronized关键字
-
查询快,增删慢
-
底层是封装了一个Object类型的数组。
-
其扩容机制采用的是位运算符的形式:
当创建ArrayList对象时,如果使用的是无参构造,这初始容量为0,第一次扩容为10,再扩容为其1.5倍。如果使用指定大小的有参构造器,则初始容量为指定大小。再扩容为其1.5倍
-
-
LinkedList
-
可以存放任何值
-
线程不安全
-
增删快,查询慢
-
底层是维护的是双向链表和双端队列的特点。维护了两个属性分别为first和last分别指向首节点和尾结点。每个node对象里面又维护了prev、next、item三个属性。
-
-
Vector
-
线程是同步的,即线程安全。因为其操作方法有synchronized关键字
-
效率较低
-
底层是Object类型的数组
-
其扩容机制采用的是三元运算符。即原数组长度+原数组长度
-
-
-
set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet
-
HashSet
-
不保证元素时有序的
-
不能有重复的元素或者对象
-
底层结构为:hashMap结构,而hashMap结构底层是数组+链表+红黑树
-
其扩容机制为:默认初始容量为16.装载因子为0.75.也就是每次扩容12
-
-
LinkedHashSet
-
LinkedHashSet是HashSet子类,继承HashSet,实现set接口
-
添加元素顺序与取出顺序一致
-
不允许添加重复的元素
-
底层是一个LinkedHashMap,维护了一个数组+双向链表
-
-
TreeSet:底层是TreeMap,也是红黑树的形式,便于查找数据
-
-
map接口常用的实现类有:HashMap、Hashtable、TreeMap
-
HashMap
-
不保证映射顺序,因为底层是以hash表的方式来存储的
-
key不能重复、value可以重复。允许使用null键和null值
-
线程不安全
-
底层是数组+双向链表+红黑树的形式呈现的
-
扩容机制:第一次扩容为16,临界值为其0.75.再次扩容为其2倍,临界值也为2倍。
-
具体实现为:
-
添加一个元素时,会先得到其hash值,再转换成索引值
-
然后存储数据表table,看这个索引值对应的位置有没有元素
-
没有的话,直接加入。
-
有的话,通过equals比较,如果相同,放弃添加。如果不相同,添加到已存放元素后面,形成链表
-
当链表长度>=8 并且table>=64时,会进化成红黑树
-
-
-
Hashtable
-
Hashtable的键和值都不能为null
-
线程安全
-
底层是:数组+链表+树的结构出现的
-
扩容机制:初始容量为11,临界值为8.扩容时,扩容到初始容量的2倍+1
-
-
线程与进程
什么是进程
-
进程是指运行中的程序
-
进程是程序的一次执行过程,或是正在运行的一个程序。是动态过程:有它自身的产生、存在和消亡的过程
什么是线程
-
线程时有进程创建的,是进程的一个实体
什么是并发和并行
-
并发:同一时刻,多个任务交替执行。也就是单核CPU实现的多任务就是并发
-
并行:同一时刻,多个任务同时执行,多核CPU可以实现并行
解释
-
并发:一个CPU来回执行多个程序
-
并行:两个CPU同时各自实现自己的一个程序
-
并发和并行同时存在:两个CPU同时各自实现自己的多个程序
怎么创建线程
-
继承Thread类,重写run方法
-
实现Runnable接口,重写run()方法
MySQL
-
存储数据、管理数据的仓库为数据库
-
sql语句是用来存取数据、查询、更新、管理数据库系统的一种语言
-
sql语句分为
-
DCL(数据控制语言,是指权限的分配)
-
DDL(数据定义语言,是指创建的SQL语法)
-
DML数据操纵语言,是指对数据进行CRUD
-
DQL数据查询语言,是指对数据的各种查询语法
-
-
事务的特性ACID
-
A(原子性)事务要么同时成功,要么同时失败(不可分割)
-
C(一致性)多个事务之间相互独立,互不干扰
-
I(隔离性)当A事务对一个文件进行修改后,B事务得到的这个文件数据时A事务修改后的数据。保证了数据的一致性
-
D(持久性)一旦事务提交后,对数据的修改是永久性的
-
-
事务的操作:
-
开启事务:start transaction
-
提交事务:commit---最终持久性影响数据库
-
回滚事务:rollback---回滚到事务操作前
-
-
隔离级别
-
读未提交:安全性最差,可能发生并发数据问题性能最好
-
读已提交:牺牲了效率,提高了安全性---Oracle数据的默认级别
-
可重复读:牺牲了效率,提高了安全性---MySQL数据的默认级别
-
串行化:安全性最高,但是效率太低
-
maven
-
跨平台管理工具、主要服务于项目的构建、依赖、版本信息的管理
-
有四大特征:
-
仓库 :远程仓库、镜像仓库、本地仓库
-
依赖:每个jar包形成依赖,maven底层对它进行导入
-
坐标:每个jar包都有其对应的文件夹
-
命令
-
springBoot
-
简化新spring应用的初始搭建以及开发过程
-
特点
-
创建独立的spring应用程序
-
简化maven配置
-
自动配置spring
-
spring
-
spring是一个轻量级的开源框架,可以解决企业应用开发的复杂度。也是一个分层框架,有7个模块组成。 spring core 、spring AOP、spring DAO、spring context、spring web、spring MVC、spring ORM 它里面的有两个核心思想:IOC和AOP
-
IOC 是控制翻转,也就是将对象的创建权利和对象的生命周期管理过程交给spring容器管理。 IOC是基于IOC容器完成的,底层原理是xml解析、工厂模式和反射 IOC的实现有两种方式:一个是BeanFactory(Bean工厂)和applicationContext 因为在spring中认为万物皆是bean,只要配置好bean的位置,spring就会自动完成IOC。
spring容器管理的对象叫做bean。而bean管理指的就是spring的创建对象、和注入属性 在spring的配置文件中,使用bean标签,在标签里面添加对应的属性就可以完成对象的创建。比如id属性表示bean的唯一标识、class属性表示描述类的全路径 而注入属性也叫DI依赖注入。DI依赖注入也可以在创建对象的过程中spring根据对象的关系,自动将其他对象注入 @AutoWird
-
AOP面向切面编程:利用AOP可以对业务逻辑的各个部分进行隔离。从而使业务逻辑各部分之间的耦合度降低,提高程序的可重用性、也提高了额开发效率。 通俗点讲:在不通过修改源码的方式,在主干业务上添加新的业务模块 这是因为AOP的底层使用的是动态代理。在有接口的情况下采用的是JDK动态代理。没有接口的情况下采用的CGLIB动态代理
-
而在AOP中还有三大要素:
1.切面:把通知应用到切点的过程 2.通知:实际增强的部分逻辑称为通知 3.切点:实际被增强的方法,就是切入点 通知分为:前置通知、后置通知、环绕通知、异常通知、最终通知
-
spring中的事务: 一般添加在事务层(Service),在spring中对事务的控制一般采用声明式事务管理。而声明式事务一般采用的是注解的方式。
关键注解是:@Transaction 其注解的作用是默认条件下,只拦截运行时异常,也就是说当发生运行时异常,会发生事务的回滚
mybatis
-
Mybatis是一个优秀的持久层框架,基于ORM设计思想,实现了以对象的方式操作数据库.
-
mybatis参数天生为单值传参,遇到多值传参有三种方式:
-
封装为对象
-
封装为map集合
-
注解@Param
-
-
#号和$符用法:使用#号会默认给数据添加一对双引号。默认有预编译效果,防止sql注入。当字段名称为参数时,需要用到$符。但是会有sql注入风险
-
转义标签:> > < < & & <![CDATA[内容]] 用于sql中出现大量转义符号的场景
-
遇到相同的多个数据,则一般采用集合的方式封装数据。
-
array封装
-
list封装
-
map<list>封装
-
-
resultType和resultMap的区别:当使用单表时用resultType。多表时使用resultMap
-
关联关系:一对一,一对多,多对多
-
一对一:mapper映射文件中使用association+javaType
-
一对多:mapper映射文件中使用collection+ofType
-
-
缓存:有一级缓存、二级缓存。都默认开启
-
一级缓存:同一个SqlSession对象中查询相同数据,可以实现数据共享
-
二级缓存:同一个SqlSessionFactory有效,但是需要手动表示。<cache/>
-
springMVC
Nginx
-
Nginx是一个高性能的HTTP和反向代理web服务器,也是一款轻量级的Web服务器/反向代理服务器及电子邮件代理服务器 它的特点是:占有内存少,并发能力强。
它里面的概念有:反向代理、负载均衡、动静分离
反向代理是 1.在客户端与用户之间有一个反向代理服务器 2.客户端会以为反向代理服务器就是目标服务器 3.反向代理服务器保护了目标服务器的信息
负载均衡: 当单个服务器服务器解决不了问题,增加多个服务器,
将原先请求集中分发给单个服务器的情况改为了将请求分发给多个服务器,将负载分发给不同的服务器
负载均衡中还有三大策略: 1.轮询策略:根据配置信息,依次访问服务器 2.权重策略:根据服务器的性能,手动分配服务器的负载 3.IPHASH策略:让用户的请求跟服务器绑定,用户初次访问的是哪个服务器,以后永远访问其服务器
动静分离:
将静态资源和动态资源放在不同的服务器上,当用户访问哪个资源时,用哪个服务器接受。降低原来单个服务器的压力、加快网站的解析速度
Feign
-
Feign 是一种声明式Web服务客户端,底层封装了对Rest技术的应用,通过Feign可以简化服务消费方对远程服务提供方法的调用实现
* Feing应用过程分析 * 在启动类上使用@EnableFeignClient注解,去告诉springCloud 开启 Feign start 组件 * Feign Start组件,会在项目启动过程中。扫描包下有@FeignClient注解定义的接口,然后有底层创建其实现类,对象, * 然后交给spring容器管理 * 当这个接口被调用时,会被动态代理类拦截,由@FeignClient携带的请求信息,通过编码器生成Request对象。 * 完成远程服务调用 * 如果请求时多例。会通过Ribbon进行负载均衡 * 当调用完毕,会通过一个响应对象返回数据给客户端