Java学习线路图 | |||||
学习阶段 | 学习目标 | 知识点细化 | 可达成学习效果 | 配套视频教程 | 配套视频教程 |
第一阶段: Java基础 |
掌握基本语法、面向对象、常用类、正则、集合、Io流、多线程、Nio、网络编程、JDK新特性、函数式编程 | 1. DOS命令,JAVA发展简史,JAVA体系,JAVA的特性 2. 安装jdk, 配置环境变量,安装编译工具,第一个HelloWorld 3. 文档注释,单行注释,多行注释 4. 二进制,进制转换 5. 标识符,命名规则,命名习惯,关键字,保留字 6. 八种基本数据类型,常量,变量,运算符,表达式 7. 执行语句, if 语句, switch case语句 8. while, do-while 循环 9. for 循环,特殊流程控制 10. 方法,方法重载,递归算法 11. OOP(面向对象的设计思想) 12. 对象的创建和内存,构造方法的定义, this 关键字 13. 封装和集成, static ,super 关键字 14. 方法重写 15. 访问权限,转型和多态, Object 类 16. final 关键字 17. Eclipse,数组, Arrays 工具类,可变参数,二维数组,内部类,设计模式 18. 单例设计模式,工厂设计模式 19. 包装类和字符串 20. 正则表达式,枚举 21, 泛型, Iterator 迭代, List 接口, Set,Map,Collections 22. File,IO 流,转换流 23. 缓冲流,内存流 24. 对象流, Properties 类,装饰者设计模式 25. 多线程的三种实现,线程的常用方法,线程的生命周期,线程同步 26. 网络编程, TCP/IP,UDP 27. NIO, Channel,Buffer 28. Selector,FileChannel 29 JDK8新特性 30. JDK9新特性 31. JDK10新特性 32. 反射 33. 阶段考试 |
学完此阶段可以从事的岗位:数据采集与嵌入式交互,获取数据的简单爬虫; 学完此阶段可以拿到的薪资水平是:5K | Java基础教程-Java基础 https://pan.baidu.com/s/1esst0CDU7DsF2ALJGy6F6g | 千锋Java基础教程-Java基础 https://pan.baidu.com/s/1esst0CDU7DsF2ALJGy6F6g |
第二阶段:Javaweb | 掌握数据库(MySQL)、前端(Html5、CSS3、JS、BootStrap、jQuery)、后端技术(Servlet、Filter、Listener、JSP)、会话跟踪技术(Cookie、Session)、版本控制器(SVN)、在线支付 | 34. 数据库简介和安装, DML 操作, DQL 查询数据 35. 数据的完整性,多表查询 36. 视图,索引 37. SQL 注入,批处理,数据库事务 38. C3P0连接池, Druid 连接池 39. DBUtils 工具类封装 40. Html 简介, Html 基本标签, Html 表单标签 41. CSS 简介, CSS 导入方式, CSS 选择器, CSS 属性 42. CSS盒子模型, CSS 扩展属性 43.Bootstrap 44. SVN 45. JavaScript基本语法 46. 函数,弹窗函数,事件, JavaScript 正则表达式 47. JavaScript 的 DOM,BOM 48.JavaScript 定时任务 49 Tomcat,XML 50. Dom4j 解析 XML 51.SAX 解析 52. XML 生成 53. Http 协议 54. Servlet 生命周期 55. Servlet 跳转 56. HttpServletRequest,HttpServletResponse 57. Servlet 新特性 58. Cookie,Session 59. URL 重写 60. 过滤器 Filter, 监听器 Listener 61. Jsp,Jsp 内对象 62. EL 表达式, JSTL 63. JSON 语法,JSON 解析, JSON 生成 64. Gson,FastJson,Jackson工具 65. Ajax 简介, Ajax 工作原理, Ajax 核心 66. Ajax 综合案例 67. jQuery概述, jQuery作用,jQuery引用 68. jQuery语法, jQuery选择器,jQuery时间 69. jQuery效果, jQuery HTML 70. jQuery Ajax, jQuery 插件 71. Validate 插件, Moment 插件 72. MVC 模式 73. 阶段考试 74. 阶段考试 |
学完此阶段可以胜任的岗位是:中级开发工程师; 可以达到的薪资水平:5-8K。 | Java中级教程-JavaWeb https://pan.baidu.com/s/1QrSYwJjarFn6XhQ5jxmzqA Java中级教程-JavaWeb实战讲解 https://pan.baidu.com/s/1V51sQiIKnxHU-KOPrUv4Wg |
千锋Java中级教程-JavaWeb https://pan.baidu.com/s/1QrSYwJjarFn6XhQ5jxmzqA 千锋Java中级教程-JavaWeb实战讲解 https://pan.baidu.com/s/1V51sQiIKnxHU-KOPrUv4Wg 更多最新Java实战教程欢迎进群,不定期更新! Q交流群:421475630 |
第三阶段: Java框架 |
掌握主流的企业级框架,开发和管理工具(Maven、Git、Idea)、Spring、webMVC框架(SpringMVC、Struts2)、ORM框架(Hibernate、MyBatis)、权限管理(Shiro)、工作流(Activite)、POI、Echarts、Spring新特性 | 75. Maven 和 Maven私服Nexus 76. IntellijIDEA 77. MarkDown 78. Git 79. LayUI 80. Mybatis 81. Spring5 82. SpringMVC 83. SSM 项目整合练习 84. Struts2 85. Hibernate 86. Hibernate Validate 87. HttpClient 88. RESTful API 89. Shiro 90. Activiti 91. POI 92. Echarts 93. 阶段考试 |
学完此阶段可以胜任的岗位:常见中小型互联网项目开发, OA/CRM/ERP 系统开发, APP 服务端开发等等,中高级工程师; 学完此阶段可以达到的薪资水平:8-12K | Java中级教程-Java框架 https://pan.baidu.com/s/1_JiTs1GMF9AwZfzsBid7Yw | 千锋Java中级教程-Java框架 https://pan.baidu.com/s/1_JiTs1GMF9AwZfzsBid7Yw |
第四阶段: Java+云数据 |
完成金融/电商类大型分布式项目/APP 服务端项目 | 94. 项目架构演进 95. Linux 常用命令 96. Linux 安装 JDK,MySQL 97. Nginx 安装, 负载均衡,反向代理 98. Redis 安装,常见数据类型 99. Redis 集群,高可用 100. SpringDataRedis 101. Zookeeper 102. Dubbo 103. WebMagic 104. Quartz 105. FreeMarker 106. OSS 107. CAS 单点登录 108. SpringBoot 109. Thymeleaf 110. MyCat 111. KeepAlive 112. Elasticsearch 113. Solr 114. ActiveMQ 115. RabbitMQ 116. RocketMQ 117. FastDFS 118. Oracle 119. Docker 120. SpringCloud Eureka 121. SpringCloud Ribbon 122. SpringCloud Feign 123. SpringCloud Hystrix 124. SpringCloud Zuul 125. SpringCloud Config 126. SpringCloud ZipKin 127. SpringCloud Sleuth 128. SpringBoot Admin 129. Jenkins 130. ELK 131. GitLab Runner 132. Kuberntes 133. Zbus 134. 微信小程序 135. 微信公众号 136. 微信支付 137. 微信提现 137. 模拟面试 |
学完此阶段可以胜任的岗位:大型超大型互联网项目开发高级工程师; 学完此阶段可以达到的薪资水平:10-20K。 |
Java高级教程-Java+云数据 https://pan.baidu.com/s/1z3isOaABElQE3_GaugQCSQ | 千锋Java高级教程-Java+云数据 https://pan.baidu.com/s/1z3isOaABElQE3_GaugQCSQ Java技术交流欢迎加Q群421475630 |
——————————————————面试题————————————————————————————
包括HDFS和Mapreduce两部分。
1)HDFS自动保存多个副本,移动计算。缺点是小文件存取占用namenode内存,写入只支持追加,不能随机修改。
它存储的逻辑空间称为block,文件的权限类似linux。整体架构分三种节点,NN,SNN,DN
NN 负责读写操作保存metadata(Ownership Permission blockinfo)
SNN 负责辅助NN合并fsimage和edits,减少nn启动时间
DN 负责存数据,每个数据(文件)分割成若干block,每个block默认3个副本。启动后像NN发送心跳保持联系
NN保存的metadata在hdfs启动后加载到计算机内存,除block位置信息的metadata保存在OS文件系统中的fsimage文件中,对metadata的操作日志保存在OS文件系统中的edits文件中。block位置信息是hdfs启动后由DN上报NN再加载到内存的。
HDFS的安全模式:直到NN完全加载完metadata之前的这段时间。期间不能写入文件,DN检查各个block完整性,并修复。
2)MapReduce
离线计算框架,过程分为split map shuffle reduce四个过程
架构节点有:Jobtracker TaskTracker
Split将文件分割,传输到mapper,mapper接收KV形式的数据,经过处理,再传到shuffle过程。
Shuffle先进行HashPartition或者自定义的partition,会有数据倾斜和reduce的负载均衡问题;再进行排序,默认按字典排序;为减少mapper输出数据,再根据key进行合并,相同key的数据value会被合并;最后分组形成(key,value{})形式的数据,输出到下一阶段
Reduce输入的数据就变成了,key+迭代器形式的数据,再进行处理
逻辑上:
1、split
2、map
3、shuffle
4、reduce
四个过程
物理上:
JobTracker节点:JobTracker创建每一个Task(即MapTask和ReduceTask)
并将它们分发到各个TaskTracker服务中去执行。负责调度Job的每一个子任务task运行于TaskTracker上。
TaskTracker节点:运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker都需要运行在HDFS的DataNode上
1) client端发送写文件请求,namenode检查文件是否存在,如果已存在,直接返回错误信息,否则,发送给client一些可用namenode节点
2) client将文件分块,并行存储到不同节点上datanode上,发送完成后,client同时发送信息给namenode和datanode
3) namenode收到的client信息后,发送确信信息给datanode
4) datanode同时收到namenode和datanode的确认信息后,提交写操作。
数据样本:
A:B,C
B:A,E
C:A,D
D:C
E:B
import java.io.IOException;
import java.util.ArrayList;
//import java.util.Collection;
//import java.util.Map.Entry;
//import java.util.HashMap;
import java.lang.Iterable;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.fs.Path;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
//import org.apache.hadoop.io.IntWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.util.ToolRunner;
import org.apache.hadoop.util.Tool;
import org.apache.commons.lang.StringUtils;
public class FindUsers extends Configured implements Tool {
static class Map extends Mapper
public void map(LongWritable key, Text val, Context context) throws IOException, InterruptedException {
String line = val.toString();
String user = line.split(":")[0];
String[] friends = line.split(":")[1].split(",");
String joined_friends = StringUtils.join(friends, ",");
for(String friend : friends) {
int result = friend.compareTo(user);
if(result > 0) {
context.write(new Text(user + "," + friend), new Text(joined_friends));
}
else if(result < 0) {
context.write(new Text(friend + "," + user), new Text(joined_friends));
}
}
}
}
static class Reduce extends Reducer
public void reduce(Text key, Iterable
String string_key = key.toString();
String[] users = string_key.split(",");
ArrayList
int i = 0;
String state = "Off";
for(Text val : vals) {
i++;
String[] all_people = val.toString().split(",");
ArrayList
if(state.equals("Off")) {
for(String one_people: all_people) {
list.add(one_people);
state = "On";
continue;
}
}
if( state.equals("On")) {
for(String one_people: all_people) {
inner_list.add(one_people);
}
}
list.retainAll(inner_list);
}
if( ! users[0].equals(users[1])) {
for(String user : users) {
if(list.contains(user)) list.remove(user);
}
if(list.size() >= 1 && i >=2) {
context.write(new Text(StringUtils.join(users, ",")), new Text(StringUtils.join(list,",")));
}
}
}
}
@Override
public int run(String[] args) throws Exception {
Job job = Job.getInstance(getConf());
job.setJarByClass(getClass());
job.setMapperClass(Map.class);
job.setReducerClass(Reduce.class);
//job.setNumReduceTasks(0);
job.setMapOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
job.setInputFormatClass(TextInputFormat.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
return job.waitForCompletion(true) ? 0 : 1;
}
public static void main(String[] args) throws Exception {
ToolRunner.run(new FindUsers(), args);
}
}
输入文件格式:二级域名,一级频道,二级频道,访问ip地址,访问者id
需求:按照二级域名,一级频道,二级频道分组,计算pageview数,计算独立ip数和独立访问者id数
当map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使用Combiner,Combiner号称本地的Reduce,Reduce最终的输入,是Combiner的输出
5种写法,1、懒汉2、恶汉3、静态内部类4、枚举5、双重校验锁
1、
class LazySingleton{
private static LazySingleton singleton;
private LazySingleton(){
}
public static LazySingleton getInstance(){
if(singleton==null){
singleton=new LazySingleton();
}
return singleton;
}
}
2、
class HungrySingleton{
private static HungrySingleton singleton=new HungrySingleton();
private HungrySingleton(){}
public static HungrySingleton getInstance(){
return singleton;
}
}
3、
class InternalSingleton{
private static class SingletonHolder{
private final static InternalSingleton INSTANCE=new InternalSingleton();
}
private InternalSingleton(){}
public static InternalSingleton getInstance(){
return SingletonHolder.INSTANCE;
}
}
4、
enum EnumSingleton{
INSTANCE;
public void doSomeThing(){
}
}
5、
class LockSingleton{
private volatile static LockSingleton singleton;
private LockSingleton(){}
//详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
public static LockSingleton getInstance(){
if(singleton==null){
synchronized(LockSingleton.class){
if(singleton==null){
singleton=new LockSingleton();
}
}
}
return singleton;
}
}
ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。
1)重要信息:MD5,AES加密
2)不太重要的数据:用签名
3)登录态:
自动监测对象是否超过作用域从而达到自动回收内存的机制,Java语言没有提供
释放已分配内存的显式操作方法。
Public class MyStack{
Private ArrayList data = new ArrayList();
Public Boolean pop(){}
Public Boolean push(){}
}
implicit
1)x、y都是var,x变为Unit
2)都是val,报错
堆内存、栈内存、方法区
栈内存:保存局部变量
堆内存:存储数组和对象
方法区:代码区、字符串常量池、静态区
Scala的代码执行是用REPL过程,Read Execute Print Loop
通电后读取ROM的BIOS程序进行硬件自检,自检成功后把计算机控制权交给BIOS中BOOTsequence中的下一个有效设备,读取该设备MBR找到操作系统,载入linux的bootloader,一般是grub。之后载入kernel,执行 /etc/rc.d/sysinit ,开启其他组件(/etc/modules.conf),执行运行级别,执行/etc/rc.d/rc.local ,执行/bin/login,最后shell启动。
Struts2
Spring
hibernate
mybatis
hadoop
hive
hbase
flume
sqoop
Zookeeper
Mahout
Kafka
Storm
Spark
Hadoop。介绍
底层是MapReduce,所以又可以说是MapReduce优化。
Hbase节点运行很慢,发现是Hfile过小,hbase频繁split。
修改了hfile大小。或者设置major compack设置为手动
?
Mogodb是单机
Hbase是分布式??
建表时就分区,rowkey设置定长(64字节),CF2到3个
Max Versio,Time to live,Compact&Split
多Htable并发写
Htable参数设置,手动flush,降低IO
WriteBuffer
批量写
多线程并发写
多Htable并发读
Htable参数设置
批量读
释放资源
缓存查询结果
1. 任务调度
I/O 方面:Hadoop 会尽量将 Map 任务分配给 InputSplit 所在的机器,以减少网
络 I/O 的消耗。
2.数据预处理与 InputSplit 的大小
合理地设置 block块大小是很重要的调节方式。除此之外,也可以通过合理地
设置 Map 任务的数量来调节 Map 任务的数据输入。
3. Map 和 Reduce 任务的数量
当 Reduce 任务的数量是任务槽的 1.75 倍时,执行速度快的机器可以获得更多
的 Reduce 任务,因此可以使负载更加均衡,以提高任务的处理速度。
4. Combine 函数
MapReduce 框架运行用户写的 combine 函数用于本地合并,这会大大减少网
络 I/O 操作的消耗
1、建立视图
2、优化 sql 语句
3、分表、分库
4、存储过程
1、 用户文件 2 个属性 10 万行,课程文件 2 个属性 2 万行,日志文件 1 个属性很
大,这些属性可以任意的组合查询,每秒的请求数是 10000 个,请如何最快的方式查
询出数据?
2、给你 2 个字符串,字符串最后一个字符可以循环到最前面,只要一个字符串中每
一个字符在另一个字符串都有就是相等的,请用你的方法比较是否相等?
3、任意使用MR或者Storm或者hive根据日志表,求20150501当天每个用户访问页面次数的前10的页面,日志表如下:
Userid pageid viste date
Aa 222 20150501
Aa 333 20150501
Aa 222 20150501
Aa 222 20150502
Bb 333 20150501
Cc 333 20150502
4、Hbase的major compact和minor compact的区别
5、A表有三个字段,id,name,age,id为主键,去除该表中name重复的数据,用mysql语法实现(千万级别查询量、考虑Sql语法的复杂性)
6、算法:TB级别数据排序
1)单机实现 2)分布式实现
7、static synchronized final volatile
8、concurrentHashMap的数据结构和应用场景
9、多线程的3种实现,说明他们的优缺点
10、JVM的内存模型,GC在何时何地,做了什么事情
11、用java实现LRU缓存
12、实现单例,要求:线程安全、锁的性能
13、目录拷贝功能:目录下上万文件需要拷贝备份,拷贝同时输出进度
14、jps命令作用
15、a和b两个文件各存放80亿URL,每个URL64字节,内存限制为4G,如何找出共同的URL
16、start-hbase.sh为起点hbase的启动流程
17、hbase的compact