2019最新JAVA学习路线-技术要点-面试题

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. 阶段考试
学完此阶段可以从事的岗位:数据采集与嵌入式交互,获取数据的简单爬虫;                     学完此阶段可以拿到的薪资水平是:5KJava基础教程-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-12KJava中级教程-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

 

——————————————————面试题————————————————————————————

第一套

1.hadoop运行原理

包括HDFS和Mapreduce两部分。

1HDFS自动保存多个副本,移动计算。缺点是小文件存取占用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完整性,并修复。

2MapReduce

离线计算框架,过程分为split map shuffle reduce四个过程

架构节点有:Jobtracker TaskTracker

Split将文件分割,传输到mapper,mapper接收KV形式的数据,经过处理,再传到shuffle过程。

Shuffle先进行HashPartition或者自定义的partition,会有数据倾斜和reduce的负载均衡问题;再进行排序,默认按字典排序;为减少mapper输出数据,再根据key进行合并,相同key的数据value会被合并;最后分组形成(key,value{})形式的数据,输出到下一阶段

Reduce输入的数据就变成了,key+迭代器形式的数据,再进行处理

2.MapReduce原理

逻辑上:

1、split

2、map

3、shuffle

4、reduce

四个过程

物理上:

JobTracker节点:JobTracker创建每一个Task(即MapTask和ReduceTask)

并将它们分发到各个TaskTracker服务中去执行。负责调度Job的每一个子任务task运行于TaskTracker上。

TaskTracker节点:运行在多个节点上的slaver服务。TaskTracker主动与JobTracker通信,接收作业,并负责直接执行每一个任务。TaskTracker都需要运行在HDFS的DataNode上

 

3.hdfs存储机制

1) client端发送写文件请求,namenode检查文件是否存在,如果已存在,直接返回错误信息,否则,发送给client一些可用namenode节点
2) client将文件分块,并行存储到不同节点上datanode上,发送完成后,client同时发送信息给namenode和datanode
3) namenode收到的client信息后,发送确信信息给datanode
4) datanode同时收到namenode和datanode的确认信息后,提交写操作。

4.用MapReduce找出存在公共好友的两个人

数据样本:

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<LongWritable, Text, Text, Text> {

        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<Text, Text, Text, Text> {

        public void reduce(Text key, Iterable<Text> vals, Context context) throws IOException, InterruptedException {

            String string_key = key.toString();

            String[] users = string_key.split(",");

            ArrayList<String> list = new ArrayList<String>();

           

            int i = 0;

            

            String state = "Off";

            for(Text val : vals) {

                i++;

                String[] all_people = val.toString().split(",");

                ArrayList<String> inner_list = new ArrayList<String>();

               

                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);

       

    }

}

 

5.用mr设计一个分组排重计数算法

输入文件格式:二级域名,一级频道,二级频道,访问ip地址,访问者id

需求:按照二级域名,一级频道,二级频道分组,计算pageview数,计算独立ip数和独立访问者id数

 

6.hadoop中combiner的作用

map生成的数据过大时,带宽就成了瓶颈,怎样精简压缩传给Reduce的数据,有不影响最终的结果呢。有一种方法就是使用CombinerCombiner号称本地的ReduceReduce最终的输入,是Combiner的输出

第二套

  1. 单例

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;

    }

    

}

  1. Linkedlist和ArrayList的区别

 ArrayList是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢。LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。

 

3.http安全问题

         1)重要信息:MD5,AES加密

         2)不太重要的数据:用签名

         3)登录态:

4.sparkStreaming和storm的区别

 

5.gc

自动监测对象是否超过作用域从而达到自动回收内存的机制,Java语言没有提供

释放已分配内存的显式操作方法。

 

 

第三套·乐视

1.design a singleton class in multi-threading environment.

2.How to find middle element of linkedlist in one pass.

3.Reverse singly linked list in java recursively.

4.Write a java program to implement Stack in java.

Public class MyStack{

         Private ArrayList data = new ArrayList();

         Public Boolean pop(){}

         Public Boolean push(){}

}

  1. scala 隐函数关键字

implicit

  1. val x=y=1结果

1)x、y都是var,x变为Unit

2)都是val,报错

3.java内存模型

堆内存、栈内存、方法区

栈内存:保存局部变量

堆内存:存储数组和对象

方法区:代码区、字符串常量池、静态区

  1. spark运行的job在哪里可以看到

 

  1. HADOOP的一个job提交到resourcemanager之后,会生成什么容器来放这个job

 

 

 

 

第四套·优酷

  1. java内存模型

2.gc

3.编译好的scala程序,运行时还需要scala环境吗

Scala的代码执行是用REPL过程,Read Execute Print Loop

4.object中有哪些方法

5.监测集群中的cpu,内存使用情况?

6、ArrayList中的Array长度超了是怎么增加的,一次增加多少?

 

 

第五套

linux的启动顺序

通电后读取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。介绍

HIVE的优化

底层是MapReduce,所以又可以说是MapReduce优化。

  1. 小文件都合并成大文件
  2. Reducer数量在代码中介于节点数*reduceTask的最大数量的0.95倍到1.75倍
  3. 写一个UDF函数,在建表的时候制定好分区
  4. 配置文件中,打开在map端的合并

开发中遇到的问题

Hbase节点运行很慢,发现是Hfile过小,hbase频繁split。

修改了hfile大小。或者设置major compack设置为手动

Major compack设置为手动会出现什么问题

Zookeeper的二次开发

 

Flume 的实时和定时数据采集,项目和flume的解耦

 

Mogodb和hbase的区别

Mogodb是单机

Hbase是分布式??

项目组多少人?人员分配?数据量?集群的配置?

 

 

 

第六套·优化相关

Hbase优化

  1. 表设计

建表时就分区,rowkey设置定长(64字节),CF2到3个

Max Versio,Time to live,Compact&Split

  1. 写表

多Htable并发写

Htable参数设置,手动flush,降低IO

WriteBuffer

批量写

多线程并发写

  1. 读表

多Htable并发读

Htable参数设置

批量读

释放资源

缓存查询结果

MapReduce优化

  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 操作的消耗

Oracle优化

1、建立视图

2、优化 sql 语句

3、分表、分库

4、存储过程

Spark优化

第七套·scala

scala 语言有什么特点,什么是函数式编程?有什么优点

 

2.scala 伴生对象有什么作用

3.scala 并发编程是怎么弄得,你对 actor 模型怎么理解有何优点

4.scala case class  有什么重要

5.scala akka 框架有没有接触过,有什么重要

6.scala 为什么设计 var   和 val

 

 

第八套·spark

SDD,DAG,Stage怎么理解?

宽依赖 窄依赖怎么理解?

Stage是基于什么原理分割task的?

血统的概念

任务的概念

容错方法

粗粒度和细粒度

Spark优越性

Spark为什么快

Transformation和action是什么?区别?举几个常用方法

SDD怎么理解

spark 作业提交流程是怎么样的,client和 cluster 有什么区别,各有什么作用

spark on yarn  作业执行流程,yarn-client  和 yarn cluster 有什么区别

spark streamning 工作流程是怎么样的,和 storm 比有什么区别

spark sql  你使用过没有,在哪个项目里面使用的

spark  机器学习和 spark 图计算接触过没,,能举例说明你用它做过什么吗?

spark sdd 是怎么容错的,基本原理是什么?

 

 

第九套·java

1.关于 string 的选择题

2.修饰符

3.两个整数相除,保存到百分位

4.写个封装,抽象,继承,多态的类集。

5.jsp 的作用域的描述。

6.如何得到 jsp 的参数。

7.写几个 SQL 语句。

 

 

第十套·美团(3-7)

1.  说说 hbase 的 API 都有哪些 filter?

2.  说说你用过的 storm?

3.  自己熟悉大数据的部分说一下?

4. hadoop 与 storm、spark 的比较?

5.  对一个字符串进行全排列?

6. 事务都有哪些特点?

7. hadoop 集群中的某个 block 不能 copy 数据到其他节点,怎么办?如果并发量大

了, 有多个 block不能 copy 数据,怎么办?

8. flum 是如何导入数据到 kafka?具体

9. 请使用 awk, sed 命令对文本文件中第二列和第三列取出来(58同城)

 

 

 

 

 

 

 

 

其他整理

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

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值