diff --git a/README.md b/README.md
index 4832fe5..25ed4de 100644
--- a/README.md
+++ b/README.md
@@ -4,4 +4,18 @@
## 编程书籍思维导图
* [Java](program-book/java.md)
+## 用好面试题
+* [Java](program-interview/java-baidu-200.md)
+## 用好教程
+* Java
+ * [J2SE官方教程](program-blog/java-oracle-learn-path.md)
+
+## 编程技术
+* [微信小程序](program-tool/weixin-app.md)
+
+## 技术词汇表
+* [Java](program-vocabulary/java.md)
+
+## 工具
+* [搜索技巧](program-tool/search-skill.md)
\ No newline at end of file
diff --git a/program-blog/java-oralce-learn-path.md b/program-blog/java-oralce-learn-path.md
new file mode 100644
index 0000000..0d9f551
--- /dev/null
+++ b/program-blog/java-oralce-learn-path.md
@@ -0,0 +1,48 @@
+# Java学习路径
+
+> [Java learning path(Oracle)](https://docs.oracle.com/javase/tutorial/tutorialLearningPaths.html)
+
+此教程适用JDK8,所有例子均未用到后续版本的高级特性。
+
+无论你是学习Java语言的新手,还是想要拓展技能的专业程序员,这里提供了Java平台的最新技术学习路径。
+
+## Java新手
+ 针对Java新手有以下推荐教程:
+
+* [新手上路](https://docs.oracle.com/javase/tutorial/getStarted/index.html):Java技术介绍,开发软件安装,创建一个简单的程序
+* [学习Java语言](https://docs.oracle.com/javase/tutorial/java/index.html):学习基本概念,类、对象、继承、数据类型、泛型和包
+* [Java类基础](https://docs.oracle.com/javase/tutorial/essential/index.html):学习异常、基本输入输出、并发、正则表达式和平台开发环境
+
+## 高级技术
+打好了基础要深入?可以学习下列教程:
+
+* [Collections](https://docs.oracle.com/javase/tutorial/collections/index.html):学习使用和扩展Java集合框架
+* [Lambda表达式](https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html):了解为什么以及如何在应用中使用Lambda表达式
+* [聚合操作](https://docs.oracle.com/javase/tutorial/collections/streams/index.html):探索如何使用聚合操作、流和Lambda表达式完成强大的过滤操作
+* [打包程序到JAR文件](https://docs.oracle.com/javase/tutorial/collections/streams/index.html):学习创建JAR文件并签名
+* [国际化](https://docs.oracle.com/javase/tutorial/i18n/index.html):介绍如何设计软件可以方便地本地化
+* [反射](https://docs.oracle.com/javase/tutorial/reflect/index.html):对当前Java虚拟机中的类、接口、对象提供“反射”功能的API
+* [安全](https://docs.oracle.com/javase/tutorial/security/index.html):Java平台的保护机制,免除恶意软件影响
+* [JavaBeans](https://docs.oracle.com/javase/tutorial/javabeans/index.html):Java平台的组件技术
+* [扩展机制](https://docs.oracle.com/javase/tutorial/ext/index.html):如何为所有运行Java平台的应用提供自定义API
+* [泛型](https://docs.oracle.com/javase/tutorial/extra/generics/index.html):类型系统的一种增强技术,可以在确保编译时类型安全的前提下支持多种对象操作
+
+## 偏爱客户端?
+如果你希望开发基于Java的桌面解决方案和富Internet应用程序,可以学习下列教程:
+
+* [JavaFX入门](http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JFXST804):一组精心设计的示例应用程序让你可以快速熟悉常用JavaFX任务
+* [Scene Builder入门](http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JSBGS101):一步步指导如何使用JavaFX Scene Builder快速创建bug追踪应用程序
+* [使用Swing开发GUI程序](https://docs.oracle.com/javase/tutorial/uiswing/index.html):一个完整的Java平台GUI案例
+* [部署](https://docs.oracle.com/javase/tutorial/deployment/index.html):如何使用JAR文件打包应用和applet,使用Java Web Start和Java插件发布
+* [2D图形](https://docs.oracle.com/javase/tutorial/2d/index.html):如何显示并打印2D图形
+* [全屏幕独占模式API](https://docs.oracle.com/javase/tutorial/extra/fullscreen/index.html):如何编写完全利用图形设备的应用程序
+
+## 大爱Server
+如果你喜欢中间件、服务端应用或者web应用开发,可以学习下列教程:
+
+* [JDBC数据库访问](https://docs.oracle.com/javase/tutorial/jdbc/index.html):介绍Java应用和数据库、数据源之间连接的API
+* [JMX](https://docs.oracle.com/javase/tutorial/jmx/index.html):Java管理扩展,提供了一种对应用、设备和服务的资源管理标准方法
+* [JNDI](https://docs.oracle.com/javase/tutorial/jndi/index.html):Java命名和目录接口,可以访问命名和目录服务,例如DNS和LDAP
+* [JAXP](https://docs.oracle.com/javase/tutorial/jaxp/index.html):介绍了XML处理技术(JAXP) 1.4技术
+* [RMI](https://docs.oracle.com/javase/tutorial/rmi/index.html):远程方法调用API,可以运行另一个Java虚拟上运行对象的方法
+* [并发](https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html):开发多线程用到的API
diff --git a/program-blog/wexin-app/learn-weixin-app-day1.md b/program-blog/wexin-app/learn-weixin-app-day1.md
new file mode 100644
index 0000000..aee6321
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day1.md
@@ -0,0 +1,50 @@
+# X天小程序开发速度入门--第1天
+
+* 小程序是什么? 微信的应用号
+* 小程序怎么开发? 用微信开发工具
+* 小程序用的什么语言? 分前台与后台,前台是微信风格的app,后台是业务接口,可以用多种后台语言开发
+* 开发小程序的过程是怎样的? 从Hello World开始吧……
+
+## 建立第一个小程序 Hello World
+需求
+* 登录小程序
+* 显示用户信息
+* 打印 "Hello小程序"
+
+## 步骤
+### 注册
+1 注册微信小程序账号:https://mp.weixin.qq.com/
+ * 立即注册->小程序
+ * 填写注册信息,提交注册
+2 注册好的账号登录小程序
+3 下载开发者工具:[下载地址 ](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1510576089)
+
+### 准备步骤
+1 打开 **微信web开发者工具**
+ * 注意:微信开发工具变更很快,可能与网络书籍教程无法一一对应,需要自己多摸索。
+2 选择**小程序项目**
+ * 登录界面提供了 [微信开发者文档](https://mp.weixin.qq.com/debug/wxadoc/dev/index.html)
+ * [微信开发者社区](https://developers.weixin.qq.com/home?token=137700584&lang=zh_CN)
+3 点击**管理项目**左边的"加号 +**
+4 填写项目名称**Hello小程序**,选择好项目目录
+5 AppID先选择无,待申请注册通过后,可以填写自己小程序的AppID
+6 勾选“创建QuickStart项目**:会创建项目基本结构
+
+### 理解微信项目文件
+> 破坏是学习的一种很好方式
+
+* 删除目录下所有文件,点**编译**
+ * 这时会看到报错"未找到入口 app.json 文件,或者文件读取失败,请检查后重新编译。"
+ * 微信启动时会查找app.json入口文件
+* 添加app.json
+ * 继续报错"Expecting 'STRING','NUMBER','NULL','TRUE','FALSE','{','[', got EOF"
+ * app.json必须符合json格式
+* 添加 `{}`
+ * 继续报错“未找到入口页面 app.json 中定义的 pages : []”
+ * 说明必须添加页面 `pages : []`
+* 添加页面
+ * 目录导航上方"+"
+ * 增加目录pages
+ * 增加页面index
+ * 修改"index.wxml"内容为`Hello小程序`
+* 小程序模拟器显示预览输出 `Hello小程序`
diff --git a/program-blog/wexin-app/learn-weixin-app-day2.md b/program-blog/wexin-app/learn-weixin-app-day2.md
new file mode 100644
index 0000000..513a46d
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day2.md
@@ -0,0 +1,50 @@
+# X天小程序开发速度入门--第2天
+> 11月14日很自觉地学习,感觉那种拖延症的感觉轻了很多
+
+继续 Quick Start 学习,今天主要的收获有:
+* 微信的IDE真难用
+* 微信的API需要逐个学习理解:[小程序API](https://mp.weixin.qq.com/debug/wxadoc/dev/api/)
+* JavaScript 需要从基础开始学起
+* 调试工具学习
+
+在**Quick Start** 模板代码的基础上,实现了登录后显示 "Hello 唐尤华"
+
+## app.js
+这里是微信小程序的主程序,理解为 **main()** 吧
+
+```
+App({
+})
+```
+
+这里做了几件事:
+* **onLaunch**:监听小程序初始化,只调用一次
+* 定义了 `globalData`:各个页面调用的全局变量,`app.globalData`
+
+**初始化 onLaunch**
+这里通过小程序API实现了获取 logs 本地缓存,登录,获取用户信息
+* wx.getStorageSync / wx.setStorageSync:获取设置本地缓存
+* wx.login:**注意,在没有设置小程序AppID的情况下,这里是模拟返回**
+* wx.getSetting :获取用户信息
+
+所有的API详细说明可以在 [这里](https://mp.weixin.qq.com/debug/wxadoc/dev/api/) 查到
+
+## 修改代码,让登录信息显示为"Hello 用户名"
+在 `index.xml` 中,有显示 Hello World 的地方
+
+```
+{{motto}}}
+改为
+Hello {{userInfo.nickName}}
+```
+
+修改完成重新编译,点击登录,就可以看到结果啦
+
+## 用到的调试工具
+1 在调试工具下选择 Storage 可以看到记录登录日期的数组,保存了登录的时间
+2 重新**编译**,登录,会增加一条当前登录时间
+3 点**清缓存**,会把本地的缓存清掉,可以看到数组没有了
+
+## 待学习的内容
+* JavaScript基础
+* 熟读[小程序API](https://mp.weixin.qq.com/debug/wxadoc/dev/api/)、[框架API](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html)
diff --git a/program-blog/wexin-app/learn-weixin-app-day3.md b/program-blog/wexin-app/learn-weixin-app-day3.md
new file mode 100644
index 0000000..81c66eb
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day3.md
@@ -0,0 +1,47 @@
+# X天小程序开发速度入门--第3天
+
+> 继续昨天的学习,今天读了
+> * [简易教程](https://mp.weixin.qq.com/debug/wxadoc/dev/)
+> * [框架](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html)
+> * [基础组件](https://mp.weixin.qq.com/debug/wxadoc/dev/component/)
+> * [API](https://mp.weixin.qq.com/debug/wxadoc/dev/api/)
+> * [工具](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html)
+> * [Q&A](https://mp.weixin.qq.com/debug/wxadoc/dev/qa.html)
+> * [开发者社区](https://developers.weixin.qq.com/)
+
+虽然很着急马上动手写码,但以前的经验告诉我,冷静,先看好文档。
+
+道理很简单,了解需要的资源在哪里,什么能读懂,什么看不懂,才能有针对性的实验和学习。
+
+## [简易教程](https://mp.weixin.qq.com/debug/wxadoc/dev/)
+与其在网上东找西凑,不如到官网花点时间好好读读,入门教程:
+* 基础
+ * 起步
+ * 申请帐号
+ * 安装开发工具:官方的[工具文档](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html)必须好好读一下,然后操练
+ * 我的第一个小程序
+ * 编译预览
+ * 代码构成
+ * JSON 配置:[app.json配置](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html) *官网文档给的链接过期,看来bug不少*
+ * WXML 模板:[WXML标签语言](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/) *微信自定义标签语言,运行在webview下,定制的 html*。微信提供了[一套组件](https://mp.weixin.qq.com/debug/wxadoc/dev/component/),熟练掌握组件,在处理需求时可以灵活运用
+ * WXSS 样式:[WXSS样式表](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html) *微信自定义样式语言,阉割版的 css,使用时有许多限制*。配合 [WXS脚本](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxs/) 构建页面结构
+ * JS 逻辑交互:通过 [事件](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html) 响应用户行为。微信提供了一套 [API](https://mp.weixin.qq.com/debug/wxadoc/dev/api/),熟练掌握用法、限制以及各种坑,很关键
+ * 小程序能力
+ * 小程序的启动:需要了解小程序的生命周期,包括隐藏、唤醒、销毁、冷启动/热启动
+ * 程序与页面:需要了解页面的生命周期,页面跳转,页面栈在各种状态下的处理
+ * 组件
+ * API
+ * 发布前的准备
+ * 用户身份
+ * 预览
+ * 上传代码
+ * 小程序的版本:这里需要关注 [基础库](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/client-lib.html)的版本,对于向下版本的兼容,是很大的一个坑
+ * 上线:看了 [开发者社区](https://developers.weixin.qq.com/) 未解决的问题,就知道微信的坑有多少
+ * 提交审核
+ * 发布
+ * 运营数据
+* 体验小程序
+* 更新日志
+
+看起来似乎正在按照教程的路线在走,接下来应该是要想好第一个版本小程序的内容,解决文档和demo中遇到的不理解的问题。
+
diff --git a/program-blog/wexin-app/learn-weixin-app-day4.md b/program-blog/wexin-app/learn-weixin-app-day4.md
new file mode 100644
index 0000000..d93c0a2
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day4.md
@@ -0,0 +1,39 @@
+# X天小程序开发速度入门--第4天
+
+感冒休息了1天,今天继续
+
+> 熟悉[小程序开发工具](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html)
+
+## 解决以下问题
+* 项目常见操作:新建无AppID项目、删除项目、打开/切换项目、查看项目信息
+ * 导入:**目前没有提供导入项目功能,早期版本有过**,可采取暴力文件删除拷贝方式
+ * 查看项目信息:点“详情”
+ * **设置项目基础库**:点“详情”,工具基础库版本,用来调试低版本兼容
+* 项目文件、目录操作
+ * 1.0.1171160版本解决了在目录下创建目录和文件问题,新增了**Component**
+* 编辑文件:设置背景色、字体
+ * 自动提示:对微信API做了很好的提示,JavaScript、JSON、WXML都做了很好的提示,用`TAB`键补全
+* 调试:这是很关键的一个功能
+ * 调试器 Console:输入和调试代码,比起在debug里面查看变量方便很多
+ * 调试器 Wxml:可以直接查看wxml 转化后的界面,与chrome里面查看html的DOM模型一样
+ * 调试器 Source:查看源码,下断点,调试
+ * 调试器 AppData:查看数据非常方便,比如定义的userInfo、motto等信息
+ * 调试器 Storage:查看本地存储,配合清缓存调试
+ * 调试器 Network:查看网络调用,与后台通信时用到
+ * 调试器 Sensor:模拟地理位置和重力感应,高级功能(不大常用:P)
+
+## 其他重要功能
+* 切后台:模拟小程序切换到后台的状态
+* 预览:在手机上预览,需要AppID
+* 上传、测试、腾讯云
+ * 点“详情”,域名信息:做设置
+
+## 其他功能
+* 点工具登录头像:可以查看版本更新信息,以及在社区文章中的回复
+
+工具已OK,可以上路了。
+
+## 注意事项
+* 一些微信API必须在真机实验,参见[这里](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/notsupport.html)
+* 一些JavaScript API不支持,参见[这里](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/details.html#客户端es6-api-支持情况)
+* 工具要每天更新,切记
\ No newline at end of file
diff --git a/program-blog/wexin-app/learn-weixin-app-day5.md b/program-blog/wexin-app/learn-weixin-app-day5.md
new file mode 100644
index 0000000..1cf4b89
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day5.md
@@ -0,0 +1,153 @@
+# X天小程序开发速度入门--第5天
+
+> 苦海无涯,编程却有结束的那一天
+> 如果从创业那天开始算,7年一辈子,在写下这段文字的时候,我的程序员生涯还有`5年 44天 3小时 21分 5秒`
+> 该做的抓紧做,该学的抓紧学
+
+今天把quick start项目里不清楚的`语法`都过一遍
+
+## JavaScript
+### 箭头函数
+```
+ wx.login({
+ success: res => {
+ // 发送 res.code 到后台换取 openId, sessionKey, unionId
+ }
+ })
+```
+
+这里面 `res => { }` 定义了一个匿名函数,ECMAScript 6支持这种写法,等同于
+
+```
+ wx.login({
+ success: function(res) {
+ // 发送 res.code 到后台换取 openId, sessionKey, unionId
+ }
+ })
+```
+
+### 逻辑运算符 ||
+```
+var logs = wx.getStorageSync('logs') || []
+```
+
+1 在调试,Source面板下断点
+2 在调试,Console面板下输入 `wx.getStorageSync('logs')`
+ * 初次运行或者清除缓存后,会返回空数组
+3 上面这句,在 `wx.getStorageSync('logs')` 返回 `undefined` 情况下,会返回一个空数组
+ * `undefined` 在条件语句中判定为 `false`
+
+**上面语句的含义**:返回 logs 非空数组(本地缓存),或者返回空数组
+
+### 数组操作 unshift
+```
+ onLaunch: function () {
+ // 展示本地存储能力
+ var logs = wx.getStorageSync('logs') || []
+ logs.unshift(Date.now())
+ wx.setStorageSync('logs', logs)
+```
+
+* `unshift()` 方法可向数组的开头添加一个或更多元素,并返回新的长度
+* 小程序初始化完成 `onLaunch` 事件发生,会记录当前日期到 logs 数组,存储到本地缓存
+
+### this对象
+```
+wx.getUserInfo({
+ success: res => {
+ // 可以将 res 发送给后台解码出 unionId
+ this.globalData.userInfo = res.userInfo
+
+ // 由于 getUserInfo 是网络请求,可能会在 Page.onLoad 之后才返回
+ // 所以此处加入 callback 以防止这种情况
+ if (this.userInfoReadyCallback) {
+ this.userInfoReadyCallback(res)
+ }
+```
+`this` 对象不同场合有各种不同的用法,上面的代码中,`this` 代表的是Global对象
+* 在微信IDE中 `CTRL+SHIFT+F` 查找 `userInfoReadyCallback`,可以看到 index.js 中定义了这个函数
+* 这段代码的目的,就是为了防止 Page.onLoad 比 `onLaunch` 事件中请求的用户信息成功之前已运行,此时app.globalInfo.userInfo的值是空的,所以还需要再重新对其进行赋值
+
+### 全局变量
+```
+ globalData: {
+ userInfo: null
+ }
+```
+app.js 里定义了 `globalData` 全局变量,于是在各个地方都用到了,进行用户信息传递
+
+理论上有两种方法可以查看 `globalData` 被调用的情况
+* 右键菜单,查找所有引用:恩,没有用
+* `CTRL+SHIFT+F` 查找 `globalData`:可以看到,在 app.js 和 index.js 中分别进行了赋值和使用
+
+题外话:不得不说,IDE做得还是有很大提升空间
+
+### console.log
+```
+ getUserInfo: function(e) {
+ console.log(e)
+```
+
+这是很重要的调试技巧,上面的代码把 `UserInfo` 在Console面板中打印了出来
+
+* Source面板下断点
+* 执行 `console.log(e)` 或者 直接在Console面板下输入 `console.log(e)` 回车,都可以看到返回的用户信息
+
+注意:`UserInfo` 里面还有一些加密信息,这个坑待填 TODO
+
+## 微信API
+### wx.getSetting
+```
+ wx.getSetting({
+ success: res => {
+ if (res.authSetting['scope.userInfo']) {
+```
+* wx.getSetting 获取用户的当前设置:返回success,可以查看用户信息,完整信息参见 [scope 列表](https://mp.weixin.qq.com/debug/wxadoc/dev/api/authorize-index.html)
+
+### setData
+**此处应有许多坑**
+
+> Page.prototype.setData()
+> [官方说明](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/page.html):setData 函数用于将数据从逻辑层发送到视图层(异步),同时改变对应的 this.data 的值(同步)
+
+然后列举了一堆限制
+* 直接修改 `this.data` 而不调用 `this.setData` 是无法改变页面的状态的,还会造成数据不一致。
+* 单次设置的数据**不能超过1024kB**,请尽量避免一次设置过多的数据。
+* 请不要把 `data` 中任何一项的 `value` 设为 `undefined` ,否则这一项将不被设置并可能遗留一些潜在问题
+
+举例:index.js 中
+```
+this.setData({
+ userInfo: app.globalData.userInfo,
+ hasUserInfo: true
+})
+```
+
+设置了 `userInfo` 和 `hasUserInfo` ,在 index.wxml 中使用
+```
+
+
+
+
+
+
+ {{userInfo.nickName}}
+
+
+
+ Hello {{userInfo.nickName}}
+
+
+```
+
+### Page
+这个坑明天再填
+
+## 总结
+对照代码学习JavaScript思路
+* 在W3C的离线教程里搜索 JavaScript + 关键字
+* 如果找不到,在 GitHub 的[教程](https://github.com/zhubangbang/)里搜索
+* 如果还是找不到,再百度 JavaScript + 关键字 或者 小程序 + 关键字
+
+> 写完这篇,我的程序员生涯还剩下 5年 44天 2小时 4分 48秒
+> 该做的抓紧做,该学的抓紧学
\ No newline at end of file
diff --git a/program-blog/wexin-app/learn-weixin-app-day6.md b/program-blog/wexin-app/learn-weixin-app-day6.md
new file mode 100644
index 0000000..73efbbb
--- /dev/null
+++ b/program-blog/wexin-app/learn-weixin-app-day6.md
@@ -0,0 +1,198 @@
+# X天小程序开发速度入门--第6天
+> 关于JavaScript语法,《JavaScript精粹》是一本经典参考书,可以随时查找和翻一翻
+> 举例,数组 unshift 在这本书里就有专门的介绍
+> 可以把每个章节过一遍,在 Console 面板里把示例运行一下
+
+今天继续梳理 quick start 项目代码,在理解了项目 app.js 后,对页面的 JavaScript 进行梳理
+* index.js
+* log.js
+
+## 页面结构
+新建页面,比如 hello,会创建4个文件
+* hello.js:JavaScript 脚本逻辑文件
+ * 响应用户的点击、获取用户的位置等等
+ * 支持绑定 WXML事件,可以绑定的事件参见 [事件系统](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html):注意,这里提到的事件都是**非冒泡事件**,关于 html DOM 的 事件冒泡机制(Event bubbling) 是一种事件传递机制,在w3c规范里有详细的描述,要彻底理解,可以参阅 [这里](https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html)
+ * 绑定事件后,在事件响应中调用微信API处理业务,更新数据
+* hello.json:JSON 配置文件 *非必须*
+ * 设置 app.json 中的 window 配置项的内容,页面中配置项会覆盖 app.json 的 window 中相同的配置项
+ * [页面json配置说明](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html) 中的 **page.json**。主要包含导航栏标题内容、背景颜色、是否开启下拉刷新、下拉效果等
+* hello.wxml:WXML 模板文件,类似 HTML
+ * 与标准的 HTML 不同,小程序提供了一组自己的[基础组件](https://mp.weixin.qq.com/debug/wxadoc/dev/component/)
+ * 通过[事件系统](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html),提供界面响应,可以通过 `console.log(e)` 输出事件的详细信息。事件包含的内容(参数)也在[事件系统](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html)中有详细的说明
+ * [数据绑定](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/data.html) 对 Page 中 data 里定义的数据
+ * `{{ }}` 的语法把一个变量绑定到界面,支持表达式等
+ * [列表渲染](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/list.html)
+ * `wx:for` 绑定数组,重复渲染
+ * [条件渲染](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/conditional.html)
+ * `wx:if` 判断是否需要渲染
+ * [模板](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/template.html):定义模板,然后引用
+ * 采用了 [mustache.js](https://github.com/janl/mustache.js) :[支持多种语言的无逻辑(logic-less)模板库](http://mustache.github.io/)
+ * 事件
+ * [引用](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/import.html)
+ * `import`:导入模板,这里有**作用域**的问题
+ * `include`:相当于直接拷贝到这里
+* hello.wxss:WXSS 样式文件
+ * 针对微信的[样式](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html):可类比CSS
+ * 支持样式导入和内联样式
+ * 在 app.wxss 定义全局样式,在 page.wxss 定义页面局部样式,会覆盖全局样式
+
+这4个文件必须命名相同,在整个项目的配置文件 app.json 中,会根据 `pages` 的配置自动找到对应的资源
+```
+ "pages": [
+ "pages/index/index",
+ "pages/logs/logs",
+ "pages/index/hello"
+ ],
+```
+
+## 举例,wxss, js, wxml 如何工作
+`index` 页面,显示欢迎信息,点击"获取头像昵称"请求用户信息
+
+### 页面结构
+index.wxml 去掉样式
+```
+
+
+
+
+
+
+ {{userInfo.nickName}}
+
+
+
+ Hello {{userInfo.nickName}}
+
+
+```
+
+* 页面结构:view(view(button, block(image, text)), view(text))
+* 事件处理:
+ * 点击按钮事件:`bindgetuserinfo`
+ * 点击头像图片事件:`bindtap`
+* 数据绑定:
+ * `{{userInfo.avatarUrl}}`:用户头像
+ * `{{userInfo.nickName}}`:用户名
+ * `Hello {{userInfo.nickName}}`:欢迎信息
+* 条件渲染:
+ * `wx:if="{{!hasUserInfo && canIUse}}"`:没有用户信息,显示**获取用户头像信息**按钮
+ * ``:如果已登录,显示用户头像及姓名
+
+### 脚本逻辑
+```
+Page({
+ data: {
+ motto: 'Hello World',
+ userInfo: {},
+ hasUserInfo: false,
+ canIUse: wx.canIUse('button.open-type.getUserInfo')
+ },
+```
+
+定义了 index 页面数据:包括标题 `motto`,用户信息 `userInfo`,是否已登录 ` hasUserInfo`,判断**基础库是否可以使用 `getUserInfo` API**,确保[兼容性](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/compatibility.html)
+
+```
+wxml
+
+
+js
+ bindViewTap: function() {
+ wx.navigateTo({
+ url: '../logs/logs'
+ })
+ },
+```
+
+事件处理,点击用户头像后调用 `wx.navigateTo` 跳转到日志页面
+
+```
+wxml
+
+
+js
+ getUserInfo: function(e) {
+ console.log(e)
+ app.globalData.userInfo = e.detail.userInfo
+ this.setData({
+ userInfo: e.detail.userInfo,
+ hasUserInfo: true
+ })
+ }
+```
+
+点击按钮,`open-type="getUserInfo'` 获取用户信息, `bindgetuserinfo` 回调函数提供获取到的用户信息
+参见[表单组件 button](https://mp.weixin.qq.com/debug/wxadoc/dev/component/button.html)
+
+### 样式文件
+```
+.wxml
+
+
+.wxss
+.userinfo {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+```
+
+定义了页面中的各组件样式,通过 `class` 筛选器渲染
+
+当然,也可以使用 css 中的属性,比如 `background-size`
+
+## JavaScript
+log.js
+```
+logs: (wx.getStorageSync('logs') || []).map(log => {
+ return util.formatTime(new Date(log))
+})
+```
+
+上面的代码返回数组后,调用了 [Array.prototype.map()](https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/map),对所有的日志进行了格式化
+
+```
+const util = require('../../utils/util.js')
+
+util.formatTime(new Date(log))
+```
+
+引入 util.js 对日期进行格式化
+
+```
+const formatTime = date => {
+ const year = date.getFullYear()
+ const month = date.getMonth() + 1
+ const day = date.getDate()
+ const hour = date.getHours()
+ const minute = date.getMinutes()
+ const second = date.getSeconds()
+
+ return [year, month, day].map(formatNumber).join('/') + ' ' + [hour, minute, second].map(formatNumber).join(':')
+}
+```
+
+`date.getMonth() ` 返回值是 0(一月) 到 11(十二月) 之间的一个整数,所以上面的代码做了加1
+
+```
+const formatNumber = n => {
+ n = n.toString()
+ return n[1] ? n : '0' + n
+}
+```
+
+把数字进行补0处理,先转为字符串,然后判断是否两位 `n[1] `如果为 true,直接返回,否则补0
+
+```
+module.exports = {
+ formatTime: formatTime
+
+```
+
+将一些公共的代码抽离成为一个单独的 js 文件,作为一个模块。模块只有通过 module.exports 或者 exports 才能对外暴露接口
+参见[模块化](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/app-service/module.html),[JavaScript export语句](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/export)
+
+## 总结
+* 如何有效地找到一个技术的基本规范:中文描述,百度搜索归属的技术,查找对应的英文翻译,找维基百科,查看参考文献,定位标准。
+ * 举例,JavaScript 冒泡事件,搜索归属于 HTML DOM事件流,查找 event bubble/propagation,定位 W3C 规范
+* 在小程序文档分类栏目 **简易教程 框架 组件 API 工具 Q&A** 的最右边有搜索框,可以直接搜索想要的内容,在[MDN](https://developer.mozilla.org/en-US/)同样有效
+
diff --git a/program-interview/java-baidu-200.md b/program-interview/java-baidu-200.md
new file mode 100644
index 0000000..fab2441
--- /dev/null
+++ b/program-interview/java-baidu-200.md
@@ -0,0 +1,702 @@
+# Java面试资源
+分享编程资源,一起用好资源,用好的资源 **QQ(50872495)**
+
+> 这里汇总整理了网络上的Java面试题,持续更新
+> * 百度"Java面试题"前200页
+
+## 基本概念
+* 操作系统中 heap 和 stack 的区别
+* 什么是基于注解的切面实现
+* 什么是 对象/关系 映射集成模块
+* 什么是 Java 的反射机制
+* 什么是 ACID
+* BS与CS的联系与区别
+* Cookie 和 Session的区别
+* fail-fast 与 fail-safe 机制有什么区别
+* get 和 post请求的区别
+* Interface 与 abstract 类的区别
+* IOC的优点是什么
+* IO 和 NIO的区别,NIO优点
+* Java 8 / Java 7 为我们提供了什么新功能
+* 什么是竞态条件? 举个例子说明。
+* JRE、JDK、JVM 及 JIT 之间有什么不同
+* MVC的各个部分都有那些技术来实现?如何实现?
+* RPC 通信和 RMI 区别
+* 什么是 Web Service(Web服务)
+* JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。
+* WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。
+* 一个".java"源文件中是否可以包含多个类(不是内部类)?有什么限制
+* 简单说说你了解的类加载器。是否实现过类加载器
+* 解释一下什么叫AOP(面向切面编程)
+* 请简述 Servlet 的生命周期及其相关的方法
+* 请简述一下 Ajax 的原理及实现步骤
+* 简单描述Struts的主要功能
+* 什么是 N 层架构
+* 什么是CORBA?用途是什么
+* 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”
+* 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配
+* 什么是懒加载(Lazy Loading)
+* 什么是尾递归,为什么需要尾递归
+* 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection)
+
+## 关键字
+* finalize
+ * 什么是finalize()方法
+ * finalize()方法什么时候被调用
+ * 析构函数(finalization)的目的是什么
+ * final 和 finalize 的区别
+ * final
+ * final关键字有哪些用法
+ * final 与 static 关键字可以用于哪里?它们的作用是什么
+ * final, finally, finalize的区别
+ * final、finalize 和 finally 的不同之处?
+ * 能否在运行时向 static final 类型的赋值
+ * 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变
+ * 一个类被声明为final类型,表示了什么意思
+ * throws, throw, try, catch, finally分别代表什么意义
+* Java 有几种修饰符?分别用来修饰什么
+* volatile
+ * volatile 修饰符的有过什么实践
+ * volatile 变量是什么?volatile 变量和 atomic 变量有什么不同
+ * volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗
+ * 能创建 volatile 数组吗?
+* transient变量有什么特点
+* super什么时候使用
+* public static void 写成 static public void会怎样
+* 说明一下public static void main(String args[])这段声明里每个关键字的作用
+* 请说出作用域public, private, protected, 以及不写时的区别
+* sizeof 是Java 的关键字吗
+* static
+ * static class 与 non static class的区别
+ * static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法
+ * 静态类型有什么特点
+ * main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态
+ * 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用
+ * 静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢
+ * 成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量
+* switch
+ * switch 语句中的表达式可以是什么类型数据
+ * switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上
+* while 循环和 do 循环有什么不同
+
+## 操作符
+* &操作符和&&操作符有什么区别?
+* a = a + b 与 a += b 的区别?
+* 逻辑操作符 (&,|,^)与条件操作符(&&,||)的区别
+* 3\*0.1 == 0.3 将会返回什么?true 还是 false?
+* float f=3.4; 是否正确?
+* short s1 = 1; s1 = s1 + 1;有什么错?
+
+## 数据结构
+* 基础类型(Primitives)
+ * 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里
+ * 简述九种基本数据类型的大小,以及他们的封装类
+ * int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到
+ * float和double的默认值是多少
+ * 如何去小数四舍五入保留小数点后两位
+ * char 型变量中能不能存贮一个中文汉字,为什么
+* 类型转换
+ * 怎样将 bytes 转换为 long 类型
+ * 怎么将 byte 转换为 String
+ * 如何将数值型字符转换为数字
+ * 我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象
+ * 能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗
+ * 类型向下转换是什么
+* 数组
+ * 如何权衡是使用无序的数组还是有序的数组
+ * 怎么判断数组是 null 还是为空
+ * 怎么打印数组? 怎样打印数组中的重复元素
+ * Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList
+ * 数组和链表数据结构描述,各自的时间复杂度
+ * 数组有没有length()这个方法? String有没有length()这个方法
+* 队列
+ * 队列和栈是什么,列出它们的区别
+ * BlockingQueue是什么
+ * 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。
+* ArrayList、Vector、LinkedList的存储性能和特性
+* String
+* StringBuffer
+ * ByteBuffer 与 StringBuffer有什么区别
+* HashMap
+ * HashMap的工作原理是什么
+ * 内部的数据结构是什么
+ * HashMap 的 table的容量如何确定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题?
+ * HashMap 实现的数据结构是什么?如何实现
+ * HashMap 和 HashTable、ConcurrentHashMap 的区别
+ * HashMap的遍历方式及效率
+ * HashMap、LinkedMap、TreeMap的区别
+ * 如何决定选用HashMap还是TreeMap
+ * 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办
+ * HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,比如存储方式、 hashcode、扩容、 默认容量等
+* HashSet
+ * HashSet和TreeSet有什么区别
+ * HashSet 内部是如何工作的
+ * WeakHashMap 是怎么工作的?
+* Set
+ * Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()? 它们有何区别?
+ * TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素?
+ * TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。
+ * EnumSet 是什么
+* Hash算法
+ * Hashcode 的作用
+ * 简述一致性 Hash 算法
+ * 有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象
+ * 为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里
+ * a.hashCode() 有什么用?与 a.equals(b) 有什么关系
+ * hashCode() 和 equals() 方法的重要性体现在什么地方
+ * Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为什么这么设计?Object类的概述
+ * 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。
+ * 可以在 hashcode() 中使用随机数字吗?
+* LinkedHashMap
+ * LinkedHashMap 和 PriorityQueue 的区别是什么
+* List
+ * List, Set, Map三个接口,存取元素时各有什么特点
+ * List, Set, Map 是否继承自 Collection 接口
+ * 遍历一个 List 有哪些不同的方式
+ * LinkedList
+ * LinkedList 是单向链表还是双向链表
+ * LinkedList 与 ArrayList 有什么区别
+ * 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么?
+ * 插入数据时,ArrayList, LinkedList, Vector谁速度较快?
+ * ArrayList
+ * ArrayList 和 HashMap 的默认大小是多数
+ * ArrayList 和 LinkedList 的区别,什么时候用 ArrayList?
+ * ArrayList 和 Set 的区别?
+ * ArrayList, LinkedList, Vector的区别
+ * ArrayList是如何实现的,ArrayList 和 LinkedList 的区别
+ * ArrayList如何实现扩容
+ * Array 和 ArrayList 有何区别?什么时候更适合用Array
+ * 说出ArraList,Vector, LinkedList的存储性能和特性
+* Map
+ * Map, Set, List, Queue, Stack
+ * Map 接口提供了哪些不同的集合视图
+ * 为什么 Map 接口不继承 Collection 接口
+* Collections
+ * 介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些
+ * Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现
+ * 集合类框架的最佳实践有哪些
+ * 为什么 Collection 不从 Cloneable 和 Serializable 接口继承
+ * 说出几点 Java 中使用 Collections 的最佳实践?
+ * Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别
+* 什么是 B+树,B-树,列出实际的使用场景。
+
+## 接口
+* Comparator 与 Comparable 接口是干什么的?列出它们的区别
+
+## 对象
+* 拷贝(clone)
+ * 如何实现对象克隆
+ * 深拷贝和浅拷贝区别
+ * 深拷贝和浅拷贝如何实现激活机制
+ * 写clone()方法时,通常都有一行代码,是什么
+* 比较
+ * 在比较对象时,"==" 运算符和 equals 运算有何区别
+ * 如果要重写一个对象的equals方法,还要考虑什么
+ * 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对
+* 构造器
+ * 构造器链是什么
+ * 创建对象时构造器的调用顺序
+* 不可变对象
+ * 什么是不可变象(immutable object)
+ * 为什么 Java 中的 String 是不可变的(Immutable)
+ * 如何构建不可变的类结构?关键点在哪里
+ * 能创建一个包含可变对象的不可变对象吗
+* 如何对一组对象进行排序
+
+## 方法
+* 构造器(constructor)是否可被重写(override)
+* 方法可以同时即是 static 又是 synchronized 的吗
+* abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized
+* Java支持哪种参数传递类型
+* 一个对象被当作参数传递到一个方法,是值传递还是引用传递
+* 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递
+* 我们能否重载main()方法
+* 如果main方法被声明为private会怎样
+
+## GC
+* 概念
+ * GC是什么?为什么要有GC
+ * 什么时候会导致垃圾回收
+ * GC是怎么样运行的
+ * 新老以及永久区是什么
+ * GC 有几种方式?怎么配置
+ * 什么时候一个对象会被GC? 如何判断一个对象是否存活
+ * System.gc() Runtime.gc()会做什么事情? 能保证 GC 执行吗
+ * 垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收?
+ * Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生
+ * 垃圾回收算法的实现原理
+ * 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存?
+ * 垃圾回收的最佳做法是什么
+* GC收集器有哪些
+ * 垃圾回收器的基本原理是什么?
+ * 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么
+ * Serial 与 Parallel GC之间的不同之处
+ * CMS 收集器 与 G1 收集器的特点与区别
+ * CMS垃圾回收器的工作过程
+ * JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代
+ * 吞吐量优先和响应优先的垃圾收集器选择
+* GC策略
+ * 举个实际的场景,选择一个GC策略
+ * JVM的永久代中会发生垃圾回收吗
+* 收集方法
+ * 标记清除、标记整理、复制算法的原理与特点?分别用在什么地方
+ * 如果让你优化收集方法,有什么思路
+
+## JVM
+* 参数
+ * 说说你知道的几种主要的jvm 参数
+ * -XX:+UseCompressedOops 有什么作用
+* 类加载器(ClassLoader)
+ * Java 类加载器都有哪些
+ * JVM如何加载字节码文件
+* 内存管理
+ * JVM内存分哪几个区,每个区的作用是什么
+ * 一个对象从创建到销毁都是怎么在这些部分里存活和转移的
+ * 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法
+ * JVM中哪个参数是用来控制线程的栈堆栈小
+ * 简述内存分配与回收策略
+ * 简述重排序,内存屏障,happen-before,主内存,工作内存
+ * Java中存在内存泄漏问题吗?请举例说明
+ * 简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用
+ * 内存映射缓存区是什么
+* jstack,jstat,jmap,jconsole怎么用
+* 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数?
+* 怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位
+* JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆
+* 什么情况下会发生栈内存溢出
+* 双亲委派模型是什么
+
+## 多线程
+* 基本概念
+ * 什么是线程
+ * 多线程的优点
+ * 多线程的几种实现方式
+ * 用 Runnable 还是 Thread
+ * 什么是线程安全
+ * Vector, SimpleDateFormat 是线程安全类吗
+ * 什么 Java 原型不是线程安全的
+ * 哪些集合类是线程安全的
+ * 多线程中的忙循环是什么
+ * 如何创建一个线程
+ * 编写多线程程序有几种实现方式
+ * 什么是线程局部变量
+ * 线程和进程有什么区别?进程间如何通讯,线程间如何通讯
+ * 什么是多线程环境下的伪共享(false sharing)
+ * 同步和异步有何异同,在什么情况下分别使用他们?举例说明
+* Current
+ * ConcurrentHashMap 和 Hashtable的区别
+ * ArrayBlockingQueue, CountDownLatch的用法
+ * ConcurrentHashMap的并发度是什么
+* CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么
+* Semaphore的用法
+* Thread
+ * 启动一个线程是调用 run() 还是 start() 方法?start() 和 run() 方法有什么区别
+ * 调用start()方法时会执行run()方法,为什么不能直接调用run()方法
+ * sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别
+ * yield方法有什么作用?sleep() 方法和 yield() 方法有什么区别
+ * Java 中如何停止一个线程
+ * stop() 和 suspend() 方法为何不推荐使用
+ * 如何在两个线程间共享数据
+ * 如何强制启动一个线程
+ * 如何让正在运行的线程暂停一段时间
+ * 什么是线程组,为什么在Java中不推荐使用
+ * 你是如何调用 wait(方法的)?使用 if 块还是循环?为什么
+* 生命周期
+ * 有哪些不同的线程生命周期
+ * 线程状态,BLOCKED 和 WAITING 有什么区别
+ * 画一个线程的生命周期状态图
+* ThreadLocal 用途是什么,原理是什么,用的时候要注意什么
+* ThreadPool
+ * 线程池是什么?为什么要使用它
+ * 如何创建一个Java线程池
+ * ThreadPool用法与优势
+ * 提交任务时,线程池队列已满时会发会生什么
+ * newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,比如 coreSize, maxsize 等
+ * 线程池的实现策略
+ * 线程池的关闭方式有几种,各自的区别是什么
+ * 线程池中submit() 和 execute()方法有什么区别?
+* 线程调度
+ * Java中用到的线程调度算法是什么
+ * 什么是多线程中的上下文切换
+ * 你对线程优先级的理解是什么
+ * 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing)
+* 线程同步
+ * 请说出你所知的线程同步的方法
+ * synchronized 的原理是什么
+ * synchronized 和 ReentrantLock 有什么不同
+ * 什么场景下可以使用 volatile 替换 synchronized
+ * 有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行
+ * 同步块内的线程抛出异常会发生什么
+ * 当一个线程进入一个对象的 synchronized 方法A 之后,其它线程是否可进入此对象的 synchronized 方法B
+ * 使用 synchronized 修饰静态方法和非静态方法有什么区别
+ * 如何从给定集合那里创建一个 synchronized 的集合
+* 锁
+ * Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优势
+ * Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优势是什么
+ * ReadWriteLock是什么?
+ * 锁机制有什么用
+ * 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题
+ * 解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁
+ * 什么时候应该使用可重入锁
+ * 简述锁的等级方法锁、对象锁、类锁
+ * Java中活锁和死锁有什么区别?
+ * 什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁
+ * 死锁与活锁的区别,死锁与饥饿的区别
+ * 怎么检测一个线程是否拥有锁
+ * 如何实现分布式锁
+ * 有哪些无锁数据结构,他们实现的原理是什么
+ * 读写锁可以用于什么应用场景
+* Executors类是什么? Executor和Executors的区别
+* 什么是Java线程转储(Thread Dump),如何得到它
+* 如何在Java中获取线程堆栈
+* 说出 3 条在 Java 中使用线程的最佳实践
+* 在线程中你怎么处理不可捕捉异常
+* 实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的
+* 请说出与线程同步以及线程调度相关的方法
+* 程序中有3个 socket,需要多少个线程来处理
+* 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到
+* 如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长
+* 如何确保 main() 方法所在的线程是 Java 程序最后结束的线程
+* 非常多个线程(可能是不同机器),相互之间需要等待协调才能完成某种工作,问怎么设计这种协调方案
+* 你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它
+
+## 异常
+* 基本概念
+ * Error 和 Exception有什么区别
+ * UnsupportedOperationException是什么
+ * NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处
+ * 什么是受检查的异常,什么是运行时异常
+ * 运行时异常与一般异常有何异同
+ * 简述一个你最常见到的runtime exception(运行时异常)
+* finally
+ * finally关键词在异常处理中如何使用
+ * 如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗
+ * try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后
+ * 在什么情况下,finally语句不会执行
+* throw 和 throws 有什么区别?
+* OOM你遇到过哪些情况?你是怎么搞定的?
+* SOF你遇到过哪些情况?
+* 既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常
+* 当自己创建异常类的时候应该注意什么
+* 导致空指针异常的原因
+* 异常处理 handle or declare 原则应该如何理解
+* 怎么利用 JUnit 来测试一个方法的异常
+* catch块里别不写代码有什么问题
+* 你曾经自定义实现过异常吗?怎么写的
+* 什么是 异常链
+* 在try块中可以抛出异常吗
+
+## JDBC
+* 通过 JDBC 连接数据库有哪几种方式
+* 阐述 JDBC 操作数据库的基本步骤
+* JDBC 中如何进行事务处理
+* 什么是 JdbcTemplate
+* 什么是 DAO 模块
+* 使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能
+* 列出 5 个应该遵循的 JDBC 最佳实践
+
+## IO
+* File
+ * File类型中定义了什么方法来创建一级目录
+ * File类型中定义了什么方法来判断一个文件是否存在
+* 流
+ * 为了提高读写性能,可以采用什么流
+ * Java中有几种类型的流
+ * JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类
+ * 对文本文件操作用什么I/O流
+ * 对各种基本数据类型和String类型的读写,采用什么流
+ * 能指定字符编码的 I/O 流类型是什么
+* 序列化
+ * 什么是序列化?如何实现 Java 序列化及注意事项
+ * Serializable 与 Externalizable 的区别
+* Socket
+ * socket 选项 TCP NO DELAY 是指什么
+ * Socket 工作在 TCP/IP 协议栈是哪一层
+ * TCP、UDP 区别及 Java 实现方式
+* 说几点 IO 的最佳实践
+* 直接缓冲区与非直接缓冲器有什么区别?
+* 怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么
+* 当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少
+* 如何使用扫描器类(Scanner Class)令牌化
+
+## 面向对象编程(OOP)
+* 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling)
+* 多态的实现原理
+* 封装、继承和多态是什么
+* 对象封装的原则是什么?
+* 类
+ * 获得一个类的类对象有哪些方式
+ * 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分?
+ * 说出几条 Java 中方法重载的最佳实践
+* 抽象类
+ * 抽象类和接口的区别
+ * 抽象类中是否可以有静态的main方法
+ * 抽象类是否可实现(implements)接口
+ * 抽象类是否可继承具体类(concrete class)
+* 匿名类(Anonymous Inner Class)
+ * 匿名内部类是否可以继承其它类?是否可以实现接口
+* 内部类
+ * 内部类分为几种
+ * 内部类可以引用它的包含类(外部类)的成员吗
+ * 请说一下 Java 中为什么要引入内部类?还有匿名内部类
+* 继承
+ * 继承(Inheritance)与聚合(Aggregation)的区别在哪里
+ * 继承和组合之间有什么不同
+ * 为什么类只能单继承,接口可以多继承
+ * 存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B
+ * 如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题
+* 接口
+ * 接口是什么
+ * 接口是否可继承接口
+ * 为什么要使用接口而不是直接使用具体类?接口有什么优点
+
+## 泛型
+* 泛型的存在是用来解决什么问题
+* 泛型的常用特点
+* List能否转为List