牛码社
2024-10-05 14:51:48 0 举报
AI智能生成
牛码社
作者其他创作
大纲/内容
7 电商稳定性专题
稳定性标准
稳定性的衡量标准:服务年度可用时间,我们定义自己4个9,达到具有故障自动恢复能力的可用性
影响因素
造成稳定性出问题的因素: 1. 服务本身 2. 宿主环境机器集群和机房等
3. 上游输入异常 4. 下游服务或资源异常
服务梳理、分级
架构隔离梳理
1.用户接口/后台接口
2.经常变化/稳定不变
3.核心的/非核心非主流程
4.CPU密集/存储密集
目的:做好架构隔离、为异常处理和监控告警做准备
核心链路梳理
绑定/领取
技术链路:1. 分布式锁做分布式互斥-;
2. 库存redis执行decr
3. 如果> 0 -> mysql乐观锁扣减库存
4. ->插入任务(uid_configid唯一键)
5. ->失败重试
分布式锁
setnx的问题:如果客户端A加锁成功,但还没同步到从库,主库挂掉了,主从切换,客户端B从从库加锁也成功了。
分布式锁2个指标:1.安全性,加锁能成功;2.活性,锁可以失败,但是不能不可预期;
redlock:同时给多个实例加锁,超过一半算加锁成功。都是在客户端实现,在服务端想保证比较难。
查询
redis查询任务列表
MySQL兜底数据
不同业务线限流,保障顺风车首页,比如保险业务要限流
任务流转
架构中的engine部分,MQ->规则模块->数据更新与双删->action下发
监控、告警
好的监控系统:关注于整体应用的 SLA、关联指标聚合。 把有关联的系统及其指标聚合展示。主要是三层系统数据:基础层、平台中间件层和应用层;快速故障定位。 对于现有的系统来说,故障总是会发生的,而且还会频繁发
场景1:体检:容量管理和性能管理
场景2:急诊:定位问题告警和性能分析
优化
一些无法察觉的变化,比如发券引起的呼叫量激增,通过增加复合曲线来解决
指标与报警
基础指标
CPU
cpu.idle 全局空闲占比,10秒采集一次, top -b -d 10|grep Cpu
cpu.loadavg.5 5分钟平均活动进程数 cat /proc/loadavg
MEM
cat /proc/meminfo
mem.total 所有可用RAM大小
mem.cached 高速缓存占用RAM大小
mem.free 可用RAM大小
mem.used 已使用RAM大小
NET
cat /proc/net/sockestat
net.sockets.used 已使用所有协议的socket数量
net.tcp.timewait 等待关闭的tcp连接数
DISK
disk.capacity 所有分区容量大小 syscall.Statfs()
disk.inodes.used.percent 某个分区的inode使用率
io.await 某块磁盘单词读写操作平均耗时
端口监控
日志监控
nginx 访问、错误
php-fpm 错误
RPC调用日志
业务处理日志
API监控
请求量、平响、成功率、失败率
资源监控
mysql:写入、读取、主从延迟
redis:访问耗时、访问次数
mq:积压、消费错误率
数据监控
活动数据:绑定、流入、完成、发放、以及失败
复合数据:活动与交易大盘复合数据
预案
机房故障,切流
降级
业务降级
好友、附近车主的任务奖励排名降级掉,不再展示
降级后能减低多少负载,15%
非主要数据不获取,在api侧组装数据时,停掉这些数据的获取
比如反作弊服务,手动领取如果一直超时或者失败率过高则自动熔断,911可配置
批量则不允许跳过
DOS系统不可用,限定里程的订单任务不可用
熔断
券系统熔断,如果券系统故障或者超时严重,不再展示券信息
redis降级
绑定
需要扣减等,直接限流到MySQL的流量限制600qps,目前业务最大qps也能满足
查询
缓存超时,各个地方的超时累计会增加100ms左右,防止都打到db,也需要限流
增加fusion数据源,牺牲一些一致性保证整体稳定
限流
任务领取限流(配合秒杀来讲)
磁盘告警
publiclog降级:暂停写
限流
漏桶、令牌捅:https://gocn.vip/topics/11108
令牌捅、漏桶对比:https://xie.infoq.cn/article/4a0acdd12a0f6dd4a53e0472c
漏桶的本质是总量控制,令牌桶的本质是速率控制。至于这个控制,你可以用来保护自己,也可以用来保护别人。
如果在秒杀、抢购、整点打卡签到、微博热点事件这些业务场景用令牌桶的话,会出现大量用户访问出错,因为请求被直接丢弃了;而用漏桶的话,处理可能只是会慢一些,用户体验会更好一些,所以我认为漏桶更适合“突发流量”。
突发流量
令牌桶支持突发流量和漏桶不支持:
令牌桶的前提是你能承受突发流量但是要人为限流。
漏桶是你无法承受突发流量所以无奈只能强制限流。
比如网络中使用令牌桶,光纤网络可以承受 10Gbps 的速度,但是因为你宽带套餐只给了 100Mbps,所以用令牌来限制你长期使用网络的速度。如果只是临时传个文件,就可以短期突破限制。如果是长期占用,就限制住。
又比如,如果网络是根烂网线,只能承受 100Mbps,然后你又选了 100Mbps 的套餐,那就得用漏桶来限制输入速度,否则输入太快会被网卡丢弃掉。
如果你要互相类比的话,令牌桶是允许爆发流出,而漏桶是允许爆发流入。
对于数据方面的降级,需要前端程序的配合。一般来说,前端的程序可以根据后端传来的数据来决定展示哪些界面模块。比如,当前端收不到商品评论时,就不展示。为了区分本来就没有数据,还是因为降级了没有数据的两种情况,在协议头中也应该加上降级的标签。
小流量与预发布
预发布
外网访问不到
小流量
外网可以访问
演练
放火
级别:接口->服务级别->机器级别->集群级别->机房级别
压测
数据隔离
redis,对key特殊处理,加shadow后缀,过期时间短,防止容量暴涨影响线上业务
mysql用shadow表
压测流量日志全写入单独日志;
外部服务mock账号
哨兵压测->子系统压测->全链路压测
机房级别:同城双活
系统分层
1.网络层
2.应用层
3.数据层
4.中间件
挑战
1.本机房调用,不要跨机房调来调去的
2.单元化,数据分片和一致性问题
3.数据同步
目的
1.同城容灾
2.日常分流、演练、防火、小流量
双活改造计划
只有核心业务双活
1.节点挂机器,新增ip列表
2.依赖服务部署
3.依赖模块部署
4.存储服务白名单
5.路由配置与nginx配置变更
6.小流量与全量
router/inrouter分流和切流
用cityid,没带的默认走ys
在router上配置city_id分流
机房故障:DSI流量切流
专项应对:大促稳定性整体思路
技术侧稳定性
增量问题
预防新问题引入
技术评审、CR等
存量问题
分级监控报警机制,及时、准确、自动发现异常,及时止损,快速恢复
业务侧稳定性:事前
配置类全部Apollo收敛等
突发流量
系统容量-自身容量预估
系统容量-上下游容量预估
运营活动尽量扩容,配合限流
降级预案
限流预案
演练
业务侧稳定性:事中
值班、盯盘
业务侧稳定性:事后
复盘,经验沉淀
6 设计模式总结
策略模式
原则
封装、面向接口编程、同时也符合OCP原则
实现
一个策略接口定义、有若干个策略实现,一个使用类、接口多个实现的类,引用一个策略的实例
借助Spring的bean管理注册
采用工厂提取获取策略
对策略key进行二次封装定义
优点
利用此模式解决了不同策略隔离和封装,调用执行与算法策略细节逻辑解耦,多态在执行过程动态选择
缺点
服务内需要暴露所有的细节给使用方感知
对应猎豹代码位置
com.orangecy.strategy.StrategyFactory
使用场景
JUC包中compare()方法
web中 servlet httpservlet使用了
状态模式
原则
封装变化
实现
一个状态接口,定义所有可能引起状态变化的方法,多个具体状态实现状态接口,目标类会持有所有状态的对象,目标类会记录当前的状态,方法会调用当前状态的方法,状态改变可以在目标类,也可以在状态类
与策略模式非常类似,但是其目的不同,策略模式在于对策略算法的选择,一般只持有某一个策略,对于客户端来说不知道选哪个,而状态模式在于状态切换,包含了所有的状态
优点
对于状态流转的系统,状态模式将不同的状态的不同行为隔离开,并且封装起来,提高了系统的弹性,对于新增状态可控
缺点
系统结构和实现复杂
OCP原则支持不够好,在新增状态时需修改负责状态转换的代码
对应猎豹代码位置
com.orangecy.state.ElectricLightContext
使用场景
涉及到状态流的业务可使用
Context 上下文状态 重置可使用
通道执行模式
processor模式
定义
他的每一个processor只能对本processor操作对象范围生效、无法指定其他的processor
和策略模式区别
策略模式 重在不同的算法组合, 这里的组合业务逻辑操作的实体对象是一样的而processor模式可以对不同的实体对象进行操作
对应猎豹代码位置
com.orangecy.processor.ItemPublishService
责任链模式
定义
一个请求 由一系列节点处理 满足条件的节点有责任,负责处理请求,对client不需要care一些detail
使用场景
1. 多个不同的处理器处理同一个request,具体由哪一个处理器
执行其实是在运行过程中决定的(binging node operate)
2. 这个请求串联多个node 动态处理
和processor区别
核心区别,责任链的node模式 他的处理器node只能对这次的请求做出
处理 或者 不处理(交给下一个处理器对象) 。。。 foreach node
对应猎豹代码位置
com.orangecy.processor.ItemPublishService
装饰者模式
定义
满足OCP定义,class/method/object 对外扩展开放,对修改关闭
实现
定义抽象公共接口,每一个具体的类拥共享对象的实例
优点
可以在你不想改变原有的class/method的前提下,扩展类的能力,OCP,实现多个不同的功效
缺点
这样的叠加功效 很难一眼看清楚整个的关系结构
一般来说,比原有的继承方式的 相对来说符合OCP 更不易暴露
对应猎豹代码的位置
com.orangecy.decorator.AbstractLbDecorator
观察者模式
原则
为交互对象间的松耦合设计代码
实现
一个被观察者接口,若干被观察者实现,可以新增,删除,通知观察者,若干观察者实现,每个实现持有一个被观察者实例
优点
观察者和被观察者之间松耦合,彼此不侵犯对方的逻辑
缺点
当有较多观察者时,通知很麻烦
被观察者可能出现循环依赖
观察者不知道被观察者如何变化
工厂方法模式
原则
依赖抽象,不要依赖具体 DIP
开闭原则
实现
一个抽象的工厂类,创建一个抽象的类,子类继承抽象工厂类,实现具体的创建对象逻辑
优点
使用类时,直接使用具体的工厂类创建即可使用,同时,没有依赖具体的类,创建时可以没有具体的类
缺点
每增加一个具体产品就需要给该产品提供一个具体工厂类,当产品较多时类个数成对增加
抽象工厂模式
原则
依赖倒置
实现
一个产品集工厂抽象类,用于生产每个小的产品抽象类,每个小的产品通常是一个工厂方法,多个小的产品,利用组合造出最终产品
优点
可以快速扩展不同生产产品集的工厂
缺点
只能作用其中子实现不会变得场景,当子集经常变化时,抽象工厂就必须改变每个工厂的实现
适配器模式
原则
最少知识原则,不和内部交谈
实现
一个目标接口一个适配器实现目标接口,同时组合进一个源接口,将源接口行为转换为目标接口的样子
优点
使原本不兼容的接口可以兼容,又不改变原有的类
缺点
无法使用多重继承实现类适配器
不太容易置换掉待适配类的方法
模板模式
原则
好莱坞原则,别调用我们,我们会调用你,上层接口调用下层接口
开闭原则
实现
一个算法抽象类定义算法框架,定义几个需要子类实现的抽象方法,子类实现抽象方法
优点
算法的实现有一个统一收口,算法更改时更简单
变化的部分放到子类,提高扩展性
缺点
每个具体实现都要一个类,子类的个数可能较多
对应猎豹代码位置
com.orangecy.template.AbstractCooking
命令模式
原则
让命令发送者和命令接收者完全解耦
实现
子主题 1
优点
降低了耦合度
如果说新增命令不会影响之前的已经存在的发送者和接受者以及命令之间的协同
缺点
你会发现,如果关系比较简单的话 其实会增加很多冗余的类,毕竟多了一层命令的概念,可能需要定义大量的命令类
对应猎豹代码位置
com.orangecy.command.TransmitTeaCommand
迭代器模式
原则
类应该只有一个改变的理由
实现
一个迭代器接口,定义了是否遍历完,取下一个元素的方法,为一个集合提供迭代器实现,需要遍历元素时,获取迭代器即可,不需要知道集合具体实现
优点
遍历时无需知道集合集合具体实现,封装了内部实现。将类的其他控制与类的遍历分开,保持类的srp 单一职责原则
缺点
增加新的聚合类就需要增加对应的迭代器,一定程度增加了系统复杂度
对应猎豹代码位置
com.orangecy.iterator.LbFensIterator
组合模式
原则
实现
将类和它的聚合类实现同一个接口,接口中分别包含两个类的方法,客户端看起来一致。展示树形结构,叶子节点和非叶子节点用同一个接口表示
优点
简化了客户端的复杂度,在客户端看来是一致的接口
缺点
组合中,有些方法对于某些节点是无效的,可能造成不易理解,有时候需要折衷考虑是维持透明度还是牺牲透明度增加可理解性
对应猎豹代码位置
com.orangecy.composite.MenuComponent
设计模式原则
单一职责
SRP
每个class/method/service/pod只负责一个职责
对应猎豹代码位置
com.orangecy.principle.srp.LbAction
接口隔离
ISP
一个类对另外一个类的依赖性应当是建立在最小的接口上的。
对应猎豹代码位置
com.orangecy.principle.isp.BoyLbFens
里氏替换
LSP
一个class/module对另一个class/module的依赖应该建立在最小的接口上,依赖倒置,高层模块不应依赖低层模块,细节不应该依赖抽象
子类应该做到替换父类,以及子类尽量减少重写父类的方法
六边形架构
对应猎豹代码位置
com.orangecy.principle.lsp.FensDiscount
迪米特法则
LOD
最少知道原则,简单理解就是一个对象对其他对象最少知道,可以理解城府比较深
对应猎豹代码位置
com.orangecy.principle.lod.LowerCoder
合成复用
CRP
一个类使用另一个类的代码、方法,尽量使用合成、而不是继承
对应猎豹代码位置
com.orangecy.principle.crp.DbDriverEngine
开闭原则
OCP
封装,修改
对应猎豹代码位置
com.orangecy.principle.ocp.LbFens
5 应届校招必考范围
计算机网络
路由选择
RIP
OSPF
UDP协议
TCP协议
三次握手
四次挥手
time_wait状态是什么
HTTP协议
常见的code码含义:500 502 400 404 200 301
http请求包括哪几部分,比如header
http总共有哪几种协议版本,1.0和1.1的区别
post请求的body体有数据大小限制吗
GET,POST,PUT,DELETE,OPTION,PATCH中哪几种是幂等
IP协议
IP地址与物理地址如何相互转化?路由表?为什么不直接使用物理地址来标识一台计算机呢
ARP & RARP协议
DNS实现原理
差错校验算法
CRC
操作系统
进程调度算法
进程间通信
生产者消费者问题
死锁
内存
缓存
Linux基础操作
常见的linux命令:ls top jps jstack jmap tcpdump
复杂参数命令的提问:shell、awk等
文件系统
描述下线程和进程的区别
编程语言特性
C语言
一个打印“Hello World”的程序,从磁盘到最终结果输出,经历了哪些过程。
考察递归程序编写
设计一个防止内存泄漏的方案
手写一个字符串相关的(strcopy)系统函数
C++语言
一个打印“Hello World”的程序,从磁盘到最终结果输出,经历了哪些过程。
Java语言
一个打印“Hello World”的程序,从磁盘到最终结果输出,经历了哪些过程。
值传递特性
基本数据类型--有符号
String的不可变特性原因
方法签名
qa的返回值为什么不能做为签名的一部分,举个例子说明
Java多态是如何实现的
Object类中的基本方法
Java集合框架
抽象类和接口的对比
泛型
注解
异常框架
线程&线程池
JVM基础知识
脚本语言
正则表达式
数据库
范式, 反范式
描述第一范式、第二范式、第三范式内容
ACID, CAP
事务
事务隔离
分布式事务
索引
索引哪些数据结构
B+树 B树 区别
B+树 和 hash索引的优劣
sql编写能力
分页
子查询
join
统计
sql调优经验
基本类型(如int)表示的范围,基础类型int对应java中的类型
分层结构、mvcc等概念
数据结构&算法
排序算法 快排/冒泡/归并/堆排
树 二叉树/B树/B+树/红黑树
队列/栈/堆
进阶
kmp
动态规划
贪心算法
图论
双指针、滑动窗口
一致性hash
位图
Java
集合
集合框架的接口层次图描述或画一下
ArrayList和LinkedList区别描述一下
多线程对ArrayList和LinkedList做增删改查,程序里可能会有什么后果
HashMap底层怎么实现的
HashMap初始默认值是什么
HashMap的rehash过程描述一下
rehash过程中,如果多个线程来操作hashmap可能会有哪些后果
HashMap被多线程操作出现死循环时,服务器CPU有什么现象
JDK1.8后 HashMap什么时候会转成红黑树
什么是红黑树,有什么优点和缺点
JDK1.8后 HashMap有什么改进
JDK1.8后 HashMap什么时候变为链表
Map接口的实现中,哪些实现key可以放null,哪些实现value可以放null
类加载
双亲委派模型是如何工作的
双亲委派有什么好处,为什么是双亲而不是单亲
你见过不遵循双亲委派模型的类加载实现吗
一个class文件被不同的classloader加载到内存实例化,它们是同一个对象吗
GC
描述下JDK1.8前后的堆分代模型
为什么要分代,分代有什么好处
一个对象如何在堆中流转
描述下几种GC的几种回收算法
young区会有STW吗?为什么
stw对应用什么有什么不好的影响
你的java应用中,一般怎么选择GC搜集器
描述下CMS和G1的区别
线上问题处理经验
线上OOM怎么解决
线上服务不可用怎么处理
线上CPU100%呢
java中,一般哪些地方容易出现内存泄露
线程
描述下java线程状态机
sleep()会使线程进入什么状态
实现线程的方式有哪几种
常用线程池有哪些,有什么异同
描述一下syncronized的工作原理,为什么是可重入的
描述下reentrantlock工作原理
内存
volatile有什么作用
volatile如何实现内存可见性
Spring
IOC
IOC作用
IOC底层使用什么数据结构实现的
AOP
AOP作用
AOP和面向对象区别和联系
AOP如何实现的
描述一下动态代理和静态代理的区别
动态代理有哪些实现方式
JDK代理和Cglib动态代理有啥特点,应用场景区别
JDK和Cglib具体如何实现
Bean的scope
Spring的bean有哪些scope
生命周期短的bean能被生命周期长的bean引用吗
如果能,需要怎么做
如果不能,为什吗
开放式题
设计类
一个电商购物系统,访问量每天呈指数级增长,你可以做哪些事情来满足这种流量快速增长的业务。
一个web系统,一直正常服务,突然有一天这个系统变得不可访问,你觉得可能是什么问题导致的。
有两个系统A和B,A系统会产生交易数据,每秒钟会生成1万条交易数据,B系统负责处理A系统的交易数据,每秒钟能接收5千条交易数据。那么如何设计才能让A系统与B系统配合顺利完成任务。
你怎样重新改进和设计一个ATM银行自动取款机?
如果你不得不重新学习一种新的计算机语言,你打算怎样着手来开始?
你有四个装药丸的罐子,每个药丸都有一定的重量,被污染的药丸是没被污染的药丸的重量+1。只称量一次,如何判断哪个罐子的药被污染了?
给你一款新研制的手机,如果你是测试组的组长,你会如何测试?
门外三个开关分别对应室内三盏灯,线路良好,在门外控制开关时候不能看到室内灯的情况,现在只允许进门一次,确定开关和灯的对应关系。(这个问题比较老)
营业员小姐由于工作失误,将2万元的笔记本电脑以1.2万元错卖给李先生,王小姐的经理怎么写信给李先生试图将钱要回来?
设计一个高效的分布式爬虫系统来抓取互联网上关于汽车相关的内容
有个集群服务, 设计一个系统,保证每分钟最多处理100个请求.
解释什么是流, 以及如何实现一个流
"喜欢这个的人也喜欢...",如何在一个电子商务商店里实现这种功能?
如何在一个不可靠的协议之上构建一个可靠的通信协议?
如果解决分片数据库热点倾斜问题?
设计一个缓存系统, 要求1T的容量, 高性能, 高可用, 容灾能力强, 自动灰度快.
解答类
代码中的注释有什么用?
什么情况下缓存是没用的,甚至是危险的?
横向扩展(scale out) vs 纵向扩展(scale up): 有什么区别?分别在什么场景下使用?
什么场景下你会在两个系统中采用异步通信机制?
什么是好的代码?
加分题
Redis
MQ
dubbo
apollo diamond
hbase
ES
8 加入社区
v : lyfinal
1 JavaSE技术总结
第一章 初识Java
理论题
1 学习编程的目的?
答
让生活更精彩
2 学习编程最快的办法?
答
系统培训
掌握学习体系
3 职业规划?
答
全站工程师
4 一个技术点怎样才算学会?
答
能灵活运用
能随时想起
能随问随答
5 Java有什么核心优势让其流行?
答
跨平台
6 Java的三个版本?
答
SE
ME
EE
7 Java是哪个公司发明的?
答
SUN
8 Java的跨平台是通过什么实现的?
答
客户端安装虚拟机
一次编译生成的class字节码文件,不同系统安装的Java虚拟机都能运行
9 Java语言是解释型还是编译型?还是两者都是?
答
编译型
Java源代码文件需要通过编译器编译成Class文件才能被虚拟机执行
10 JDK、JRE、JVM的全称是?
答
JDK
Java Devlement Kit
Java开发工具包
单词解释
Develement
发展
Kit
配套元件
JRE
Java Runtime Environment
Java运行环境
单词解释
Runtime
运行时间
Environment
环境
JVM
Java Virtual Machine
Java虚拟机
单词解释
Virtual
虚拟
Machine
机器
11 JDK包含JRE对吗?
答
对
安装了JDK的目录下有jre运行环境文件夹
12 DOS下,自动补齐的命令按键?
答
Tab键
13 DOS下,DIR命令含义?CD含义?
答
DIR
显示当前目录
CD
进入目录
比如
CD [当前目录下的文件夹名称]
14 为什么采用JAVA_HOME的方式配置环境变量比较好?
答
如果重新更换了JDK版本,则只需要修改JAVA_HOME的值为新的JDK地址就可以
15 public class 的类名必须跟文件名保持一致吗?
答
是
一个Java源文件中有且只有一个被public关键字修饰的class
16 一个Java源文件可以写多个Class吗?编译后是否会生成多个Class字节码?
答
可以写多个class
编译后会生成对应个数的class字节码文件
需要注意的是源文件中只能有一个类被public关键字声明,并且这个类的名称必须和Java源文件名称一致
当一个Java源文件中有多个class类的时候,所有导包操作必须写在源文件开头
17 编程为什么需要注释?
答
方便自己和他人缕清思路
更方便修改
这是程序员最基本的素养
当别人接收我们的项目的时候才不会两眼一抹黑,什么都看不懂
注释不会影响程序的编译和执行
18 Java中的注释类型?
答
分为三种
单行注释
多行注释
文档注释
19 多行注释能嵌套执行吗?
答
不可以
第二章 数据类型和运算符
理论题
1 常用的进制?
答
十进制
0-9
八进制
0-8
二进制
0-1
十六进制
0-9 A-F
2 将10进制转换成2进制
答
将要转换的10进制数除以2得到余数,直到余数为0,将得到的所有余数倒序排列即为二进制数
3 位、字节、字符的概念及其计数范围?
答
位
计算机中最小的计数单位
字节
一个字节为8位
字符
字节的组合
一个英文字符占2个字节
一个中文字符占4个字节
4 标识符的作用?
答
给左侧数据类型命名
1 类
2 对象
3 方法
4 变量
5 接口
6 自定义数据类型
5 这个标识符合法吗?:int aaa@bbb = 33;
答
不合法
理由
变量名称中包含特殊字符@
变量命名只支持大小写英文字母、阿拉伯数字、下划线、美元符
6 标识符能用汉字开头吗?为什么?
答
不能
理由
变量不能使用汉字
7 Java中有没有goto语句?有没有goto关键字?
答
没有goto语句
有goto关键字
但是JVM虚拟机并不对该关键字进行开放使用
仅仅作为保留的关键字
8 byte,short,int,long类型,分别占用的字节数?
答
byte
1
short
2
int
4
long
8
9 整型常数默认的类型?
答
int
10 float,double分别占用的字节数?
答
float
4
double
8
11 科学计数法表示3.14?
答
314 * 10^-2
12 左侧哪些写法是不对的?
byte b = 30;
byte c = 500;
错误
byte占用一个字节
long d = 2343223;
float f = 3.14;
13 浮点数能用于比较吗?
答
不能
计算机对浮点数值不能准确表示,有误差
14 左侧图片输出哪句话?
图片【2017-04-07_113844】
答
d1 == d2
15 字符型占用字节数?
答
1
16 这种写法对吗?: char c = 'd';
答
不对
编译错误
incompatible types
类型转换错误
17 布尔型变量占用空间是一位还是一个字节?
答
1位
原因
布尔型只存储0或1
18 这种写法好吗?:if(b == true)
答
不好
理由
当b为整数类型
不需要==true
当b为布尔类型
不需要==true
以上两种情况写==true都不会有问题,但多此一举
19 声明常量的关键字?
答
final
不可改变
比如
final int A = 10;
final float PI = 3.1415926F;
常量使用大写
20 常量命名规范?
答
全部大写
21 什么是驼峰原则?
答
变量名称开头大写,余下部分首字母大写
比如
int AppleNumber = 150;
String FactoryAddress = '西三旗';
22 使用Scanner接收键盘输入,一定要加 import java.util.*; ?
答
要
理由
Java默认导入java.lang.*;
Java不默认导入java.util.*;
23 类名的命名规则?
答
驼峰原则
所有单词首字母都大写
24 方法名、变量名的命名规则一致吗?
答
不一致
理由
方法名
开头小写,余下全部单词首字母大写
变量名
全部小写
25 常量的命名规则?
答
全部大写
使用final关键字修饰
26 引用类型占用的字节数?
答
4个字节
知识普及
引用类型指的是保存在栈中地址的值
27 什么是算术运算符的类型提升?
答
参考【http://www.blogjava.net/hyperjava/articles/241839.html】
28 a+b返回什么类型?:int a = 3; long b = 3;
答
long
测试代码
Object c = a + b;
System.out.println(c.getClass());
29 i++和++i的相同和不同之处?
答
分两种情况
单独作为一条语句的时候
没有任何区别
用在算术运算中时
i++
先自增后运算
++i
先运算后自增
30 关系运算符中,能这样写吗?:'1<a<3'
答
不能
理由
Java不支持这种运算
31 逻辑运算符|、&、!、^的含义和运算规则?
答
|
中文
逻辑或
规则
当左右两边的操作数有一个为真,则结果为真,否则结果为假
System.out.println(true & true);
true
System.out.println(true & false);
true
System.out.println(false & true);
true
System.out.println(false & false);
false
&
中文
逻辑与
规则
当左右两边的操作数都为真时结果为真,否则为假
System.out.println(true & true);
true
System.out.println(true & false);
false
System.out.println(false & true);
false
System.out.println(false & false);
false
!
中文
逻辑非
规则
取反操作(单目运算)
System.out.println( ! true);
false
System.out.println( ! false);
true
^
中文
逻辑异或
规则
只要两个操作数(逻辑值)不相同,则结果为真,否则为假
System.out.println(true & true);
false
System.out.println(true & false);
true
System.out.println(false & true);
true
System.out.println(false & false);
false
32 运算符||和|的异同?
答
相同
都是比较运算符,返回的结果是一样的
不同
|
两边都要比较一次
||
如果左边的为true,则继续比较右边的,然后返回比较结果
如果左边的为false,则直接返回false
相比 | 要效率高
33 5*4最快的运算方式?
答
5<<2
34 左侧两个表达式分别返回什么结果?
((1<3)?'a':'b') + 3 + 4;
答
b34
x = -2; x>0?1:(x==0?0:-1);
答
-1
35 什么情况下加号会变成字符串连接符?
答
当加号两边其中一边出现字符串的时候就成了字符串连接符
比如
System.out.println('1' + 2);
12
System.out.println(1 + '2');
12
36 左侧的两个结果分别是多少?
4&5;
答
4
4|5;
答
5
37 4&&5 的操作对吗?为什么?
答
不对
理由
&&为短路与运算符,要求两边的值必须为逻辑值
38 int能否自动转换成byte,short,char?是否有一定条件才能转换?
答
当一定条件下能
能的条件
int转换成byte
int 的值范围不能大于byte的取值范围
int转换成short
int的值范围不能大于short的取值范围
int转换成char
int的值范围不能大于ASCII码表的最大值
int的值不能是负数
39 long能自动转换成int吗?long能自动转换成float吗?
答
long不可以自动转换成int
需要强制转换
long不能自动转换成float
40 自动类型转换中,容量小和容量大指的是?
答
指的是自动类型转换时两边操作数的取值范围
41 强制类型转换中,可能发生数据丢失吗?
答
会发生数据丢失
42 左侧两种写法中你感觉哪种比较好?
70L * 60 * 24 * 365 * 70 * 20;
好
理由
提前转换成容量大的类型,可以避免数据溢出
70 * 60 * 24 * 365 * 70 * 20L;
不好
第三章 控制语句
理论题
1 三种控制结构分别是?
答
顺序
条件
循环
2 如果if语句后面不写{},if的控制范围是否只限于第一句?
答
是
好的习惯是写上{},不论语句有多少
3 Math.random()是什么意思?如果想获得15-20之间的随机整数该怎么写?
答
Math.random()是获取0-1之间的随机浮点数(小数)
(int)(Math.random()*15 + 5)
4 Switch语句的功能是否完全可以使用if else if else 多选择结构来代替?如果可以,为什么还需要switch呢?
答
可以
switch比if else if书写简单
switch比if else if效率高
5 switch中的表达式的结果需要什么类型?
答
switch中支持的表达式的类型
byte
short
int
char
返回的结果为与之匹配的等值类型
6 switch语句中,一个case开始执行后,什么时候结束执行这个case的语句?
答
当遇到break语句的时候
7 switch语句中,default是否必须写?
答
不是必须写的,习惯上写上
8 代码有什么错误?
图片【2017-04-07_144707】
答
两个case语句后面使用的是分号不是冒号
case 'y';没有break
9 循环结构模拟了现实世界中的什么逻辑?
答
需要重复执行次数的事
10 循环结构的四种内部结构是什么?
答
for
while
先判断后执行
do-while
先执行一次后判断
需要注意的是while(); 后面要有分号
还有一种不知道了
11 while和do while有什么区别?
答
while
先判断条件是否满足,满足就执行
do-while
先执行一遍再进行判断条件是否满足,如果满足就继续执行,直到条件不满足则退出
12 什么情况下会出现死循环?写出个例子
答
当循环条件一直满足的时候
例子
while(true){......};
13 for循环相比while循环有什么优势?
答
for循环可以指定需要循环的次数
14 代码都有什么问题?
图片【2017-04-07_145356】
答
while()后面没有分号
15 该代码有错误吗?请指出错误
图片【2017-04-07_145541】
答
最后输出的 i 找不到,因为 i 存在于for代码块中,出了for就不存在了
16 循环中,break的作用是?continue的作用是?
答
break作用是跳出当前break所处的最近的循环语句
continue是跳出本次循环
17 语句块能否使用外部的变量?语句块中定义的变量,外部能否使用?
答
语句块可以使用外部变量
语句块中定义的变量通常情况下不可以被外部使用
18 方法的定义中,是否必须要有返回值类型?如果确实不需要返回值,使用哪个关键字声明?
答
不是必须要返回值类型
可以使用void关键字声明空的返回值类型
19 方法的定义中,return是否必须?它有什么作用?
答
当方法有返回值的时候
return为必须要的,而且返回值类型需要和方法定义的返回值类型一致
当方法没有返回值的时候
return不是必须的,但是默认会有return,表示结束当前的方法
作用
结束当前方法
20 Java中,参数的传递使用值传递还是引用传递?
答
如果是基本数据类型
使用值传递
传递栈中的值
如果是引用数据类型
使用引用传递
传递栈中的引用值(地址)
21 方法定义中,形式参数和实际参数有什么区别?用自己的话描述
答
区别
形参只有在被调用时才会被Java虚拟机分配内存空间,形参只有在方法内部有效。方法调用结束返回主调用方法后则不能再使用该形参变量。
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。
22 方法定义时,使用实参还是形参?
答
方法定义的时候使用形参
23 定义形参时,必须要写变量类型吗?
答
是
24 实参类型是否必须和形参类型匹配?
答
必须匹配
25 什么是方法的重载?
答
重载的前提条件
同一个类中
方法名相同
形参类型不同
比如
public void print(int a){}
public void print(String a){}
形参个数不同
比如
public void print(int a){}
public void print(int a, int b){}
形参类型且顺序不同
比如
public void print(int a, String b){}
public void print(String b, int a){}
26 返回值不同构成重载吗?
答
同一个类中,返回值不同不构成重载
27 形参名称不同构成重载吗?
答
当方法名称相同、形参类型和形参个数相同的条件下,形参名称不同不构成重载
28 递归算法中,递归头和递归体分别指什么?
答
递归头
什么时候不调用自己
递归体
什么时候调用自己
29 递归算法的优点是什么?缺点是什么?
答
优点
思路和代码简单
缺点
占用内存多,效率低下
30 递归的适用场合?
答
一个问题可以分为若干个简单的子问题
子问题的解决方案和上层问题的解方案一致
外层问题的解决依赖于子问题的解决
第四章 数组
理论题
1 数组的类型可以是任意类型吗?
答
可以
2 数组中的元素的类型必须是相同的吗?数组中的元素是有序的吗?
答
必须相同
元素有序
下标确定数组元素的位置
3 数组的长度可变吗?
答
不可变
4 获取数组的长度使用哪个属性?
答
length
5 数组元素下标(索引)的范围是?
零到数组长度减一
6 数组也是引用类型吗?
答
是
7 数组也是对象吗?
答
是
8 数组中的元素就像对象中的成员变量一样,初始化方式也一样,这句话对吗?
答
对
9 数组的静态初始化代码,该代码有没有不合理的地方?
图片【2017-04-07_151312】
10 左侧的数组定义,哪些是正确的?
int a[][] = new int[3,3];
false
int a[3][3] = new int[][];
false
int a[][] = new int[3][3];
true
int []a[] = new int[3][3];
true
int[][] a = new int[3][3];
true
11 请在左侧数组定义中找出正确的
int[][] a2 = new int[2][];
int [][] arr2 = new int [][4];
int arr3[][4] = new int [3][4];
12 描述冒泡排序的基本思路
答
1 循环数组长度
2 当前数和后一个数比较
3 如果前一个数大于后一个数,则交换
13 可变参数的作用和用法是什么?
答
14 如何给main方法传递实参?
答
在控制台中输入
java Test arg1 arg2 ...
15 Eclipse可以开发Java,可以开发C++吗?
答
可以开发Java
开发C++需要继承CDT插件
16 Eclipse中的debug模式有什么好处?
答
可以看到程序运行的步骤
可以查看变量变化的值
17 Eclipse中运行一个Java程序,如何操作?
答
创建一个项目
创建一个包
创建一个类
在类中写代码
运行这个类
18 Eclipse需要安装吗?使用Eclipse需要安装JDK吗?
答
不用安装Eclipse,直接解压使用
有的版本默认集成JDK,但是集成的JDK版本比较低
一般建议安装JDK
第五章 面向对象
第六章 异常机制
理论题
1 Java中,处理异常的两大步是?
答
捕获
处理
2 如果catch两个异常,一个是父类,一个是子类。这两个异常的catch顺序如何确定?
答
子类在前面,父类在后面
3 finally里面一般放置什么代码?
答
存放异常发生后必须要进行执行的操作
比如
复制文件的时候,IO流出现异常则必须要进行关闭
4 Error和Exception的区别和联系分别是什么?
答
联系
都是异常
区别
Error
严重的错误,导致无法运行或者编译失败
Exception
程序运行中产生的异常
可以在程序运行过程中捕获和处理
程序可以继续运行
5 Throwable是一个类还是接口?
答
是一个类
6 如果碰到NullPointException,我们一般应该如何差错?如何做处理?
答
使用输出语句进行调试,查看程序运行到哪里了
查看我们定义的变量是否是正确赋值
处理方式
使用try-catch对语句进行捕获
7 方法重写时,子类声明异常能否超出父类的范围?
答
不能
第七章 常用类
理论题
1 为什么需要包装类?包装类的作用是什么?
答
需要包装类的理由
基本类型之间不好转换
包装类的作用
方便基本类型之间的转换
简化程序员的代码工作量
2 将字符串“123”转化成基本类型数字的方式有哪些?
答
第一种
int num = Integer.parsInt('123');
其他方式
略
3 自动装箱和自动拆箱指的是什么?举例说明
答
略
4 为什么String类被称为不可变字符序列?从String类的源代码分析,给出解释
答
String类型的值存放在常量池中,如果一个String变量需要进行添加方法,那么JVM虚拟机执行的时候是先将第一个值复制一份并添加第二份新的字符串,然后将组合之后的字符串重新开辟一块空间,然后再将引用赋值给当前的String类型变量,但是一开始的String类型变量的值依然存在于常量池中,只是还没有被垃圾回收期回收而已
5 String类的trim()方法是什么作用?
答
补充知识
trim()方法中支持参数
1
去除首部空格
2
去除尾部空格
3
去除收尾空格
默认
6 左侧代码的返回结果是什么?
'hamburger'.substring(4, 8);
答
urge
7 StringBuffer和StringBuilder的联系是什么?区别是什么?
补充知识
什么是StringBuilder
百度
什么是StringBuffer
百度
联系
都是对字符串操作的类
区别
StringBuilder是对StringBuffer的简单增强
StringBuffer比StringBuffer先有
StringBuffer是线程不安全的
StringBuilder是线程安全的
8 计算机中的时间是如何表示的?
答
Sub Topic 1
9 左侧代码表示的是什么意思?
System.currentTimeMillis();
答
获取从1700年到现在的毫秒数
10 Date d = new Date()表示的是当前时间吗?
答
不是
只是定义了一个时间对象而已
11 File类能代表一个目录吗?
答
不能
12 File类的方法mkdir跟mkdirs,有什么区别?
答
区别
mkdir
目录必须存在
比如
在C盘的Java目录下创建一个新的文件夹
那么这个C盘下的Java目录必须存在
mkdirs
目录可以不存在
比如
在C盘的Java目录下创建一个新的文件夹
那么这个C盘下的Java目录可以不存在,创建的时候会一并创建Java文件夹
13 什么时候使用枚举?枚举的定义是?
答
补充知识
枚举
英文名称
enumeration
JDK 1.5中引入的特性
位于java.lang包中
详情参考博客【http://www.cnblogs.com/hyl8218/p/5088287.html】
上机题
1 String类的equals方法跟Object的equals方法什么关系?详细分析它的内部流程
2 分析该代码的结果,并画出内存结构图,针对每个打印的结果给出文字解释
图片【2017-04-07_170341】
3 练习String类的常用方法
4 该代码会造成什么后果?运行期间会产生多少个对象?使用StringBuilder修改这段代码
图片【2017-04-07_170626】
5 我们使用SimpleDateFormat类来实现时间跟字符串的转化。常用的是哪两个方法?写出代码进行说明
6 将1990年3月3日通过Calendar来表示,并得到这天是该年的第一天?将该日期增加35天,是哪一天?用代码说明
7 写代码测试Date/SimpleDateFormat/Calendar的用法
8 制作可视化的一个日历程序
9 使用File类模拟实现DOS的dir和dir/s命令
10 使用递归算法,完整展示一个目录树
11 手动定义一个枚举,表示十二个月的英文月份
12 switch语句中的表达式可以是枚举吗?写一个例子进行说明
第八章 容器
理论题
1 容器指的是“可以容纳其他对象的对象”,这种说法对吗?
答
对
2 Collection/Set/List的联系跟区别?
答
补充知识
容器
结构
Collection
List
LinkedList
链表结构
优势
删除和添加的效率很高
缺点
随机访问元素时效率比ArrayList低
ArrayList
线性结构
Vector
Stack
Set
HashSet
TreeSet
Map
Hashtable
HashMap
WeakHashMap
Iterator
ListIterator
联系
区别
3 Set和List的特点跟区别?
4 使用哪个方法获取容器中元素的交集?
5 说明isEmpty的作用,左侧的代码有问题吗?
Collection c = null; System.out.println(c.isEmpty());
6 List接口中增加了一些与顺序相关的操作方法,左侧两个方法的作用是什么?
add(int index, E element);
get(int index);
7 ArrayList底层使用什么来实现的?LinkedList是用什么实现的?
8 说出ArrayList、LinkedList、Vector的区别
9 有一些数据,需要频繁的查询,插入和删除操作非常少,并且没有线程之间的共享,使用List下面的哪个实现类好一些?
10 定义Computer类,使用价格排序。(使用Comparable接口)
11 如果equals返回true,hashcode一定相等吗?
12 HashSet和TreeSet的区别
13 使用HashSet存储自定义对象,为什么需要重写hashCode()和equals()?
14 使用TreeSet存储多个学生数据,如何实现按照不同属性值进行排序?
15 Map中,key能否重复?如果重复,会有什么现象?
16 Set和Map的集合类名称相似,有没有内在的联系?
17 使用泛型有什么好处?
18 采用增强for循环遍历List或者Set,如果List或者Set没有加泛型,能遍历吗?
19 如果我想在遍历时删除元素,采用哪种遍历方式最好?
20 Iterator是一个接口还是类?
21 Collection和Collections有什么区别?
22 资源文件有什么作用?
23 描述Vector和ArrayList的区别和联系?
24 描述Hashtable和HashMap的区别和联系?
25 Java主要容器的选择依据和应用场合?
上机题
1 练习Collection接口中常用的方法
3 定义一个数组,该数组既可以放:Dog对象、也可以放Cat对象、还可以放Integer对象,怎么定义?写出测试代码
4 针对List中新增的有关顺序的方法,每个都进行测试。并且使用debug来帮助我们理解程序运行
5 综合使用List,Map容器存放左侧数据,并从map中取出'李四'
姓名:张三 年龄:18 体重:90 地址:北京
姓名:李四 年龄:28 体重:50 地址:上海
注意:不能使用JavaBean封装
6 使用JavaBean封装上述题目
7 写出List、Set、Map中使用泛型的例子
8 用代码写出遍历List的四种方式
9 用代码写出遍历Set的两种方式
10 用代码写出遍历Map的方式
11 在src下建立一个资源文件(不包含中文),尝试使用Property类读取里面的属性
12 使用entrySet方法遍历Map
第九章 IO流技术
理论题
1 IO是什么意思?data source是什么意思?
2 字节流和字符流有什么区别?输入流和输出流有什么区别?
3 节点流和处理流有什么区别?
4 word文档能使用字符流操作吗?为什么?
5 解释该代码的含义
图片【2017-04-07_183924】
6 流对象使用完后,一般要调用close方法关闭,释放资源,为什么呢?
7 InputStream和OutputStream的基本特点是什么?
8 Reader和Writer的基本特点是什么?
9 FileInputStream和OutputStream的基本作用是什么?
10 FileReader和FileWriter的作用是?
11 BufferInputStream和BufferedOutputStream的特点是什么?
12 InputStreamReader和OutputStreamWriter的作用是什么?
13 PrintStream打印流经常用于什么情况?System.out是不是打印流?
14 DataInputStram和DataOutputStream的特点是?
15 中文乱码是怎么造成的?
16 Unicode字符集是几个字节表示一个字符?为什么需要utf-8?
17 序列化和反序列化指的是什么?
18 想序列化某个类的对象,该类必须实现Serializable接口吗?
19 说说Serializable接口的特点?
20 transient的作用是什么?
第十章 多线程
理论题
1 程序、进程、线程的区别是什么?举例说明
2 Thread类有没有实现Runnable接口?
3 当调用一个线程对象的start方法后,线程马上进入运行状态吗?
4 该代码中,实际上有几个线程在运行?
5 sleep、yield、join方法的区别是什么?
6 为什么不推荐使用stop和destory方法来结束线程的运行?
7 A线程的优先级是10,B线程的优先级是1,那么当CPU进行调度的时候一定会先调用A吗?
8 synchronized修饰在方法前是什么意思?
9 synchronized修饰的语句块,是表示该代码块运行时必须获得account对象的锁,如果没有获得,会有什么情况发生?
10 死锁是怎么造成的?
11 wait方法被调用时,所在线程是否会释放锁持有的锁资源?sleep方法呢?
12 wait、notify、notifyAll是在Object类中定义的方法吗?作用分别是什么?
13 notify是唤醒所在对象wait pool中的第一个线程吗?
第十一章 网络编程
理论题
1 什么是计算机网络?网络的主要类型有哪些?
2 常见的网络分层模型有哪两个?哪个更流行?为什么?
3 TCP的全称是?
4 UDP的全称是?
5 请说出TCP和UDP的联系和区别?
6 通过类比打电话,详细描述三次握手机制
7 IP的全称是?IP的作用?
8 IPV4为什么会发生资源枯竭的问题?
9 为什么需要端口?端口真是存在还是虚拟的概念?
10 Java中,端口使用两个字节表示,可以表示多少个端口?UDP和TCP端口是各自独立的吗?
11 InetAddress和InetSocketAddress都封装了哪些信息?他们两的区别是?
12 URL类有什么作用?
13 查资料了解,SNS是什么?
14 如何理解Socket的含义?
15 基于TCP的Socket网络编程的主要步骤是什么?
16 基于UDP的Socket网络编程的主要步骤是什么?
第十二章 其他部分
1 内部类
理论题
1 方法内部能不能定义类?
2 说明定义内部类的方式,并说明适用于什么情况
3 普通成员内部类能不能直接访问外部类的普通成员?
4 静态成员内部类能不能直接访问外部类的普通成员?能不能访问外部类的静态成员?
5 什么时候会使用匿名内部类?
2 线程池
理论题
1 什么是线程池?
2 线程池的好处有哪些?
3 如何创建一个线程池?常用输入参数的含义?
4 分析线程池的主要工作流程?
5 如何监控线程池?
上机题
1 完成一个简单的自定义的线程池,对线程池底层原理更加熟悉
2 写一个线程池的调用代码
3 设计模式
理论题
1 什么是设计模式?
2 设计模式的优点?
3 23种经典的设计模式有哪些?如何分类呢?
4 面向对象的设计原则有哪些?
5 开闭原则的含义和实现?
6 依赖导致原则的含义和实现?
7 结合JavaIO流体系说明装饰模式
8 结合InputStreamReader类说明适配器模式
9 选择一个你熟悉的设计模式进行介绍?
第十三章 反射技术
理论题
1 什么情况下需要使用反射?
2 Class类的作用及其主要功能?
3 如何使用反射创建一个对象?
4 如何使用反射操作属性?
5 如何使用反射执行方法?
6 反射的优点和缺点分别是什么?
第十四章 正则表达式
理论题
1 正则表达式是用来做什么的?用自己的话进行描述
2 说出左侧规则的含义
\d
\w
\s
[1234]
[^a-f]
{}
?
+
*
\b
3 分别说出在单行模式和多行模式中左侧代码的含义
^ab
ab$
4 贪婪模式和非贪婪模式的区别?
5 如何使用贪婪模式?
6 如何使用非贪婪模式?
7 左侧代码分别表示什么意思?
\D
\d
8 说明反向引用是什么意思?
9 说明预搜索的含义?用自己的话进行描述
10 说出group(),group(1),group(2)的区别?
2 JavaWeb了解技术
14 Servlet技术
理论题
1 HTTP全称是什么?
2 HTTP有什么作用?
3 HTTP协议是无状态的协议,这句话什么意思?
4 HTTP1.1支持连续连接(长连接)吗?怎么连接持续连接?
5 HTTP watcher、 firebug软件的作用是什么?
6 HTTP请求的基本格式是什么?响应的基本格式是什么?举例子说明
7 HTTP请求头中:Connection、refer、content-type、content-length代表什么含义?
8 理解HTTP协议内容,说明get和post方式的区别?
9 说出左侧状态码的含义?
200
404
500
10 B/S和C/S架构各自的优势和劣势是什么?
11 Tomcat下载后,解压就可以使用,如果环境变量没有JAVA_HOME可以吗?
12 WEB项目建立后,会有目录:WEBROOT/WEB-INF,它的核心作用是什么?
13 在src目录下面写的Java程序编译后的class文件会被放到项目什么地方?
15 解释下左侧目录在Tomcat中分别有什么作用?
bin
lib
conf
webapps
work
16 如何手工发布一个web项目到Tomcat服务器上?
17 如何启动Tomcat服务器?如何终止?
17 Servlet只是一个普通的Java类,它继承了什么类就变成了Servlet?
18 Servlet运行在哪里?脱离服务器可以独立运行吗?
19 Servlet类在服务器上通过元素配置后,为什么还需要?
20 一个Servlet可以对应多个URL吗?反过来,一个URL可以对应多个Servlet?
21 客户端发送请求到服务器,服务器再根据web.xml的配置调用相应的Servlet程序,这句话对吗?
22 Servlet程序通过HttpServletResponse对象直接将信息发送到客户端。这句话对吗?为什么呢?
23 一个web.xml可以配置多个Servlet吗?
24 HttpServletRequest对象里面包含了什么信息?该对象是由谁生成的?
25 HttpServletResponse对象里面包含了什么信息?该对象是由谁生成的?
26 左侧的url-pattern配置模式中哪些不对?
/111
/999
/oneoneone
/ttt/*
*.do
/sss/*.cc
27 在Servlet容器中,一个Servlet类只会new一个Servlet对象,这种说法对吗?为什么?
28 关于Servlet加载和初始化的时机问题,左侧的说法对吗?
1 如果使用,则Servlet会在启动时加载
2 如果没有使用,则Servlet会在第一次被访问的时候加载
29 请说明左侧三个方法的调用顺序
1 service
2 doGet
3 doPost
30 左侧405错误是如何出现的?怎么解决?
405 http method post is not supported by this url
31 当服务器收到一个请求时,会new一个新线程来处理该请求,这句话对吗?
32 Servlet中可以随意定义成员变量和随意使用它,对吗?为什么?
33 Tomcat配置文件web.xml中,DefaultServlet的作用是什么?JspServlet的作用是什么?
34 Tomcat服务器启动后,在项目下有一个a.jsp文件,然后客户端访问:a.jsp,那么,客户端是直接访问a.jsp文件还是执行JspServlet?为什么呢?
35 welcome-file-list元素有什么作用?
36 如何清除掉浏览器端的缓存?
37 服务端遇到了修改代码不起作用,如何彻底干净的解决这个问题?
38 HttpServletRequest是一个类还是接口?它的作用是什么?
40 HttpServletRequest中,获取客户端IP的API是?
41 通过getParameter方法可以获得get方式请求的参数?那么能不能获取post方式请求的参数?
42 多个同名不同值得参数(比如:复选框)传递给服务器,服务器端哪个API处理?
43 HttpServletResponse是一个接口还是类?它的作用是什么?
44 左侧代码有什么问题?
resp.setContentType('text/html, charset=utf-8');
45 Request作为作用域属于同一个请求的Servlet之间共享,它的内部机制是什么?
46 request方法中,setAttribute,getAttribute,removeAttribute实质上是内部有一个Map对象来维持映射关系,这句话对吗?
47 “/”的问题,在浏览器发送请求时它代表什么含义?服务器内部跳转时代表什么含义?
48 一次会话指的是什么?
49 会话创建后,立马就创建session对象吗?
50 request.getSession(),调用两次后,返回的Session对象,是同一个对象还是不同的两个对象,为什么?
51 在servlet1中通过session.setAttribute('a', 'aaa')放了a属性,一定能在servlet2中得到吗?详细解释原因?
52 服务器中会有很多个session对象,那么是通过什么确定客户端跟session对象对应的关系的?说明原因
53 调用什么方法可以让session对象使用完之后立马失效?
54 Cookie技术是一种在客户端保存HTTP状态的技术吗?
55 如果没有设置Cookie的Max Age属性,那么这个Cookie会不会写到客户端硬盘上?浏览器重启后,这个Cookie还能不能读取到?
56 读取Cookie,实际上就是直接读取客户端机器上的文本文件,对吗?给出你的理由
57 如何在Servlet中获取相应的ServletConfig对象?
58 获取到ServletConfig对象后,通过该对象只能读取对应的Servlet的配置信息吗?
59 ServletConfig对象中,通过哪个方法获取参数信息?
60 ServletContext如何加载参数?它能不能读取到某个Servlet下面的参数?
61 说出左侧三个作用域的生命周期和作用范围
1 request
2 session
3 servletContext
13 JQuery技术
理论题
1 jQuery与JavaScript有什么联系?jQuery技术有什么特点?
3 jQuery中的元素选择器有哪些?
2 jQuery中的美元符有什么用?
5 使用jQuery操作元素的属性 attr()方法和val()方法有什么区别?
6 文字说明HTML()方法和test()方法的区别
6 文字说明css()方法和addClass()方法的区别
7 列出jQuery操作文档结构的方法
8 jQuery中bind和unbind方法分别有什么作用?
9 jQuery中的one()方法有什么特点?
10 jQuery中的ready()方法和body中的onload方法有什么区别?
12 JavaScript技术
理论题
1 Java跟JavaScript有什么联系?
2 JavaScript是解释型语言还是编译型语言?
3 JavaScript语言是否可以开发服务器程序?
4 node.js是什么?
5 jQuery是什么?
6 标签可以直接执行JS语句和定义JS函数,对吗?
7 标签可以位于文档的任意部分,但是一般都置于中,对吗?
8 JS是一种基于对象和事件驱动的语言,请用文字描述左侧代码的执行过程
分支主题
9 左侧代码中,void(0)起到什么作用?
测试引入外部的JS文件
10 JavaScript的注释跟Java一样吗?
11 说说你对左侧这句话的理解
变量没有类型,数据有类型
12 变量命名声明必须以什么开头?
13 该图的变量哪些是局部变量哪些是全局变量?以及有哪些错误?
图片【2017-04-08_133805】
14 JS中字符串可以使用单引号也可以使用双引号,请将左侧代码使用双引号和单引号的技巧做处理
var d = '';
15 左侧代码有什么问题?如何解决?
var d = '';
16 该图代码会执行alert语句吗?为什么?
图片【2017-04-08_134305】
17 “===”和'=='有什么区别?
18 JS中数组的长度是否随时可变?
19 写出JS中数组定义的两种常见方式?
20 说说数组中左侧方法分别是什么作用?
1 join
2 shift
3 pop
4 push
21 该代码有错吗?
图片【2017-04-08_135116】
22 本图中调用ee函数,最终执行的结果是什么?
图片【2017-04-08_135335】
23 说说左侧内置函数都有什么作用?
1 isNaN
2 escape
3 unescape
3 eval
4 parseInt
5 parseFloat
24 说出左侧事件的作用
1 onload
2 onunload
3 onblue
4 onchange
5 onfocus
6 onkeypress
7 onkeydown
8 onkeyup
9 onmouseover
10 onmousemove
11 oncopy
12 onbeforecopy
25 某个元素的id是aa,那么JavaScript中通过什么方法可以获得该元素对应的对象?
26 Date中getTime方法是什么意思?返回的数字表示什么意思?
27 左侧代码中a能使用String对象的方法吗?
var a = 'aaaabbb';
28 说出左侧对象的作用
1 history
2 navigator
3 location
29 DOM的全称是什么?
30 浏览器是否根据加载的源代码最后生成DOM对象?
31 写出直接获取元素节点的三种方式?
32 如何获取某个元素的父节点?
33 如何获取某个元素的所有子节点?
34 分析该图代码,会不会有问题?
图片【2017-04-08_141814】
35 操作文本域时,defaultValue和value有什么区别?
36 如果已经获得文本域对象,如何获得所在的表单对象?
9 CSS语言
理论题
1 CSS的全称和作用?
2 样式的就近原则?
3 中的样式一定比外部引入文件的优先级高吗?
4 继承原则中,CSS所有的样式都可以被继承吗?
5 盒子模型中的三个主要属性是什么?含义是什么?
6 CSS3里面的透明属性是什么?怎么控制的?
7 CSS3里面响应式布局是如何使用定义的?
8 HTML语言
理论题
1 互联网的三大基石分别是?都有什么作用?
2 HTML元素之间的关系有哪两种?举个例子?
3 HTML中,属性值用双引号、单引号、不加引号都可以,这句话对吗?
4 使用文本编辑器编辑完HTML后,扩展名需要使用哪些?
5 SEO是什么?title/description/keywords属性跟SEO是什么关系?
6 中的内容会在页面上显示吗?说说为什么?
7 标记中alt属性和title属性有什么区别?
8 超链接标签的使用中,可否使用图片作为超链接的子元素?
9 对于超链接标签的使用,如何点击图片跳转到一个链接?
10 什么是锚点?作用是什么?一般什么时候使用?
11 表单的作用是什么?
12 什么是表单?
13 表单的提交方式常用的有哪两种?有什么区别?
14 一个表单域如果没有设定name属性,它的值会不会被提交?
15 一个表单域标签没有什么属性,它的值会不会被提交?
16 单选按钮是分组的,如果name属性不相同,会出现什么情况?
17 做“多选一”可以使用哪些表单域?“多选多”呢?
18 默认选中某个复选框是使用checked还是selected属性?
7 JDBC技术
理论题
1 JDBC的全称?
2 详细说明JDBC技术主要用于处理什么问题?好处是什么?
3 左侧的代码作用是什么,详细解释其底层原理?
Class.forName('oracle.jdbc.driver.OracleDriver');
4 JDBC中执行DML语句时,一般使用左侧哪个方法比较好?说说这几个方法的区别?
1 execute
2 executeQuery
3 executeUpdate
5 请说明JDBC中执行DML语句时的三种方法,并分别简述该方法的使用场景
6 解释左侧三个代码返回值的含义
1 execute
2 executeQuery
3 executeUpdate
7 用文字说明ResultSet处理的典型代码各行的作用
图片【2017-04-08_103405】
8 详细描述JDBC中编程的4大步骤?
9 说说大对象的作用?
10 简述数据库中大对象的类型及其作用?并说明JDBC访问大对象的流程是什么?
上机题
1 SQL注入攻击是怎么回事?使用代码进行说明解释?
2 完成对Oracle数据库的查询操作,将emp表中所有的数据列出
3 完成对Oracle数据库的删除操作,将sal小于1500的记录删除
4 PreparedStatement(预编译SQL语句)有什么优势?
5 写出一段测试PreparedStatement的代码
6 使用代码说明JDBC中事务的管理方式?
7 通过资源文件的方式,将相关数据库信息放入资源文件中,并写出该测试代码?
8 写出JDBC的一段测试批处理的代码
9 写出一段JDBC控制访问存储过程的代码
实战项目
员工信息管理系统
练习目标
1 熟练使用JDBC
2 使用DAO模式实现JDBC常用的CRUD操作
3 使用DRM思想封装JDBC常用的CRUD操作,提取BaseDao
扩展要求
1 自学apache commons中的JDBCUtils组件
3 简历项目涉及框架
20 Spring 框架
理论题
1 什么是容器,我们学过了哪些容器,Spring与我们之前学习的容器有什么异同点?
2 Spring是什么?为什么使用Spring?
3 Spring有哪些特性?
4 Spring的重要特征有哪些?
5 Spring常用的Jar包有哪些?
6 Spring的IOC(控制反转),主要作用是什么?程序中如何体现Spring的控制反转?
7 说说静态工厂方法和动态工厂方法不异同
8 applicationContext.xml中bean标签的各属性分别有何意义?
9 bean的作用域有哪些?各有什么不同?
10 bean的生命周期?
11 Spring两大核心思想是什么?
12 什么是依赖注入?
13 IOC/DI,控制反转/依赖注入,指的都是同一个内容,为什么叫法不一样呢?
14 属性注入方式有哪三种?
15 怎样注入集合,list、set、map分别怎样注入?
16 Spring中什么是自动装配?
17 Spring中怎样实现自动扫描?
18 Spring中基于注解对象,使用哪几个注解?每个注解都有什么作用?
19 @AutoWired默认按照何种方式匹配注入?存在什么问题?
20 @Qualifier有何作用?按照何种方式匹配注入?
21 @Resource按照匹配方式注入?
22 静态代理模式有哪些角色?分别是什么?
23 什么是动态代理?有哪几种方式?
24 静态代理和动态代理的关系是什么?
25 AOP指的是什么?他跟动态代理有什么关系?
26 AOP的好处是什么?
27 什么是横切性关注点?
28 解释下右侧的名词
1 横切性关注点
2 切面
3 连接点
4 切入点
5 通知
6 目标对象
7 织入
8 引入
29 什么是切入点表达式?
30 通知有哪几种类型?运行顺序是什么?
31 解释AOP的运行流程
32 为什么需要事务?
33 使用事务来解决什么问题?使用事务与不使用事务,数据在程序中和数据中分别是什么状态?
34 JavaEE中事务隔离级分为哪些?分别是什么?代表什么含义?
35 Spring事务管理有哪几个核心组件?
36 OpenSessionInView有什么作用?
37 ThreadLocal模式如何理解?有什么作用?
38 BeanFactory和ApplicationContext有什么区别?
39 如何用基于XML与注解配置的方式配置Spring?
40 Spring Bean的作用域之间有什么区别?
41 解释Spring框架中bean的生命周期?
42 Spring框架的事务管理有哪些优点?
43 在SpringAOP中concern和cross-cutting concern的区别是什么?
44 有几种不同类型的自动代理?
45 BeanFactory和ApplicationContext有什么区别?
46 如何用基于Java配置的方式配置Spring?
47 Spring框架中有哪些不同类型的事件?
48 FileSystemResource和ClassPathResource有什么区别?
49 Spring框架中都用到了哪些设计模式?
21 Spring MVC框架
理论题
1 Spring MVC/Struts2框架的异同?
2 举例说明Spring MVC框架和Struts2框架应用的场景?
3 说说Spring MVC和Struts1,Struts2的比较优势?
4 描述Spring MVC的工作流程?
5 画图展示Spring MVC的工作流程,描述从客户端发送请求到服务器响应给客户端的整个过程
6 如何配置Spring MVC的核心控制器?
7 Spring MVC的核心控制器的作用是?
8 默认情况下Spring MVC的核心控制器从哪里获取配置文件?
9 如何指定自定义的配置文件?
10 什么是Spring MVC映射器?有哪几种?
11 什么是Spring MVC适配器?有什么作用?
12 Spring MVC有没有默认的映射器?在哪里定义的?
13 Spring MVC的Handler有几种实现方式?
14 Spring MVC的控制器中获取数据的方式有哪些?
15 @RequestParam的作用是?
16 Spring MVC将数据携带到前台的方式有哪些?
17 Spring MVC如何将数据从控制台携带到前台页面?
18 如何使用Handler进行请求转发,代码如何实现Handler进行重定向?
19 Handler方法中编程如何实现如何绑定自定义日期类型参数业务?
20 如何解决Spring MVC的乱码问题?
21 在Spring MVC中406错误有可能引起的问题是?
22 Spring MVC与AJAX交互的注解有哪几个?
23 Spring MVC实现文件上传有哪些步骤?
24 Spring MVC上传文件解析器是什么?
25 Spring MVC上传文件解析器的id名称是否可以更改?为什么?
26 Spring MVC上传文件解析器的常见参数是什么?
27 Spring MVC的拦截器有什么作用?
28 Spring MVC的拦截器有几种配置方式?
29 Spring MVC的拦截器与Struts2拦截器有什么区别?
30 Spring MVC拦截器的实现方式有哪些?
31 拦截器实现中有哪些方法?
32 拦截器实现中3个方法分别处理哪些内容?
33 Spring MVC怎样自定义拦截器?
34 Spring MVC中的拦截器与Struts2的拦截器有什么不同?
35 Spring、Spring MVC怎样集成?
36 我们知道用户请求URL可以用注解的方式来把URL与控制器controller映射起来,但怎么把控制器controller与业务模型映射起来是url通过controller找到对应的业务模型?也就是说控制器与业务模型怎么样建立关系?
37 Spring MVC的核心入口类是什么?Struts2的是什么?
38 Spring MVC的控制器是不是单例模式,如果是,有什么问题?怎么解决?
39 Spring MVC中的控制器的注解一般用哪个?有没有别的注解可以代替?
40 @RequestMapping注解用在类上面有什么作用?
41 怎样把某个请求映射到特定的方法上面?
42 如果在拦截请求中,我们想拦截get方式提交的方法,怎么配置?
43 如果在拦截请求中,我们想拦截提交参数中包含'type=test'字符串,怎么配置?
44 我们想在拦截的方法里面得到从前台传入的参数,怎么得到?
45 如果前台有很多个参数传入,并且这些参数都是一个对象的,那么怎样快速得到这个对象?
46 怎样在方法里面得到Request或者Session?
47 Spring MVC中函数的返回值是什么?
48 Spring MVC怎么处理返回值的?
49 Spring MVC怎么样设定重定向和转发的?
50 Spring MVC用什么对象从后台向前台传递数据的?
51 Spring MVC中有个类把视图和数据都合并在一起的叫什么?
52 怎么样吧ModelMap里面的数据放入Session里面?
53 Spring MVC怎么和AJAX相互调用的?
54 当一个方法向AJAX返回特殊对象,譬如Object,List等,需要做什么处理?
22 MyBatis 框架
理论题
1 MyBatis的核心原理?使用MyBatis与其他ORM框架对比有哪些优点和缺点?
2 MyBatis与Hibernate有什么异同?
3 MyBatis中有哪些常用的查询方法?
4 什么是MyBatis命名空间?
5 MyBatis中如何进行Mapper的动态代理?
6 MyBatis输入参数#{}中与${}有什么不同?分别代表什么含义?
7 MyBatis中如何定义别名查询?
8 MyBatis怎样定义结果集resultMap?
9 MyBatis的结果集resultMap可以定义哪些类型?
10 MyBatis怎样进行分页查询?
11 MyBatis中什么是逻辑分页?什么是物理分页?分别有什么优缺点?
12 MyBatis怎样进行动态查询?
13 MyBatis中动态查询常用的有哪些标签?
14 MyBatis怎样进行CRUD操作
15 MyBatis怎样进行事务管理?
16 比较MyBatis和Hibernate事务管理的区别
17 MyBatis框架有哪些注释?
18 如何使用MyBatis的注解实现动态SQL语句查询?
19 MyBatis怎样进行“多对一”关联查询?
20 如何实现MyBatis一对多的join查询?
21 如何实现MyBatis一对多的n+1次查询?
22 MyBatis如何进行关联关系(一对一,一对多,多对多),以及双向关联关系查询?
23 MyBatis有几种缓存?获取Sqlsession后,查询数据的顺序?MyBatis中与Hibernate中获取session,查询数据的顺序有什么区别?
24 MyBatis怎样处理延迟加载?
25 MyBatis动态SQL语句怎样生成?
26 集成Spring MVC + Spring + MyBatis有哪些步骤?
27 MyBatis比IBatis比较大的改进是什么?
28 什么是MyBatis的接口绑定?有什么好处?
29 接口绑定的几种实现方式?分别是怎么实现的?
30 什么情况下用注解绑定?什么情况下用XML绑定?
31 MyBatis实现一对一有几种方式?具体是怎么操作的?
32 MyBatis实现一对多有几种方式?具体是怎么操作的?
33 MyBatis里面的动态SQL是怎么设定的?用什么语法?
34 IBatis和MyBatis在核心处理类分别教师什么?
35 IBatis和MyBatis在细节上的不同有哪些?
36 讲讲MyBatis的缓存
37 MyBatis(IBatis)的好处是什么?
38 XML映射文件中,除了右侧常见的标签之外还有哪些标签?
1 select
2 insert
3 update
4 delete
39 最佳实践中,通常一个XML映射文件,都会写一个Dao接口与之对应,请问这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?
40 MyBatis是如何进行分页的?分页插件的原理是什么?
41 简单描述下MyBatis的插件运行原理,以及如何编写一个插件?
42 MyBatis执行批量插入,能返回数据库主键列表吗?
43 MyBatis动态SQL是做什么的?都有哪些动态SQL?简述一下动态SQL的执行原理?
44 MyBatis是如何将SQL执行结果封装为目标对象并返回的?都有哪些映射形式?
45 MyBatis能执行一对一、一对多的关联查询吗?都有哪些实现方式?以及它们有什么区别?
46 MyBatis是否支持延迟加载?如果支持,它的实现原理是什么?
47 MyBatis的XML映射文件中,不同的XML映射文件,ID是否可以重复?
48 MyBatis中如何执行批处理?
49 MyBatis都有哪些Executor执行器?它们之间的区别是什么?
50 MyBatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面?还是说必须定义在A标签的前面?
51 简述MyBatis的XML映射文件和MyBatis内部数据结构之间的映射关系?
52 为什么说MyBatis是半自动ORM映射工具?它与全自动的区别在哪里?
53 MyBatis如何设置底层JDBC使用PreparedStatement执行SQL语句?
54 MyBatis如何与LOG4J结合打印日志?
55 MyBatis如何执行存储过程?
56 MyBatis数据管理方式有几种?
57 MyBatis引入XXX.mapper映射文件有几种方式?
58 MyBatis事务管理有几种方式?分别是什么?
59 MyBatis如何给类型设置别名?设置别名的方式有几种?分别是什么?
60 谈谈在MyBatis中auto-mapping是什么?
61 MyBatis中驱动是否会一直等待数据库响应?如何设置数据库最大响应时间?
62 MyBatis每次从数据库抓取结果行数是多少?是否可以自定义设置?
63 MyBatis如何判断需要执行的数据库类型?是否可以给SQL命令明确指定在什么数据库中执行?
64 MyBatis是否可以在mapper中指定自定义主键策略?
65 MyBatis中如何实现SQL复用?
66 MyBatis中在接口定义的方法是否可以有多个参数??如何进行多参数传递?
67 MyBatis中调用如何传递参数?
68 MyBatis中调用如何进行多参数传递?
69 持久层框架是什么意思?你用过的持久层框架有哪些?
70 什么样的需求使用MyBatis框架更好?什么样的去求使用Hibernate框架更好?
71 MyBatis是否有反向工程?你所熟悉的反向工程有哪些?各有什么优缺点?
72 谈谈MyBatis和Hibernate在执行效率上的对比?
73 谈谈MyBatis和Hibernate在开发效率上的对比?
74 解释下DefaultSqlSessionFactory的作用?
75 解释下SqlSessionFactoryBuilder的作用?
76 说说MyBatis缓存和Hibernate缓存的区别?
77 在你的项目中为什么使用MyBatis框架?
78 MyBatis中SQL语句执行类型有几种方式?(ExecutorType)
79 MyBatis中防止n+1次查询的方式有哪几种?
80 MyBatis中ObjectFactory是什么?
81 MyBatis中TypeHandler是什么?
24 RBAC 技术
理论题
1 什么是权限管理?
2 什么是用户身份认证?
3 解释右侧名词的意思
1 主体(Subject)
2 身份信息(Principal)
3 凭证信息(Credential)
4 什么是授权?
5 解释右侧名词
1 主体(Subject)
2 资源(Resource)
3 权限/许可(Permission)
6 如何创建权限管理的数据库表?
7 什么是权限分配?
8 什么是权限控制?
9 什么是基于角色的访问控制(PBAC)?有什么缺点?
10 什么是基于资源的访问控制?有什么优点?
11 什么是粗颗粒度和细颗粒度?
12 简述如何实现粗颗粒度和细颗粒度?
13 阐述基于URL拦截的原理
25 shiro 安全框架
理论题
1 什么是shiro?为什么使用shiro?
2 shiro的组成部分和RABC中关键对象进行对比?
3 解释右侧术语
1 Subject
2 SecurityManager
3 Authenticator
4 Authorizer
5 Realm
6 SessionManager
7 SessionDao
8 CacheManager
9 Cryptography
4 解释认证的基本概念:principals、credentials
5 shiro认证流程是什么?
6 shiro认证中有哪些常见异常?分别表示什么意思?
7 什么是Realm?如何自定义Realm?
8 什么是散列算法?
9 什么是授权?
10 解释右侧授权的关键概念
1 主题
2 资源
3 权限
4 角色
11 shiro授权有哪三种方式?
12 如何自定义Realm实现授权?
13 在web项目中如何配置shiro的过滤器?
14 shiro如何与web项目进行整合?
15 shiro如何控制菜单的权限控制与按钮权限控制?
16 shiro怎样控制controller权限?
17 shiro常用的标签与注解有哪些?
18 什么是shiro缓存?为什么要使用缓存?
19 shiro缓存怎样实现?
31 Redis缓存技术
理论题
1 redis是什么?
2 redis相比memcached有哪些优势?
3 redis单机如何安装?
4 redis有哪五种数据类型?
5 redis怎样后台运行?
6 redis怎样绑定请求IP地址?
7 redis如何设置DB数量?
8 redis持久化配置方式是什么?
9 set命令与setnx命令有什么区别?
10 redis操作String类型,怎样指定有效期?
11 redis操作String,怎样设置指定key的value值得子字符串?
12 redis操作String,怎样一次性设置多个key的使用?
13 redis操作String,怎样获取key对应的String值?
14 redis操作String,怎样设置key的值,并返回key的旧值?
15 redis操作String,怎样获取指定的key的value值的子字符串?
16 redis操作怎样获取多个key对应的值?
17 redis怎样对key的值做加加操作?
18 redis怎样对key的值做减减操作?
19 redis操作String,怎样实现追加操作?
20 redis操作String,怎样获取指定key的value值得长度?
21 redis操作hash,怎样设置hash field为指定值?
22 redis操作hash,怎样设置多个hash field为指定值?
23 redis操作hash,怎样获取指定的hash field?
24 redis操作hash,怎样获取全部指定的hash field?
25 redis操作hash,怎样获取hash中元素个数?
26 redis操作hash,怎样删除hash中指定field元素?
27 redis操作list,怎样在key对应的list的头部添加字符串元素?
28 redis操作list,怎样在key对应的list的尾部添加字符串元素?
29 redis操作list,怎样设置list中指定下标的元素值(下标从0开始)?
30 redis操作set,怎样向set中添加元素?
31 redis操作set,怎样删除名称为key的set中的元素member?
32 redis操作sorted set,怎样向名称为key的zset中添加元素member?
33 redis操作sorted set,怎样删除名称为key的zset中的元素member?
34 什么是redis集群?redis集群原理是什么?
35 redis集群为什么至少六台?
36 redis有哪些特性?
37 redis集群中slot是什么?有什么作用?
38 redis集群中选举、容错机制是什么?
39 redis集群如何进行安装?
40 redis集群如何添加、删除节点?
41 什么是Jedis,如何使用Jedis操作redis数据库?
28 逆向工程、分页插件
理论题
1 什么是MyBatis你逆向工程?有什么好处?
2 逆向工程的原理是什么?
3 逆向工程怎样指定数据库表?
4 逆向工程如何自定义Java对象名称?
5 如何搭建逆向工程?
6 逆向工程生成的代码怎样实现CRUD操作?
7 什么是分页插件?有什么好处?
8 分页插件如何调用?
29 Nginx 服务器
理论题
1 什么是nginx?
2 nginx与apache对比?
3 nginx安装依赖有哪些?
4 nginx安装怎样指定安装路径?
5 nginx怎样启动?
6 怎样检查nginx配置文件的准确性?
7 怎样从新加载nginx配置文件?
8 nginx怎样指定运行用户?
9 nginx怎样指定启动进程数量?
10 nginx定义服务器的默认网站根目录位置?
11 什么是nginx反向代理?如何实现反向代理Tomcat?
26 Maven技术
理论题
1 maven是什么?
2 Ant和maven的区别?
3 什么是maven坐标?
4 什么是依赖管理?
5 什么是远程仓库?
6 maven怎样安装?
7 maven怎样创建Java项目?
8 maven怎样创建parent项目?
9 maven如何创建Java Web项目?
10 什么是maven module?
11 maven module与project有什么区别?
12 maven怎样添加依赖?
13 maven如何编译源代码?
14 maven如何测试项目?
15 maven如何产生site?
16 maven怎样打包?
17 maven怎样安装到本地仓库?
18 maven如何消除编译后的文件及项目?
19 maven编译时如何跳过测试代码?
20 maven怎样生成Eclipse项目?
21 maven通过Tomcat插件,如何运行Java Web项目?
22 maven怎样发布到Tomcat?
27 Linux技术
理论题
1 Linux系统有哪些部分组成?
2 新建一个文本文件有哪些命令可以实现?
3 Linux关机与重启命令?
4 Linux切换工作目录命令?
5 Linux显示工作目录命令?
6 Linux查看目录中文件命令?
7 Linux显示文件和目录由根目录开始的树形结构命令?
8 Linux创建目录命令?
9 Linux删除文件命令?
10 Linux删除目录命令?
11 Linux重命名/移动命令?
12 Linux复制文件命令?
13 Linux创建链接命令?
14 Linux文件搜索命令?
15 Linux创建用户组命令?
16 Linux删除用户组命令?
17 Linux重命名用户组命令?
18 Linux创建用户命令?
19 Linux删除用户命令?
20 Linux修改用户属性命令?
21 Linux修改密码命令?
22 Linux设置权限命令?
23 Linux改变文件用户组命令?
24 Linux解压缩命令有哪些?
25 Linux软件包升级以及安装命令?
26 Linux查看文件命令有哪些?
27 Linux怎样查看进程?
28 Linux怎样修改环境变量?
29 Linux(centos)怎样修改防火墙?
33 Zookeeper分布式
理论题
1 什么是集群?
2 zookeeper是什么?
3 为什么使用zookeeper?能做哪些事情?
4 zookeeper三种角色leader、follower、observer作用?
5 zookeeper选举leader过程?
6 zookeeper配置文件管理原理?
7 什么solr集群?为什么使用solr集群?
8 solr集群的结构是怎样的?
4 面试专题突破
MySQL总结笔记
执行流程
1、查询缓存
2、解析器生成解析树
3、预处理再次生成解析树
4、查询优化器
5、查询执行计划
6、查询执行引擎
7、查询数据返回结果
表结构对性能的影响
1、冗余数据的处理(可以提高系统的整体查询性能<三范式>)
1、每一列只能有一个值
2、每一行可以被唯一的区分
3、不包含其他表的已包含的非关键信息
2、大表拆小表
1、一般不会设计属性过多的表
2、一般不会超过500到1000万数据的表
3、有大数据的列单独拆为小表
3、根据需求展示更加合理的表结构
4、常用属性分离为小表
索引
1、类型
1,Normal:普通的索引;允许一个索引值后面关联多个行值;
2,UNIQUE:唯一索引;允许一个索引值后面只能有一个行值;之前对列添加唯一约束其实就是为这列添加了一个unique索引;当我们为一个表添加一个主键的时候,其实就是为这个表主键列(设置了非空约束),并为主键列添加了一个唯一索引;
3,Fulltext:全文检索,mysql的全文检索只能用myisam引擎,并且性能较低,不建议使用;
2、方法
1,b-tree:是一颗树(二叉树,平衡二叉树,平衡树(B-TREE))
使用平衡树实现索引,是mysql中使用最多的索引类型;在innodb中,存在两种索引类型,第一种是主键索引(primary key),在索引内容中直接保存数据的地址;第二种是其他索引,在索引内容中保存的是指向主键索引的引用;所以在使用innodb的时候,要尽量的使用主键索引,速度非常快;
2,hash:把索引的值做hash运算,并存放到hash表中,使用较少,一般是memory引擎使用;优点:因为使用hash表存储,按照常理,hash的性能比B-TREE效率高很多。
hash索引的缺点:
1,hash索引只能适用于精确的值比较,=,in,或者<>;无法使用范围查询;
2,无法使用索引排序;
3,组合hash索引无法使用部分索引;
4,如果大量索引hash值相同,性能较低;
3、创建
1,较频繁的作为查询条件的字段应该创建索引;
2,唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;
作为索引的列,如果不能有效的区分数据,那么这个列就不适合作为索引列;比如(性别,状态不多的状态列)
举例:SELECT sum(amount) FROM accountflow WHERE accountType = 0;
假如把accountType作为索引列,因为accountType只有14种,所以,如果根据accountType来创建索引,最多只能按照1/14的比例过滤掉数据;但是,如果可能出现,只按照该条件查询,那我们就要考虑到其他的提升性能的方式了;
3,更新非常频繁的字段不适合创建索引;原因,索引有维护成本;
4,不会出现在WHERE 子句中的字段不该创建索引;
5, 索引不是越多越好;(只为必要的列创建索引)
1,不管你有多少个索引,一次查询至多采用一个索引;(索引和索引之间是独立的)
2,因为索引和索引之间是独立的,所以说每一个索引都应该是单独维护的;数据的增/改/删,会导致所有的索引都要单独维护;
4、执行计划与执行明细
1,Explain:可以让我们查看MYSQL执行一条SQL所选择的执行计划;
2,Profiling:可以用来准确定位一条SQL的性能瓶颈;
JOIN的原理
1,JOIN的原理:
在mysql中使用Nested Loop Join来实现join;
A JOIN B:通过A表的结果集作为循环基础,一条一条的通过结果集中的数据作为过滤条件到下一个表中查询数据,然后合并结果;
2,JOIN的优化原则:
1,尽可能减少Join 语句中的Nested Loop 的循环总次数,用小结果集驱动大结果集;
2,优先优化Nested Loop 的内层循环;
3,保证Join 语句中被驱动表上Join 条件字段已经被索引;
4,扩大join buffer的大小;
sql优化原则
1、选择需要优化的SQL
2、Explain和Profile入手
1、任何SQL的优化,都从Explain语句开始;Explain语句能够得到数据库执行该SQL选择的执行计划;
2、首先明确需要的执行计划,再使用Explain检查;
3、使用profile明确SQL的问题和优化的结果;
3、永远用小结果集驱动大的结果集
4、在索引中完成排序
5、使用最小Columns
6、使用最有效的过滤条件
7、避免复杂的JOIN和子查询
锁
1,、lock
1、共享锁<s lock>允许事务读取一行数据
2、排他锁<x lock>允许事务更新或者是删除一条数据
3、意向共享锁<is lock>事务想要获得一张表某几行的共享锁
4、意向排他锁<ix lock>事务想要获得一张表的某几行的排他锁
2、latch<轻量级锁,锁的时间非常短,用来操作临界资源>
3、一致性的非锁定读
4、一致性锁定读
5、死锁
事务
1、特性
1、原子性<数据库事务不可分割的单位,要么都做,要么都不做>
3、隔离性<事务是相互不可见的>
4、持久性<事务一旦提交,即使宕机也是能恢复的>
2、一致性<事务的操作不会改变数据库的状态,比方说唯一约束>
2、分类
1、扁平事务<使用最频繁的事务,要么都成功提交,要么都失败回滚>
2、带有扁平点的扁平事务<允许事务回滚到同一个事务中比较早的一个状态>
3、链事务<回滚到最近的一个保存点,在所有的事务都提交之后才会释放锁,并且下一个事务的开始需要上一个事务来进行通知>
4、嵌套事务<树结构,只有当父级事务提交之后子级事务才会提交,任意一个父级事务的回滚都会导致下面的子级事务回滚>
5、分布式事务<操作两个不同的数据库,使其实现数据的同步,例如将中国银行的钱转到工商银行,这个不同银行的不同数据库,为分布式事务>
3、隔离级别
1、read uncommittted<脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据>
2、read committed<不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。>
3、repeatable read<幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。>
4、serializable<锁表,不会出现意外情况>
Spring总结笔记
基本概念
Spring优点
轻量级,非侵入式
对现有的类结构没有影响
可以提供众多服务,如事务管理,WS等
AOP的很好支持,方便面向切面编程,使得业务逻辑和系统服务分开
对主流的框架提供了很好的集成支持,如hibernate,Struts2,JPA等,像一个胶水一样,把一些好的框架粘合在一起方便实用
使用Spring的IOC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑
Spring DI机制降低了业务对象替换的复杂性。
Spring的高度可开放性,并不强制依赖于Spring,开发者可以自由选择Spring部分或全部
Spring缺点
缺少一个公用控制器
没有SpringBoot好用
Spring像一个胶水,将框架黏在一起,后面拆分的话就不容易拆分了
AOP
实现原理
jdk动态代理
主要通过Proxy.newProxyInstance()和InvocationHandler这两个类和方法实现
实现过程
创建代理类proxy实现Invocation接口,重写invoke()方法
调用被代理类方法时默认调用此方法
将被代理类作为构造函数的参数传入代理类proxy
调用Proxy.newProxyInsatnce(classloader,interfaces,handler)方法生成代理类
生成的代理类
$Proxy0 extends Proxy implements Person
类型为$Proxy0
因为已经继承了Proxy,所以java动态代理只能对接口进行代理
代理对象会实现用户提供的这组接口,因此可以将这个代理对象强制类型转化为这组接口中的任意一个
通过反射生成对象
总结: 代理类调用自己方法时,通过自身持有的中介类对象来调用中介类对象的invoke方法,从而达到代理执行被代理对象的方法。
cglib
生成对象类型为Enhancer
实现原理类似于 jdk 动态代理,只是他在运行期间生成的代理对象是针
对目标类扩展的子类
静态代理
缺点
如果要代理一个接口的多个实现的话需要定义不同的代理类
代理类 和 被代理类 必须实现同样的接口,万一接口有变动,代理、被代理类都得修改
在编译的时候就直接生成代理类
JDK动态代理和cglib的对比
CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高
1.6和1.7的时候,CGLib更快
1.8的时候,jdk更快
CGLib在创建对象的时候所花费的时间却比JDK动态代理多
singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则适合用JDK动态代理
JDK动态代理是面向接口的,CGLib动态代理是通过字节码底层继承代理类来实现(如果被代理类被final关键字所修饰,那么会失败)
JDK生成的代理类类型是Proxy(因为继承的是Proxy),CGLIB生成的代理类类型是Enhancer类型
如果要被代理的对象是个实现类,那么Spring会使用JDK动态代理来完成操作(Spirng默认采用JDK动态代理实现机制);
如果要被代理的对象不是实现类,那么Spring会强制使用CGLib来实现动态代理。
配置方式
XML方式
注解方式
基于Java类配置
通过 @Configuration 和 @Bean 这两个注解实现的
@Configuration 作用于类上,相当于一个xml配置文件;
@Bean 作用于方法上,相当于xml配置中的<bean>;
基本概念
核心业务功能和切面功能分别独立进行开发 ,然后把切面功能和核心业务功能 "编织" 在一起,这就叫AOP
让关注点代码与业务代码分离
面向切面编程就是指: 对很多功能都有的重复的代码抽取,再在运行的时候往业务方法上动态植入“切面类代码”。
应用场景:日志,事务管理,权限控制
事务管理
基本概念
如果需要某一组操作具有原子性,就用注解的方式开启事务,按照给定的事务规则来执行提交或者回滚操作
事务管理一般在Service层
事务控制
编程式事务控制
用户通过代码的形式手动控制事务
Conn.setAutoCommite(false); // 设置手动控制事务
粒度较细,比较灵活,但开发起来比较繁琐: 每次都要开启、提交、回滚
声明式事务控制
Spring提供对事务的控制管理
XML方式
注解方式
事务属性
事务传播行为
required_new
如果当前方法有事务了,当前方法事务会挂起,在为加入的方法开启一个新的事务,直到新的事务执行完、当前方法的事务才开始
required(默认方法)
如果当前方法已经有事务了,加入当前方法事务
其余五种方式(拓展学习)
事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法的时候事务如何传播。
数据库隔离级别
TransactionDefinition.ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别,Mysql 默认采用的 REPEATABLE_READ隔离级别 Oracle 默认采用的 READ_COMMITTED隔离级别.
TransactionDefinition.ISOLATION_READ_UNCOMMITTED: 最低的隔离级别,允许读取尚未提交的数据变更,可能会导致脏读、幻读或不可重复读
TransactionDefinition.ISOLATION_READ_COMMITTED: 允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读或不可重复读仍有可能发生
TransactionDefinition.ISOLATION_REPEATABLE_READ: 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,可以阻止脏读和不可重复读,但幻读仍有可能发生。
TransactionDefinition.ISOLATION_SERIALIZABLE: 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。但是这将严重影响程序的性能。通常情况下也不会用到该级别。
事务超时属性
指一个事务所允许执行的最长时间,如果超过该时间限制但事务还没有完成,则自动回滚事务。
事务只读属性
对事物资源是否执行只读操作
回滚规则
定义了哪些异常会导致事务回滚而哪些不会。默认情况下,事务只有遇到运行期异常时才会回滚,而在遇到检查型异常时不会回滚,也可以用用户自己定义
Spring事务管理接口
PlatformTransactionManager
(平台)事务管理器
Spring并不直接管理事务,而是提供了多种事务管理器,通过PlatformTransactionManager这个接口,Spring为各个平台如JDBC、Hibernate等都提供了对应的事务管理器,但是具体的实现就是各个平台自己的事情了。
TransactionDefinition
事务定义属性(事务隔离级别、传播行为、超时、只读、回滚规则)
TransactionStatus
事务运行状态
事务管理一般在Service层
如果在dao层,回滚的时候只能回滚到当前方法,但一般我们的service层的方法都是由很多dao层的方法组成的
如果在dao层,commit的次数会过多
IOC
依赖注入
装配方式(依赖注入的具体行为)
基于注解的自动装配
实现方式
注解
@Autowired
byName
优先byType
@Resource
优先byName
byType
自动扫描(component-scan)
装配规则
基于XML配置的显式装配
基于Java配置的显式装配
能够在编译时就发现错误
依赖注入的方式
构造器方式注入
<bean id="text" class="com.maven.Text" />
<bean id="hello" class="com.maven.Hello"><constructor-arg ref="text" /></bean>
构造器依赖注入通过容器触发一个类的构造器来实现的,该类有一系列参数,每个参数代表一个对其他类的依赖。
setter方法注入
例如:<bean id="hello" class="com.maven.Hello"><property name="text" ref="text" /></bean>
之所以叫setter方法注入,因为这是通过找到类的对应的setter方法,再进行相应的注入
Setter方法注入是容器通过调用无参构造器或无参static工厂 方法实例化bean之后,调用该bean的setter方法,即实现了基于setter的依赖注入。
最好的解决方案是用构造器参数实现强制依赖,setter方法实现可选依赖。
循环依赖
构造器方式无法解决,只能抛出异常
多例方式无法解决,只能抛出异常
因为Spring容器不缓存"prototype"作用域的bean,因此无法提前暴露一个创建中的bean。
单例模式可以解决
通过提前暴露一个单例工厂方法,从而使其他bean能够引用到该bean/提前暴露一个正在创建中的bean
不用创建对象,而只需要描述它如何被创建,不在代码里直接组装组件和服务,但是要在配置文件里描述哪些组件需要哪些服务,之后一个容器(IOC容器)负责把他们组装起来。
容器的初始化过程
1.)Resource定位;指对BeanDefinition的资源定位过程。通俗地讲,就是找到定义Javabean信息的XML文件,并将其封装成Resource对象。
2.)BeanDefinition的载入;把用户定义好的Javabean表示为IoC容器内部的数据结构,这个容器内部的数据结构就是BeanDefinition。
3.)向IoC容器注册这些BeanDefinition。
bean知识
bean的生命周期
1.实例化Bean
2.设置Bean的属性
3.检查Aware相关接口并设置相关依赖
BeanNameAware
BeanFactoryAware
ApplicationContextAware
4.检查BeanPostProcessor接口并进行前置处理
5.检查Bean在Spring配置文件中配置的init-method属性并自动调用其配置的初始化方法。
由于这个是在Bean初始化结束时调用那个的方法,也可以被应用于内存或缓存技术;
6.检查BeanPostProcessor接口并进行后置处理
7.当Bean不再需要时,会经过清理阶段,如果Bean实现了DisposableBean这个接口,会调用那个其实现的destroy()方法;
8. 最后,如果这个Bean的Spring配置中配置了destroy-method属性,会自动调用其配置的销毁方法。
bean的作用域
singleton
Spring IoC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。
singleton是Bean的默认作用域
默认情况下是容器初始化的时候创建,但也可设定运行时再初始化bean
DefaultSingletonBeanRegistry类里的singletonObjects哈希表保存了单例对象。
Spring容器可以管理singleton作用域下bean的生命周期,在此作用域下,Spring能够精确地知道bean何时被创建,何时初始化完成,以及何时被销毁
prototype
每次通过Spring容器获取prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态
当容器创建了bean的实例后,bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的bean的生命周期。
对有状态的bean使用prototype作用域,而对无状态的bean使用singleton作用域。
request
在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效。
session
在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。
global Session
在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用portlet context时有效。
bean的创建
1.进入getBean()方法
2.判断当前bean的作用域是否是单例,如果是,则去对应缓存中查找,没有查找到的话则新建实例并保存。如果不是单例,则直接新建实例(createBeanInstance)
3.新建实例后再将注入属性(populateBean),并处理回调
创建bean
找到@Autowired的对象
创建注入对象,并赋值
大致流程
1.首先根据配置文件找到对应的包,读取包中的类,,找到所有含有@bean,@service等注解的类,利用反射解析它们,包括解析构造器,方法,属性等等,然后封装成各种信息类放到container(其实是一个map)里(ioc容器初始化)
2.获取类时,首先从container中查找是否有这个类,如果没有,则报错,如果有,则通过构造器信息将这个类new出来
3.如果这个类含有其他需要注入的属性,则进行依赖注入,如果有则还是从container找对应的解析类,new出对象,并通过之前解析出来的信息类找到setter方法(setter方法注入),然后用该方法注入对象(这就是依赖注入)。如果其中有一个类container里没找到,则抛出异常
4.如果有嵌套bean的情况,则通过递归解析
5.如果bean的scope是singleton,则会重用这个bean不再重新创建,将这个bean放到一个map里,每次用都先从这个map里面找。如果scope是session,则该bean会放到session里面。
总结:通过解析 xml 文件,获取到bean的属性(id,name,class,scope,属性等等)里面的内容,利用反射原理创建配置文件里类的实例对象,存入到 Spring 的 bean 容器中
SpringMVC
执行流程
1、 用户发送请求至前端控制器DispatcherServlet
2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、 处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、 DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、 执行处理器(Controller,也叫后端控制器)。
6、 Controller执行完成返回ModelAndView
7、 HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、 DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、 ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
注解
servlet生命周期
1.加载和实例化
2.初始化
3.请求处理
4.服务终止
Spring类
ApplicationContext
FileSystemXmlApplicationContext
ClassPathXmlApplicationContext
WebXmlApplicationContext
kafka总结笔记
介绍
简介:Kafka是一个分布式的,可划分的,冗余备份的持久性的日志服务。它主要用于处理活跃的流式数据。
消息系统术语:消息归纳topic,发布消息producers,消费消息consumer,集群服务broker。
总结:两个作用,1.降低系统组网复杂度。2.降低编程复杂度。
Kafka独特设计在什么地方?
1.同时为发布和订阅提供高吞吐量。据了解,Kafka每秒可以生产约25万消息(50 MB),每秒处理55万消息(110 MB)。
2.可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如ETL,以及实时应用程序。通过将数据持久化到硬盘以及replication防止数据丢失。
3.分布式系统,易于向外扩展。所有的producer、broker和consumer都会有多个,均为分布式的。无需停机即可扩展机器。
4.消息被处理的状态是在consumer端维护,而不是由server端维护。当失败时能自动平衡。
5.支持online和offline的场景。
kafka架构
架构
producer,broker,consumer关系图
Kafka的整体架构非常简单,是显式分布式架构,producer、broker(kafka)和consumer都可以有多个。
Producer,consumer实现Kafka注册的接口,数据从producer发送到broker,broker承担一个中间缓存和分发的作用。
broker分发注册到系统中的consumer。broker的作用类似于缓存,即活跃的数据和离线处理系统之间的缓存。
部件
Partition
Topic物理上的分组,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。
Topic
特指Kafka处理的消息源(feeds of messages)的不同分类。
Message
消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息。
Producers
消息和数据生产者,向Kafka的一个topic发布消息的过程叫做producers。
Consumers
消息和数据消费者,订阅topics并处理其发布的消息的过程叫做consumers。
Broker
缓存代理,Kafa集群中的一台或多台服务器统称为broker。
Kafka如何搭建及创建topic、发送消息、消费消息?
Topics 和Logs
一个topic是对一组消息的归纳。对每个topic,Kafka 对它的日志进行了分区
每个分区都由一系列有序的、不可变的消息组成,这些消息被连续的追加到分区中。分区中的每个消息都有一个连续的序列号叫做offset,用来在分区中唯一的标识这个消息。
实际上每个consumer唯一需要维护的数据是消息在日志中的位置,也就是offset.这个offset有consumer来维护:一般情况下随着consumer不断的读取消息,这offset的值不断增加,但其实consumer可以以任意的顺序读取消息,比如它可以将offset设置成为一个旧的值来重读之前的消息。
Producers
Producer将消息发布到它指定的topic中,并负责决定发布到哪个分区。
通常简单的由负载均衡机制随机选择分区,但也可以通过特定的分区函数选择分区。使用的更多的是第二种。
Consumers
队列模式和发布-订阅模式
队列模式中,consumers可以同时从服务端读取消息,每个消息只被其中一个consumer读到。
发布-订阅模式中消息被广播到所有的consumer中。
Consumers可以加入一个consumer 组,共同竞争一个topic,topic中的消息将被分发到组中的一个成员中。
如果所有的consumer都在一个组中,这就成为了传统的队列模式,在各consumer中实现负载均衡。
如果所有的consumer都不在不同的组中,这就成为了发布-订阅模式,所有的消息都被分发到所有的consumer中。
集群关系图
优点
相比传统的消息系统,Kafka可以很好的保证有序性。
Kafka可以在多个consumer组并发的情况下提供较好的负载均衡。
环境搭建
下载解压
https://www.apache.org/dyn/closer.cgi?path=/kafka//kafka_.tgz
tar -xzf kafka_2.9.2-0.8.1.1.tgz
cd kafka_2.9.2-0.8.1.1
启动服务
Kafka用到了Zookeeper,所有首先启动Zookper。
bin/zookeeper-server-start.sh config/zookeeper.properties
启动kafka
bin/kafka-server-start.sh config/server.properties
测试
创建topic
创建一个叫做“test”的topic,它只有一个分区,一个副本。
bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic test
通过list命令查看创建的topic
bin/kafka-topics.sh --list --zookeeper localhost:2181
发送消息
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
启动consumer
Kafka也有一个命令行consumer可以读取消息并输出到标准输出:
bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning
学习总结来源
http://www.aboutyun.com/thread-12882-1-1.html
http://blog.jobbole.com/75328/
http://www.cnblogs.com/likehua/p/3999538.html
JVM性能优化总结笔记
1、Java内存区域
虚拟机的历史
未来的Java技术一览
运行时数据区域
各个区域的作用
程序计数器
栈
堆
方法区
运行时常量池
各个版本内存区域的变化
1.6
1.7
1.8
直接内存
站在线程角度来看堆和栈
深入辨析堆和栈
方法的出入栈
栈桢
栈上分配
虚拟机中的对象
分配过程
内存布局
对象的访问定位
堆参数设置和内存溢出实战
Java堆溢出
新生代配置
方法区和运行时常量池溢出
虚拟机栈和本地方法栈溢出
本机直接内存溢出
2、垃圾回收器和内存分配策略
GC概述
判断对象的存活
辨析强、弱等各种引用
GC算法
标记-清除算法
复制算法
标记-整理算法
分代收集
Stop The World现象
GC日志解读
内存分配与回收策略
内存泄漏和内存溢出辨析
JDK为我们提供的工具
了解MAT
垃圾回收器
垃圾回收器概览
垃圾回收器工作详解
G1详解
未来的垃圾回收
垃圾回收器
垃圾回收器概览
垃圾回收器工作详解
G1详解
未来的垃圾回收
3、JVM的执行子系统
Class类文件本质
Class文件格式
格式详解
字节码指令
类加载机制
加载过程详解
类加载器
自定义类加载对类进行加密和解密
系统的类加载器
双亲委派模型
Tomcat类加载机制
栈桢详解
方法调用详解
基于栈的字节码解释执行引擎
基于栈的指令集与基于寄存器的指令集
分析代码在虚拟机中的执行情况
4、编写高效优雅Java程序
构造器参数太多怎么办?
不需要实例化的类应该构造器私有
不要创建不必要的对象
避免使用终结方法
使类和成员的可访问性最小化
使可变性最小化
优先使用复合
接口优于抽象类
可变参数要谨慎使用
返回零长度的数组或集合,不要返回null
优先使用标准的异常
用枚举代替int常量
将局部变量的作用域最小化
精确计算,避免使用float和double
当心字符串连接的性能
5、深入了解性能优化
常用的性能评价/测试指标
响应时间
并发数
吞吐量
相互之间的关系
常用的性能优化手段
总原则
前端优化手段
应用服务性能优化
存储性能优化
详细了解应用服务性能优化
缓存
缓存的基本原理和本质
合理使用缓冲的准则
分布式缓存与一致性哈希
集群
异步
同步和异步,阻塞和非阻塞
常见异步的手段
应用相关
代码级别
并发编程
资源的复用
JVM
与JIT编译器相关的优化
GC调优
JVM调优实战
存储性能优化
Java并发体系总结笔记
Java内存模型(JMM)
线程通信机制
内存共享
Java采用
消息传递
内存模型
重排序
为了程序的性能,处理器、编译器都会对程序进行重排序处理
条件
在单线程环境下不能改变程序运行的结果
存在数据依赖关系的不允许重排序
问题
重排序在多线程环境下可能会导致数据不安全
顺序一致性
多线程环境下的理论参考模型
为程序提供了极强的内存可见性保证
特性
一个线程中的所有操作必须按照程序的顺序来执行
所有线程都只能看到一个单一的操作执行顺序,不管程序是否同步
每个操作都必须原子执行且立刻对所有线程可见
happens-before
JMM中最核心的理论,保证内存可见性
在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。
理论
如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前
两个操作之间存在happens-before关系,并不意味着一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法
as-if-serial
所有的操作均可以为了优化而被重排序,但是你必须要保证重排序后执行的结果不能被改变
synchronized
同步、重量级锁
原理
synchronized可以保证方法或者代码块在运行时,同一时刻只有一个方法可以进入到临界区,同时它还可以保证共享变量的内存可见性
锁对象
普通同步方法,锁是当前实例对象
静态同步方法,锁是当前类的class对象
同步方法块,锁是括号里面的对象
实现机制
Java对象头
synchronized的锁就是保存在Java对象头中的
包括两部分数据
Mark Word(标记字段)
Mark Word被设计成一个非固定的数据结构以便在极小的空间内存存储尽量多的数据,它会根据对象的状态复用自己的存储空间
包括
哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳
Klass Pointer(类型指针)
monitor
Owner
初始时为NULL表示当前没有任何线程拥有该monitor record,当线程成功拥有该锁后保存线程唯一标识,当锁被释放时又设置为NULL
锁优化
自旋锁
该线程等待一段时间,不会被立即挂起,看持有锁的线程是否会很快释放锁(循环方式)
自旋字数较难控制(-XX:preBlockSpin)
存在理论:线程的频繁挂起、唤醒负担较重,可以认为每个线程占有锁的时间很短,线程挂起再唤醒得不偿失
缺点
自旋次数无法确定
适应性自旋锁
自旋的次数不再是固定的,它是由前一次在同一个锁上的自旋时间及锁的拥有者的状态来决定
自旋成功,则可以增加自旋次数,如果获取锁经常失败,那么自旋次数会减少
锁消除
若不存在数据竞争的情况,JVM会消除锁机制
判断依据
变量逃逸
锁粗化
将多个连续的加锁、解锁操作连接在一起,扩展成一个范围更大的锁。例如for循环内部获取锁
轻量级锁
在没有多线程竞争的前提下,减少传统的重量级锁使用操作系统互斥量产生的性能消耗
通过CAS来获取锁和释放锁
性能依据
对于绝大部分的锁,在整个生命周期内都是不会存在竞争的
缺点
在多线程环境下,其运行效率比重量级锁还会慢
偏向锁
为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径
主要尽可能避免不必须要的CAS操作,如果竞争锁失败,则升级为轻量级锁
volatile
特性
volatile可见性:对一个volatile的读,总可以看到对这个变量最终的写
volatile原子性:volatile对单个读/写具有原子性(32位Long、Double),但是复合操作除外,例如i++;
实现机制
内存屏障
内存语义
当写一个volatile变量时,JMM会把该线程对应的本地内存中的共享变量值立即刷新到主内存中
当读一个volatile变量时,JMM会把该线程对应的本地内存设置为无效,直接从主内存中读取共享变量
操作系统语义
主存、高速缓存(线程私有)缓存一致?
解决方案
通过在总线加LOCK#锁的方式
通过缓存一致性协议(MESI协议)
内存模型
重排序
happens-before
DCL
单例模式
DCL
重排序
happens-beofre
解决方案
volatile方案
禁止重排序
基于类初始化的解决方案
利用classloder的机制来保证初始化instance时只有一个线程。JVM在类初始化阶段会获取一个锁,这个锁可以同步多个线程对同一个类的初始化
并发基础
AQS
AbstractQueuedSynchronizer,同步器,实现JUC核心基础组件
解决了子类实现同步器时涉及的大量细节问题,例如获取同步状态、FIFO同步队列
采用模板方法模式,AQS实现大量通用方法,子类通过继承方式实现其抽象方法来管理同步状态
CLH同步队列
FIFO双向队列,AQS依赖它来解决同步状态的管理问题
首节点唤醒,等待队列加入到CLH同步队列的尾部
同步状态获取与释放
独占式
获取锁
获取同步状态:acquire
响应中断:acquireInterruptibly
超时获取:tryAcquireNanos
释放锁
release
共享式
获取锁
acquireShared
释放锁
releaseShared
线程阻塞和唤醒
当有线程获取锁了,其他再次获取时需要阻塞,当线程释放锁后,AQS负责唤醒线程
LockSupport
是用来创建锁和其他同步类的基本线程阻塞原语
每个使用LockSupport的线程都会与一个许可关联,如果该许可可用,并且可在进程中使用,则调用park()将会立即返回,否则可能阻塞。如果许可尚不可用,则可以调用 unpark 使其可用
park()、unpark()
CAS
Compare And Swap,整个JUC体系最核心、最基础理论
内存值V、旧的预期值A、要更新的值B,当且仅当内存值V的值等于旧的预期值A时才会将内存值V的值修改为B,否则什么都不干
native中存在四个参数
缺陷
循环时间太长
只能保证一个共享变量原子操作
ABA问题
解决方案
版本号
AtomicStampedReference
锁
ReentrantLock
可重入锁,是一种递归无阻塞的同步机制
比synchronized更强大、灵活的锁机制,可以减少死锁发生的概率
分为公平锁、非公平锁
底层采用AQS实现,通过内部Sync继承AQS
ReentrantReadWriteLock
读写锁,两把锁:共享锁:读锁、排他锁:写锁
支持公平性、非公平性,可重入和锁降级
锁降级:遵循获取写锁、获取读锁在释放写锁的次序,写锁能够降级成为读锁
Condition
Lock 提供条件Condition,对线程的等待、唤醒操作更加详细和灵活
内部维护一个Condition队列。当前线程调用await()方法,将会以当前线程构造成一个节点(Node),并将节点加入到该队列的尾部
并发工具类
CyclicBarrier
它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)
通俗讲:让一组线程到达一个屏障时被阻塞,直到最后一个线程到达屏障时,屏障才会开门,所有被屏障拦截的线程才会继续干活
底层采用ReentrantLock + Condition实现
应用场景
多线程结果合并的操作,用于多线程计算数据,最后合并计算结果的应用场景
CountDownLatch
在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待
用给定的计数 初始化 CountDownLatch。由于调用了 countDown() 方法,所以在当前计数到达零之前,await 方法会一直受阻塞。之后,会释放所有等待的线程,await 的所有后续调用都将立即返回。这种现象只出现一次——计数无法被重置。如果需要重置计数,请考虑使用 CyclicBarrier。
与CyclicBarrier区别
CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待
CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier
内部采用共享锁来实现
Semaphore
信号量
一个控制访问多个共享资源的计数器
从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可。每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore 只对可用许可的号码进行计数,并采取相应的行动
信号量Semaphore是一个非负整数(>=1)。当一个线程想要访问某个共享资源时,它必须要先获取Semaphore,当Semaphore >0时,获取该资源并使Semaphore – 1。如果Semaphore值 = 0,则表示全部的共享资源已经被其他线程全部占用,线程必须要等待其他线程释放资源。当线程释放资源时,Semaphore则+1
应用场景
通常用于限制可以访问某些资源(物理或逻辑的)的线程数目
内部采用共享锁实现
Exchanger
可以在对中对元素进行配对和交换的线程的同步点
允许在并发任务之间交换数据。具体来说,Exchanger类允许在两个线程之间定义同步点。当两个线程都到达同步点时,他们交换数据结构,因此第一个线程的数据结构进入到第二个线程中,第二个线程的数据结构进入到第一个线程中
其他
ThreadLocal
一种解决多线程环境下成员变量的问题的方案,但是与线程同步无关。其思路是为每一个线程创建一个单独的变量副本,从而每个线程都可以独立地改变自己所拥有的变量副本,而不会影响其他线程所对应的副本
ThreadLocal 不是用于解决共享变量的问题的,也不是为了协调线程同步而存在,而是为了方便每个线程处理自己的状态而引入的一个机制
四个方法
get():返回此线程局部变量的当前线程副本中的值
initialValue():返回此线程局部变量的当前线程的“初始值”
remove():移除此线程局部变量当前线程的值
set(T value):将此线程局部变量的当前线程副本中的值设置为指定值
ThreadLocalMap
实现线程隔离机制的关键
每个Thread内部都有一个ThreadLocal.ThreadLocalMap类型的成员变量,该成员变量用来存储实际的ThreadLocal变量副本。
提供了一种用键值对方式存储每一个线程的变量副本的方法,key为当前ThreadLocal对象,value则是对应线程的变量副本
注意点
ThreadLocal实例本身是不存储值,它只是提供了一个在当前线程中找到副本值得key
是ThreadLocal包含在Thread中,而不是Thread包含在ThreadLocal中
内存泄漏问题
ThreadLocalMap
key 弱引用 value 强引用,无法回收
显示调用remove()
Fork/Join
一个用于并行执行任务的框架, 是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架
核心思想
“分治”
fork分解任务,join收集数据
工作窃取
某个线程从其他队列里窃取任务来执行
执行块的线程帮助执行慢的线程执行任务,提升整个任务效率
队列要采用双向队列
核心类
ForkJoinPool
执行任务的线程池
ForkJoinTask
表示任务,用于ForkJoinPool的任务抽象
ForkJoinWorkerThread
执行任务的工作线程
Java并发集合
ConcurrentHashMap
CAS + Synchronized 来保证并发更新的安全,底层采用数组+链表/红黑树的存储结构
重要内部类
Node
key-value键值对
TreeNode
红黑树节点
TreeBin
就相当于一颗红黑树,其构造方法其实就是构造红黑树的过程
ForwardingNode
辅助节点,用于ConcurrentHashMap扩容操作
sizeCtl
控制标识符,用来控制table初始化和扩容操作的
含义
负数代表正在进行初始化或扩容操作
-1代表正在初始化
-N 表示有N-1个线程正在进行扩容操作
正数或0代表hash表还没有被初始化,这个数值表示初始化或下一次进行扩容的大小
重要操作
initTable
ConcurrentHashMap初始化方法
只能有一个线程参与初始化过程,其他线程必须挂起
构造函数不做初始化过程,初始化真正是在put操作触发
步骤
sizeCtl < 0 表示正在进行初始化,线程挂起
线程获取初始化资格(CAS(SIZECTL, sc, -1))进行初始化过程
初始化步骤完成后,设置sizeCtl = 0.75 * n(下一次扩容阈值),表示下一次扩容的大小
put
核心思想
根据hash值计算节点插入在table的位置,如果该位置为空,则直接插入,否则插入到链表或者树中
真实情况较为复杂
步骤
table为null,线程进入初始化步骤,如果有其他线程正在初始化,该线程挂起
如果插入的当前 i 位置 为null,说明该位置是第一次插入,利用CAS插入节点即可,插入成功,则调用addCount判断是否需要扩容。若插入失败,则继续匹配(自旋)
若该节点的hash ==MOVED(-1),表示有线程正在进行扩容,则进入扩容进程中
其余情况就是按照链表或者红黑树结构插入节点,但是这个过程需要加锁(synchronized)
get
步骤
table ==null ;return null
从链表/红黑树节点获取
扩容
多线程扩容
步骤
构建一个nextTable,其大小为原来大小的两倍,这个步骤是在单线程环境下完成的
将原来table里面的内容复制到nextTable中,这个步骤是允许多线程操作
链表转换为红黑树过程
所在链表的元素个数达到了阈值 8,则将链表转换为红黑树
红黑树算法
1.8 与 1.7的区别
ConcurrentLinkedQueue
基于链接节点的无边界的线程安全队列,采用FIFO原则对元素进行排序,内部采用CAS算法实现
不变性
在入队的最后一个元素的next为null
队列中所有未删除的节点的item都不能为null且都能从head节点遍历到
对于要删除的节点,不是直接将其设置为null,而是先将其item域设置为null(迭代器会跳过item为null的节点)
允许head和tail更新滞后。这是什么意思呢?意思就说是head、tail不总是指向第一个元素和最后一个元素(后面阐述)
head的不变性和可变性
tail的不变性和可变性
精妙之处:利用CAS来完成数据操作,同时允许队列的不一致性,弱一致性表现淋漓尽致
ConcurrentSkipListMap
第三种key-value数据结构:SkipList(跳表)
SkipList
平衡二叉树结构
Skip list让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过“空间来换取时间”的一个算法,
在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率
特性
由很多层结构组成,level是通过一定的概率随机产生的
每一层都是一个有序的链表,默认是升序,也可以根据创建映射时所提供的Comparator进行排序,具体取决于使用的构造方法
最底层(Level 1)的链表包含所有元素
如果一个元素出现在Level i 的链表中,则它在Level i 之下的链表也都会出
每个节点包含两个指针,一个指向同一链表中的下一个元素,一个指向下面一层的元素
查找、删除、添加
ConcurrentSkipListSet
内部采用ConcurrentSkipListMap实现
atomic
基本类型类
用于通过原子的方式更新基本类型
AtomicBoolean
原子更新布尔类型
AtomicInteger
原子更新整型
AtomicLong
原子更新长整型
数组
通过原子的方式更新数组里的某个元素
AtomicIntegerArray
原子更新整型数组里的元素
AtomicLongArray
原子更新长整型数组里的元素
AtomicReferenceArray
原子更新引用类型数组里的元素
引用类型
如果要原子的更新多个变量,就需要使用这个原子更新引用类型提供的类
AtomicReference
原子更新引用类型
AtomicReferenceFieldUpdater
原子更新引用类型里的字段
AtomicMarkableReference
原子更新带有标记位的引用类型
字段类
如果我们只需要某个类里的某个字段,那么就需要使用原子更新字段类
AtomicIntegerFieldUpdater
原子更新整型的字段的更新器
AtomicLongFieldUpdater
原子更新长整型字段的更新器
AtomicStampedReference
原子更新带有版本号的引用类型
阻塞队列
ArrayBlockingQueue
一个由数组实现的FIFO有界阻塞队列
ArrayBlockingQueue有界且固定,在构造函数时确认大小,确认后不支持改变
在多线程环境下不保证“公平性”
实现
ReentrantLock
Condition
LinkedBlockingQueue
基于链接,无界的FIFO阻塞队列
PriorityBlockingQueue
支持优先级的无界阻塞队列
默认情况下元素采用自然顺序升序排序,可以通过指定Comparator来对元素进行排序
二叉堆
分类
最大堆
父节点的键值总是大于或等于任何一个子节点的键值
最小堆
父节点的键值总是小于或等于任何一个子节点的键值
添加操作则是不断“上冒”,而删除操作则是不断“下掉”
实现
ReentrantLock + Condition
二叉堆
DelayQueue
支持延时获取元素的无界阻塞队列
应用
缓存:清掉缓存中超时的缓存数据
任务超时处理
实现
ReentrantLock + Condition
根据Delay时间排序的优先级队列:PriorityQueue
Delayed接口
用来标记那些应该在给定延迟时间之后执行的对象
该接口要求实现它的实现类必须定义一个compareTo 方法,该方法提供与此接口的 getDelay 方法一致的排序。
SynchronousQueue
一个没有容量的阻塞队列
应用
交换工作,生产者的线程和消费者的线程同步以传递某些信息、事件或者任务
难搞懂,与Exchanger 有一拼
LinkedTransferQueue
链表组成的的无界阻塞队列
相当于ConcurrentLinkedQueue、SynchronousQueue (公平模式下)、无界的LinkedBlockingQueues等的超集
预占模式
有就直接拿走,没有就占着这个位置直到拿到或者超时或者中断
LinkedBlockingDeque
由链表组成的双向阻塞队列
容量可选,在初始化时可以设置容量防止其过度膨胀,如果不设置,默认容量大小为Integer.MAX_VALUE
运用
“工作窃取”模式
线程池
好处
降低资源消耗
通过重复利用已创建的线程降低线程创建和销毁造成的消耗
提高响应速度
当任务到达时,任务可以不需要等到线程创建就能立即执行
提高线程的可管理性
进行统一分配、调优和监控
Executor
Executors
静态工厂类,提供了Executor、ExecutorService、ScheduledExecutorService、ThreadFactory 、Callable 等类的静态工厂方法
ThreadPoolExecutor
参数含义
corePoolSize
线程池中核心线程的数量
maximumPoolSize
线程池中允许的最大线程数
keepAliveTime
线程空闲的时间
unit
keepAliveTime的单位
workQueue
用来保存等待执行的任务的阻塞队列
使用的阻塞队列
ArrayBlockingQueue
LinkedBlockingQueue
SynchronousQueue
PriorityBlockingQueue
threadFactory
用于设置创建线程的工厂
DefaultThreadFactory
handler
RejectedExecutionHandler,线程池的拒绝策略
分类
AbortPolicy:直接抛出异常,默认策略
CallerRunsPolicy:用调用者所在的线程来执行任务
DiscardOldestPolicy:丢弃阻塞队列中靠最前的任务,并执行当前任务
DiscardPolicy:直接丢弃任务
线程池分类
newFixedThreadPool
可重用固定线程数的线程池
分析
corePoolSize和maximumPoolSize一致
使用“无界”队列
LinkedBlockingQueue
maximumPoolSize、keepAliveTime、
RejectedExecutionHandler
无效
newCachedThreadPool
使用单个worker线程的Executor
分析
corePoolSize和maximumPoolSize被设置为1
使用LinkedBlockingQueue作为workerQueue
newSingleThreadExecutor
会根据需要创建新线程的线程池
分析
corePoolSize被设置为0
maximumPoolSize被设置为Integer.MAX_VALUE
SynchronousQueue作为WorkerQueue
如果主线程提交任务的速度高于maximumPool中线程处理任务的速度时,CachedThreadPool会不断创建新线程 ,可能会耗尽CPU和内存资源
任务提交
Executor.execute()
ExecutorService.submit()
任务执行
执行流程
线程池调优
两种模型
线程池监控
ScheduledThreadPoolExecutor
继承自ThreadPoolExecutor
给定的延迟之后运行任务,或者定期执行任务
内部使用DelayQueue来实现 ,会把调度的任务放入DelayQueue中。DelayQueue内部封装PriorityQueue,这个PriorityQueue会对队列中的ScheduledFutureTask进行排序
Future
异步计算
Future
提供操作
执行任务的取消
查询任务是否完成
获取任务的执行结果
FutureTask
实现RunnableFuture接口,既可以作为Runnable被执行,也可以作为Future得到Callable的返回值
内部基于AQS实现
Git 命令总结笔记
Git 安装
Git下载地址
https://git-scm.com/downloads
Git安装(Window/Mac)
选择不同系统安装包安装
检验是否安装成功
出现Git Bash命令行工具或Git GUI工具
git --version 查看git安装版本
Git 结构
工作区(Working Directory)
版本库(repository)
暂存区(stage/index)
master
head唯一指向
Git 文件的4种状态
Untracked(未被跟踪的)
此文件在文件夹中, 但并没有加入到git库, 不参与版本控制. 通过git add 状态变为Staged.
Unmodify(文件已经入库)
文件已经入库, 未修改, 即版本库中的文件快照内容与文件夹中完全一致. 这种类型的文件有两种去处, 如果它被修改, 而变为Modified. 如果使用git rm移出版本库, 则成为Untracked文件
Modified(文件已修改)
文件已修改, 仅仅是修改, 并没有进行其他的操作. 这个文件也有两个去处, 通过git add可进入暂存staged状态, 使用git checkout 则丢弃修改过, 返回到unmodify状态, 这个git checkout即从库中取出文件, 覆盖当前修改
Staged(暂存状态)
执行git commit则将修改同步到库中, 这时库中的文件和本地文件又变为一致, 文件为Unmodify状态. 执行git reset HEAD filename取消暂存, 文件状态为Modified
Git基本命令
git init
初始化git仓库
出现.git文件夹
git add
git add
将文件添加到暂存区
git add .
将工作空间下所有文件添加到暂存区(new,modifyed)
git add -A
将工作空间下所有文件添加到暂存区(new,modifyed,delete)
git add -u
将工作空间下所有文件添加到暂存区(modifyed,delete)
git commit
git commit -m <commit message>
将暂存区的文件提交到版本库
git commit -am <commit message>
跳过git add 命令,直接将工作区所有已跟踪的文件提交到版本库,未跟踪的(untracked)文件不能使用该命令
git status
git status -s
git log
git log --graph --oneline
git log --oneline
git config
git全局配置命令
git config --global user.name zivszheng
git config --global user.email zivs.zheng@gmail.com
查看配置
git config --list
单个项目配置
项目父路径/.git/config文件
git stash
git stash
暂存本地修改内容(不想提交修改的内容,想切换分支)
git stash list
查看暂存的历史记录
git stash apple --index
恢复之前暂存的某个记录
git stash drop --index
删除某个暂存记录
git rm
用于从工作区和索引中删除文件
常见使用:删除已经提价到远程仓库的 .idea, .seting 文件/文件夹(项目构建自动生成的)
git rm -r .idea
git commit -m 'remove .idea'
git push origin master
Git commit 解析
commit Object/master/HEAD
tree
项目目录结构
parent
指向上一个commit Object
author/commiter
commit message
查看对象
git cat-file -p HEAD/唯一ID
git cat-file -t HEAD/唯一ID
Git diff
git diff
比较本地工作空间和staged区的差异
git diff -- staged
比较staged区和本地仓库中的差异
git diff HEAD
比较本地工作空间和本地仓库中的差异
Git 撤销操作
git commit --amend
撤销上一次提交将暂存区的文件重新提交(改写提交)
git checkout --filename
拉取暂存区的文件并将其替换工作区的文件
注意与git checkout branchname 区别
git reset HEAD --filename
拉取最近一次提交到版本库中的文件到暂存区,该操作不影响工作区
git reset --option 版本号
--hard
硬回滚(不可逆的),即暂存区,工作区全部用指定提交版本的目录树替换掉
--mixed
mixed或不使用参数,覆盖暂存区,但不覆盖工作区
--soft
软回滚,不进行暂存区和工作区的覆盖
Git 分支
git 分支创建、修改、删除、切换
git branch
查看分支
git branch
创建分支
git branch -m
修改分支名称
git checkout
切换分支
git checkout -b
创建并切换分支
git branch -d
删除分支
分支合并
git merge
合并指定分支到当前分支(Fast forward)
git merge -no-ff -m <commit message>
合并指定分支到当前分支(-no-ff 参数表示禁用Fast forward)
查看分支来自哪一个分支
git reflog --date=local | grep <branchname>
Git远程仓库
git clone
git clone http://gitlab.xqchuxing.com/gittest/xqchuxing-test.git
git remote
git remote -v
查看远程信息
git push
git push -u origin master
将本地上分支上推到
git pull
git pull origin dev:master
获取远程的dev分支和本地的master分支合并
git pull origin dev
获取远程的dev分支和当前分支合并,实际是先执行git fetch 后再执行git merge
git fetch
git fetch origin dev
获取远程dev分支但不做合并
关联远程仓库
git remote add origin http://gitlab.xqchuxing.com/gittest/xqchuxing-test.git
Git tag
git tag
查看当前所有tag
git tag
创建tag
git tag
创建一个指向某一次提交的tag
git tag -a -m <message>
git show
查看tag
Git Help
git help
git help <command>
官网文档地址 https://git-scm.com/book/zh/v2
Docker总结笔记
介绍
Docker是什么
出现的原因
设计理念
能干什么
企业级
美团
京东
开发和运维
获取
www.docker.com
www.docker-cn.com
仓库
hub.docker.com
架构
安装
参考官方文档
配置仓库地址
组成
镜像
容器
仓库
命令
帮助命令
docker version
docker info
docker --help
镜像命令
docker images
-a 列出所有镜像
-q 只显示镜像ID
--digests:显示摘要信息
--no-trunc:不截断输出,显示完整的镜像ID
docker search 镜像名
docker rmi 删除镜像
删除单个 docker rmi 镜像id/镜像名称
删除多个镜像 docker rmi id1 id2
删除全部镜像 docker rmi ${docker images -qa}
docker 运行命令
新建并运行
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
OPTIONS --name为容器指定新名称
-d 后台运行
-i交换方式运行
-t伪终端
-p端口映射
-P随机端口映射
列出所有运行的容器
docker ps [options]
-a :所有正在运行和运行过的
-l: 显示最近创建的容器
-n:显示最近创建的n个容器
-q:只显示容器id
退出容器
exit / ctrl + d:退出并停止容器
ctrl+p+q:退出不停止容器
启动容器
docker start 容器id/名称
重启容器
docker restart 容器id/名称
停止容器
docker stop 容器id/名称
强制停止所有容器
docker kill 容器id/名称
删除容器
docker rm 容器id/名称
删除所有容器
docker rm -f $(docker ps -aq)
docker ps -a -q | xargs docker rm
以后台方式运行容器
docker run -d 容器
进入正在运行的容器,并以前台方式运行
docker exec -t 容器id/名称 bashshell 产生新的进程
docker attach 容器id/名称 进入容器不产生新的进程
容器 <->拷贝文件<->主机
docker copy 容器id/名称:容器中路径 主机路径
docker copy 主机路径 容器id/名称:容器中路径
镜像
是什么
UnionFS(联合文件系统)
镜像加载原理
分层镜像
为什么采用这种设计
docker commit 镜像提交
docker commit -m="" -a="作者" 容器id 目标镜像名称:[标签名]
网络
单机
Bridge Network
Host Network
None Network
多机
Overlay Network
Dockerfile介绍
是什么
执行流程
关键字
FROM
基础镜像,当前镜像是基于那个镜像
MAINTAINER
镜像维护者的姓名和邮箱地址
RUN
镜像构建时需要运行的命令
WORKDIR
容器创建后,默认在那个目录
EXPOSE
当前容器对外暴露的接口
ENV
用来构建镜像时设置环境变量
ADD
将宿主机目录下的文件copy到镜像且ADD命令会自动解压压缩包
COPY
VOLUME
容器数据卷,用来保存和持久化
CMD
指定容器启动时需要运行的命令
多条CMD命令,只有最后一条生效
CMD命令会被docker run之后的参数替换
ENTRYPOINT
指定容器启动过程中需要运行的命令
把docker run命令的参数追加到后面
ONBUILD
数据卷
是什么
能干什么
数据卷
数据容器卷
是什么
能干什么
日志系统存储(典型场景)
使用
docker run -it --name n1 --volumes-from n0 centos
容器
"牛码社"
一个针对Java服务端同学维护一片高效、纯净、互动互助学习社区
一个针对Java服务端同学维护一片高效、纯净、互动互助学习社区
0 条评论
下一页