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 + +## 工具类 +* 日历 + * Calendar Class的用途 + * 如何在Java中获取日历类的实例 + * 解释一些日历类中的重要方法 + * GregorianCalendar 类是什么 + * SimpleTimeZone 类是什么 + * Locale类是什么 + * 如何格式化日期对象 + * 如何添加小时(hour)到一个日期对象(Date Objects) + * 如何将字符串 YYYYMMDD 转换为日期 +* Math + * Math.round()什么作用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? +* XML + * XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不同? + * Java解析XML的方式 + * 用 jdom 解析 xml 文件时如何解决中文问题?如何解析 + * 你在项目中用到了 XML 技术的哪些方面?如何实现 + +## 动态代理 +* 描述动态代理的几种实现方式,分别说出相应的优缺点 + +## 设计模式 +* 什么是设计模式(Design Patterns)?你用过哪种设计模式?用在什么场合 +* 你知道哪些商业级设计模式? +* 哪些设计模式可以增加系统的可扩展性 +* 单例模式 + * 除了单例模式,你在生产环境中还用过什么设计模式? + * 写 Singleton 单例模式 + * 单例模式的双检锁是什么 + * 如何创建线程安全的 Singleton + * 什么是类的单例模式 + * 写出三种单例模式实现 +* 适配器模式 + * 适配器模式是什么?什么时候使用 + * 适配器模式和代理模式之前有什么不同 + * 适配器模式和装饰器模式有什么区别 +* 什么时候使用享元模式 +* 什么时候使用组合模式 +* 什么时候使用访问者模式 +* 什么是模板方法模式 +* 请给出1个符合开闭原则的设计模式的例子 + +## 开放问题 +* 用一句话概括 Web 编程的特点 +* Google是如何在一秒内把搜索结果返回给用户 +* 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入 +* 树(二叉或其他)形成许多普通数据结构的基础。请描述一些这样的数据结构以及何时可以使用它们 +* 某一项功能如何设计 +* 线上系统突然变得异常缓慢,你如何查找问题 +* 什么样的项目不适合用框架 +* 新浪微博是如何实现把微博推给订阅者 +* 简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么 +* 请你谈谈SSH整合 +* 高并发下,如何做到安全的修改同一行数据 +* 12306网站的订票系统如何实现,如何保证不会票不被超卖 +* 网站性能优化如何优化的 +* 聊了下曾经参与设计的服务器架构 +* 请思考一个方案,实现分布式环境下的 countDownLatch +* 请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存 +* 在你的职业生涯中,算得上最困难的技术挑战是什么 +* 如何写一篇设计文档,目录是什么 +* 大写的O是什么?举几个例子 +* 编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用 +* 解释一下网络应用的模式及其特点 +* 设计一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新 +* 说出数据连接池的工作机制是什么 +* 怎么获取一个文件中单词出现的最高频率 +* 描述一下你最常用的编程风格 +* 如果有机会重新设计你们的产品,你会怎么做 +* 如何搭建一个高可用系统 +* 如何启动时不需输入用户名与密码 +* 如何在基于Java的Web项目中实现文件上传和下载 +* 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。 +* 如何实现负载均衡,有哪些算法可以实现 +* 如何设计一个购物车?想想淘宝的购物车如何实现的 +* 如何设计一套高并发支付方案,架构如何设计 +* 如何设计建立和保持 100w 的长连接 +* 如何避免浏览器缓存。 +* 如何防止缓存雪崩 +* 如果AB两个系统互相依赖,如何解除依 +* 如果有人恶意创建非法连接,怎么解决 +* 如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能 +* 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算) +* 如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现 +* 如果让你实现一个并发安全的链表,你会怎么做 +* 应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各种方式的区别?你使用过的应用服务器优化技术有哪些 +* 大型网站在架构上应当考虑哪些问题 +* 有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的 +* 最近看什么书,印象最深刻的是什么 +* 描述下常用的重构技巧 +* 你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里 +* 你有了解过存在哪些反模式(Anti-Patterns)吗 +* 你用过的网站前端优化的技术有哪些 +* 如何分析Thread dump +* 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念 +* 你是如何处理内存泄露或者栈溢出问题的 +* 你们线上应用的 JVM 参数有哪些 +* 怎么提升系统的QPS和吞吐量 + +## 知识面 +* 解释什么是 MESI 协议(缓存一致性) +* 谈谈 reactor 模型 +* Java 9 带来了怎样的新功能 +* Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用 +* 简单讲讲 Tomcat 结构,以及其类加载器流程 +* 虚拟内存是什么 +* 阐述下 SOLID 原则 +* 请简要讲一下你对测试驱动开发(TDD)的认识 +* CDN实现原理 +* Maven 和 ANT 有什么区别 +* UML中有哪些常用的图 +* Linux + * Linux 下 IO 模型有几种,各自的含义是什么。 + * Linux 系统下你关注过哪些内核参数,说说你知道的 + * Linux 下用一行命令查看文件的最后五行 + * 平时用到哪些 Linux 命令 + * 用一行命令输出正在运行的 Java 进程 + * 使用什么命令来确定是否有 Tomcat 实例运行在机器上 +* 什么是 N+1 难题 +* 什么是 paxos 算法 +* 什么是 restful,讲讲你理解的 restful +* 什么是 zab 协议 +* 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别 +* 什么是领域驱动开发(Domain Driven Development) +* 介绍一下了解的 Java 领域的 Web Service 框架 +* Web Server、Web Container 与 Application Server 的区别是什么 +* 微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里 +* 描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session工作原理 +* 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些 +* 简述下数据库正则化(Normalizations) +* KISS,DRY,YAGNI 等原则是什么含义 +* 分布式事务的原理,优缺点,如何使用分布式事务? +* 布式集群下如何做到唯一序列号 +* 网络 + * HTTPS 的加密方式是什么,讲讲整个加密解密流程 + * HTTPS和HTTP的区别 + * HTTP连接池实现原理 + * HTTP集群方案 + * Nginx、lighttpd、Apache三大主流 Web服务器的区别 +* 是否看过框架的一些代码 +* 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些 +* 数值提升是什么 +* 你能解释一下里氏替换原则吗 +* 你是如何测试一个应用的?知道哪些测试框架 +* 传输层常见编程协议有哪些?并说出各自的特点 + +## 编程题 +### 计算加班费 +加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时) +* 计算1000月薪,加班9小时的加班费 +* 计算2500月薪,加班11小时的加班费 +* 计算1000月薪,加班15小时的加班费 + +### 卖东西 +一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。 +* 模拟一个进货。红苹果跟青苹果各进200个。 +* 模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。 + +提示:一个苹果是一个单独的实体。 + +### 日期提取 +有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08 + +### 线程 +* 8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 +* 用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出 +* wait-notify 写一段代码来解决生产者-消费者问题 + +### 数字 +* 判断101-200之间有多少个素数,并输出所有素数 +* 用最有效率的方法算出2乘以17等于多少 +* 有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优 +* 2 亿个随机生成的无序整数,找出中间大小的值 +* 10 亿个数字里里面找最小的 10 个 +* 1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + ... + 9 + 1 + 0 + 1 + 1 +* 一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数 +* 一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素 +* 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? +* 求100-1000内质数的和 +* 求1到100的和的平均数 +* 求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和 +* 算出1到40的质数,放进数组里 + * 显示放组里的数 + * 找出第[5]个数 + * 删除第[9]个数,再显示删除后的第[9]个 +* 有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。 +* 有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数 +* 计算指定数字的阶乘 +* 开发 Fizz Buzz +* 给定一个包含 N 个整数的数组,找出丢失的整数 +* 一个排好序的数组,找出两数之和为m的所有组合 +* 将一个正整数分解质因数。例如:输入90,打印出90=2\*3\*3\*5。 +* 打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方 +* 原地交换两个变量的值 +* 找出4字节整数的中位数 +* 找到整数的平方根 +* 实现斐波那契 + +### 网络 +* 用Java Socket编程,读服务器几个字符,再写入本地显示 + +## 反射 +* 反射机制提供了什么功能? +* 反射是如何实现的 +* 哪里用到反射机制 +* 反射中 Class.forName 和 ClassLoader 区别 +* 反射创建类实例的三种方式是什么 +* 如何通过反射调用对象的方法 +* 如何通过反射获取和设置对象私有字段的值 +* 反射机制的优缺点 + +### 数据库 +* 写一段 JDBC 连Oracle的程序,并实现数据查询 + +### 算法 +* 50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少 +* 实现一个电梯模拟器用 +* 写一个冒泡排序 +* 写一个折半查找 +* 随机产生20个不能重复的字符并排序 +* 写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组 +* 写一段代码在遍历 ArrayList 时移除一个元素 +* 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 +* 约瑟芬环游戏 + +### 正则 +* 请编写一段匹配IP地址的正则表达式 +* 写出一个正则表达式来判断一个字符串是否是一个数字 + +### 字符串 +* 写一个方法,入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。 +* 写一个程序找出所有字符串的组合,并检查它们是否是回文串 +* 写一个字符串反转函数,输入abcde转换成edcba代码 +* 小游戏,倒转句子中的单词 +* 将GB2312编码的字符串转换为ISO-8859-1编码的字符串 +* 请写一段代码来计算给定文本内字符“A”的个数。分别用迭代和递归两种方式 +* 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个” +* 给定 2 个包含单词列表(每行一个)的文件,编程列出交集 +* 打印出一个字符串的所有排列 +* 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七) +* 在Web应用开发过程中经常遇到输出某种编码的字符,如从 GBK 到 ISO8859-1等,如何输出一个某种编码的字符串 + +## 日期 +* 计算两个日期之间的差距 \ No newline at end of file diff --git a/program-tool/search-skill.md b/program-tool/search-skill.md new file mode 100644 index 0000000..079127a --- /dev/null +++ b/program-tool/search-skill.md @@ -0,0 +1,24 @@ +# 搜索技巧 + +* 搜索引擎 +* GitHub + +## 搜索引擎 +* \+ 强迫包含:举例, `java +面试` *注意空格与加号影响效果* +* \- 去除:举例,`java +面试 -培训` +* ~ 同义词:举例,`~架构` *效果不是太明显* +* "" 强加于搜索(避免忽略词):举例,`"面试的艺术"` *不加(英文)双引号,的,会被忽略* +* 或:举例,搜索 Java 或 Python 面试题,`(java | python) +面试` *百度与其他引擎不同,其他用 OR* +* intitle:举例,`面试题 allintitle:jvm` +* inurl:举例,`java inurl:executors` +* filetype:举例,`spring boot (filetype:doc | filetype:xls | filetype:ppt)` +* site:举例,`java tutorial site:oracle.com` *网站域名不能有“http://”前缀,也不能有任何“/”的目录后缀* +* intext:举例,`intext:java面试` + +## GitHub +对于GitHub内容的搜索,建议在 [https://github.com/search](https://github.com/search) 页面 + +* 搜索关键字最好使用英文,`java 面试` 比 `java interview` 搜索到的结果要少很多 +* 搜索完毕,可以在 **Languages** 列表上选择编程语言 +* 搜索结果,可筛选条件 **sort by**,建议按照评价 **most stars** 筛选 + diff --git a/program-tool/weixin-app.md b/program-tool/weixin-app.md new file mode 100644 index 0000000..8b47cfc --- /dev/null +++ b/program-tool/weixin-app.md @@ -0,0 +1,425 @@ +# 微信小程序 + +* [开发文档](#wxdoc) + * [小程序API](#wxapi) + * [MINA框架](#mina) + * [WeUI组件](#weui) +* 教程 + * [官网简易教程](https://mp.weixin.qq.com/debug/wxadoc/dev/) +* 学习日志 + * [X天小程序开发速度入门--第1天](../program-blog/learn-weixin-app-day1.md) + * [X天小程序开发速度入门--第2天](../program-blog/learn-weixin-app-day2.md) + * [X天小程序开发速度入门--第3天](../program-blog/learn-weixin-app-day3.md) + * [X天小程序开发速度入门--第4天](../program-blog/learn-weixin-app-day4.md) + * [X天小程序开发速度入门--第5天](../program-blog/learn-weixin-app-day5.md) + * [X天小程序开发速度入门--第6天](../program-blog/learn-weixin-app-day6.md) +* 练习项目 +* 相关技术 + * 前端 + * JavaScript + * 后台 + * HTTP + * 设计 + * 产品 + * 维护 +* 其他资源 + * [官网](https://mp.weixin.qq.com/) + * [微信开发者工具 ](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/download.html?t=1510576089) + * [基础库](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/client-lib.html) + * [微信开发者社区](https://developers.weixin.qq.com/home?token=137700584&lang=zh_CN) + * 注意事项 + * [要求真机调试的功能](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/notsupport.html) + * [不支持的ES6 API](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/details.html#客户端es6-api-支持情况) + +

开发文档

+ +

微信开发者文档

+ +[文档主页](https://mp.weixin.qq.com/debug/wxadoc/dev/index.html) + +* [微信开发者工具简介](https://mp.weixin.qq.com/debug/wxadoc/dev/devtools/devtools.html) + +

小程序API

+ +[API文档](https://mp.weixin.qq.com/debug/wxadoc/dev/api/) + +* [网络](#wxapi-net) +* 媒体 + * [图片](#wxapi-img) + * [录音及管理](#wxapi-record) + * [音乐播放](#wxapi-audio) + * [视频播放](#wxapi-video) +* [文件](#wxapi-file) +* [数据缓存](#wxapi-storage) +* [位置](#wxapi-location) +* [设备](#wxapi-device) + * 系统信息 + * 网络状态 + * 加速度计 + * 罗盘 + * 拨打电话 + * 扫码 + * 剪切板 + * 蓝牙 + * iBeacon + * 屏幕亮度 + * 用户截屏事件 + * 震动 + * 手机联系人 +* [界面交互](#wxapi-react) + * 交互反馈 + * 设置导航条 + * 设置置顶信息 + * 导航 + * 动画 + * 位置 + * 绘图 + * 下拉刷新 +* [WXML节点信息](#wxapi-) +* [第三方平台](#wxapi-) +* [开放接口](#wxapi-) +* [数据](#wxapi-) +* [拓展接口](#wxapi-) +* [调试接口](#wxapi-) + +

网络

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.request | 发起网络请求 | | | +| wx.uploadFile | 上传文件 | | | +| wx.downloadFile | 下载文件 | | | +| wx.connectSocket | 创建 WebSocket 连接 | | | +| wx.onSocketOpen | 监听 WebSocket 打开 | | | +| wx.onSocketError | 监听 WebSocket 错误 | | | +| wx.sendSocketMessage | 发送 WebSocket 消息 | | | +| wx.onSocketMessage | 接受 WebSocket 消息 | | | +| wx.closeSocket | 关闭 WebSocket 连接 | | | +| wx.onSocketClose | 监听 WebSocket 关闭 | | | + +

图片

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.chooseImage | 从本地相册选择图片或使用相机拍照 | | | +| wx.previewImage | 预览图片 | | | +| wx.getImageInfo | 获取图片信息 | | | +| wx.saveImageToPhotosAlbum | 保存图片到系统相册 | | | + +

录音及管理

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.startRecord | 开始录音 | 1.6.0 版本开始,本接口不再维护。建议使用能力更强的 wx.getRecorderManager 接口 | | +| wx.stopRecord | 停止录音 | | | +| wx.getRecorderManager | 获取全局唯一的录音管理器 `recorderManager` | 基础库 1.6.0 开始支持 | | + +

音乐播放

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.playVoice | 开始播放语音 | 同时只允许一个语音文件正在播放,如果前一个语音文件还没播放完,将中断前一个语音播放 | 1.6.0 版本开始,本接口不再维护。建议使用能力更强的 [wx.createInnerAudioContext](https://mp.weixin.qq.com/debug/wxadoc/dev/api/createInnerAudioContext.html) 接口 | +| wx.pauseVoice | 暂停正在播放的语音 | 再次调用wx.playVoice播放同一个文件时,会从暂停处开始播放。如果想从头开始播放,需要先调用 wx.stopVoice | | +| wx.stopVoice | 结束播放语音 | | | +| wx.getBackgroundAudioPlayerState | 获取后台音乐播放状态 | 1.2.0 版本开始,本接口不再维护。建议使用能力更强的 [wx.getBackgroundAudioManager](https://mp.weixin.qq.com/debug/wxadoc/dev/api/getBackgroundAudioManager.html) 接口 | | +| wx.playBackgroundAudio | 使用后台播放器播放音乐 | 微信客户端来说,只能同时有一个后台音乐在播放。当用户离开小程序后,音乐将暂停播放;当用户点击“显示在聊天顶部”时,音乐不会暂停播放;当用户在其他小程序占用了音乐播放器,原有小程序内的音乐将停止播放 | | +| wx.pauseBackgroundAudio | 暂停播放音乐 | | | +| wx.seekBackgroundAudio | 控制音乐播放进度 | | | +| wx.stopBackgroundAudio | 停止播放音乐 | | | +| wx.onBackgroundAudioPlay | 监听音乐播放 | | | +| wx.onBackgroundAudioPause |监听音乐暂停 | | | +| wx.onBackgroundAudioStop | 监听音乐停止 | | | +| wx.getBackgroundAudioManager | 获取全局唯一的背景音频管理器 `backgroundAudioManager` | 基础库 1.2.0 开始支持 | | +| wx.createAudioContext | 创建并返回 audio 上下文 `audioContext` 对象 | 1.6.0 版本开始,本接口不再维护。建议使用能力更强的 [wx.createInnerAudioContext](https://mp.weixin.qq.com/debug/wxadoc/dev/api/createInnerAudioContext.html) 接口 | | +| wx.createInnerAudioContext | 创建并返回内部 audio 上下文 `innerAudioContext` 对象 | 本接口是 wx.createAudioContext 升级版 | | + +

视频播放

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.chooseVideo | 拍摄视频或从手机相册中选视频,返回视频的临时文件路径 | | | +| wx.saveVideoToPhotosAlbum | 保存视频到系统相册。需要用户授权 [scope.writePhotosAlbum](https://mp.weixin.qq.com/debug/wxadoc/dev/api/authorize-index.html) | | | +| wx.createVideoContext | 创建并返回 video 上下文 `videoContext` 对象 | | | +| wx.createCameraContext | 创建并返回 camera 上下文 `cameraContext` 对象,`cameraContext` 与页面的 `camera` 组件绑定 | 一个页面只能有一个camera,通过它可以操作对应的 `` 组件 | | + +

文件

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.saveFile | 保存文件到本地 | | | +| wx.getFileInfo | 获取文件信息 | | | +| wx.getSavedFileList | 获取本地已保存的文件列表 | | | +| wx.getSavedFileInfo | 获取本地文件的文件信息 | 只能用于获取已保存到本地的文件,若需要获取临时文件信息,请使用 wx.getFileInfo 接口 | | +| wx.removeSavedFile | 删除本地存储的文件 | | | +| wx.openDocument | 新开页面打开文档 | 支持格式:doc, xls, ppt, pdf, docx, xlsx, pptx | | + +

数据缓存

+ +本地数据存储的大小**限制为 10MB** + +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.setStorage | 将数据存储在本地缓存中指定的 key 中 | 会覆盖掉原来该 key 对应的内容,这是一个异步接口 | | +| wx.setStorageSync | 将 data 存储在本地缓存中指定的 key 中 | 会覆盖掉原来该 key 对应的内容,这是一个同步接口 | | +| wx.getStorage | 从本地缓存中异步获取指定 key 对应的内容 | | | +| wx.getStorageSync | 从本地缓存中同步获取指定 key 对应的内容 | | | +| wx.getStorageInfo | 异步获取当前storage的相关信息 | | | +| wx.getStorageInfoSync | 同步获取当前storage的相关信息 | | | +| wx.removeStorage | 从本地缓存中异步移除指定 key | | | +| wx.removeStorageSync | 从本地缓存中同步移除指定 key | | | +| wx.clearStorage | 清理本地数据缓存 | | | +| wx.clearStorageSync() | 同步清理本地数据缓存 | | | + + +

位置

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.getLocation | 获取当前的地理位置、速度 | 用户离开小程序后,此接口无法调用;当用户点击“显示在聊天顶部”时,此接口可继续调用 | | +| wx.chooseLocation | 打开地图选择位置 | 需要[用户授权](https://mp.weixin.qq.com/debug/wxadoc/dev/api/authorize-index.html) scope.userLocation | | +| wx.openLocation | ​使用微信内置地图查看位置 | 需要[用户授权](https://mp.weixin.qq.com/debug/wxadoc/dev/api/authorize-index.html) scope.userLocation | | +| wx.createMapContext | 创建并返回 map 上下文 `mapContext` 对象 | | | + +

设备

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.getSystemInfo | 获取系统信息 | | | +| wx.getSystemInfoSync | 获取系统信息同步接口 | | | +| wx.canIUse | 判断小程序的API,回调,参数,组件等是否在当前版本可用 | | | +| wx.getNetworkType | 获取网络类型 | | | +| wx.onNetworkStatusChange | 监听网络状态变化 | | | +| wx.onAccelerometerChange | 监听加速度数据 | 频率:5次/秒,接口调用后会自动开始监听,可使用 `wx.stopAccelerometer` 停止监听 | | +| wx.startAccelerometer | 开始监听加速度数据 | | | +| wx.stopAccelerometer | 停止监听加速度数据 | | | +| wx.onCompassChange | 监听罗盘数据 | 频率:5次/秒,接口调用后会自动开始监听,可使用 `wx.stopCompass` 停止监听 | | +| wx.startCompass | 开始监听罗盘数据 | | | +| wx.stopCompass | 停止监听罗盘数据 | | | +| wx.makePhoneCall | 拨打电话 | | +| wx.scanCode | 调起客户端扫码界面,扫码成功后返回对应的结果 | | +| wx.setClipboardData | 设置系统剪贴板的内容 | | | +| wx.getClipboardData | 获取系统剪贴板内容 | | | +| wx.onUserCaptureScreen | 监听用户主动截屏事件 | 用户使用系统截屏按键截屏时触发此事件 | | +| wx.setScreenBrightness | 设置屏幕亮度 | | | +| wx.getScreenBrightness | 获取屏幕亮度 | | | +| wx.setKeepScreenOn | 设置是否保持常亮状态 | 仅在当前小程序生效,离开小程序后设置失效 | | +| wx.vibrateLong | 使手机发生较长时间的振动(400ms) | | | +| wx.vibrateShort | 使手机发生较短时间的振动(15ms) | | | +| wx.addPhoneContact | 调用后,用户可以选择将该表单以“新增联系人”或“添加到已有联系人”的方式,写入手机系统通讯录,完成手机通讯录联系人和联系方式的增加。 | | | + +
蓝牙
+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.openBluetoothAdapter | 初始化小程序蓝牙模块 | 生效周期为调用 `wx.openBluetoothAdapter` 至调用 `wx.closeBluetoothAdapter` 或小程序被销毁为止 | | +| wx.closeBluetoothAdapter | 关闭蓝牙模块,使其进入未初始化状态 | 调用该方法将断开所有已建立的链接并释放系统资源。建议在使用小程序蓝牙流程后调用,与 `wx.openBluetoothAdapter` 成对调用 | | +| wx.getBluetoothAdapterState | 获取本机蓝牙适配器状态 | | | +| wx.onBluetoothAdapterStateChange | 监听蓝牙适配器状态变化事件 | | | +| wx.startBluetoothDevicesDiscovery | 开始搜寻附近的蓝牙外围设备 | 该操作比较耗费系统资源,请在搜索并连接到设备后调用 stop 方法停止搜索 | | +| wx.stopBluetoothDevicesDiscovery | 停止搜寻附近的蓝牙外围设备 | | | +| wx.getBluetoothDevices | 获取在小程序蓝牙模块生效期间所有已发现的蓝牙设备 | 包括已经和本机处于连接状态的设备 | | +| wx.getConnectedBluetoothDevices | 根据 uuid 获取处于已连接状态的设备 | | | +| wx.onBluetoothDeviceFound | 监听寻找到新设备的事件 | | | +| wx.createBLEConnection | 连接低功耗蓝牙设备 | | | +| wx.closeBLEConnection | 断开与低功耗蓝牙设备的连接 | | | +| wx.getBLEDeviceServices | 监听低功耗蓝牙连接的错误事件 | 包括设备丢失,连接异常断开等等 | | +| wx.getBLEDeviceCharacteristics | 获取蓝牙设备所有 service(服务) | | | +| wx.readBLECharacteristicValue | 读取低功耗蓝牙设备的特征值的二进制数据值 | 必须设备的特征值支持 `read` 才可以成功调用,具体参照 characteristic 的 properties 属性 | | +| wx.writeBLECharacteristicValue | 向低功耗蓝牙设备特征值中写入二进制数据 | 必须设备的特征值支持 `write` 才可以成功调用,具体参照 characteristic 的 properties 属性 | | +| wx.notifyBLECharacteristicValueChange | 启用低功耗蓝牙设备特征值变化时的 notify 功能,订阅特征值 | 必须设备的特征值支持 `notify` 或者 `indicate` 才可以成功调用 | | +| wx.onBLEConnectionStateChange | 监听低功耗蓝牙设备的特征值变化 | 必须先启用 `notify` 接口才能接收到设备推送的 notification | | +| wx.onBLECharacteristicValueChange | | | | + +**蓝牙错误码列表** + +|错误码 |说明 |备注 | +| :------------ |:---------------| :-----| +| 0 | ok | 正常 | +| 10000 | not init | 未初始化蓝牙适配器 | +| 10001 | not available | 当前蓝牙适配器不可用 | +| 10002 | no device | 没有找到指定设备 | +| 10003 | connection fail | 连接失败 | +| 10004 | no service | 没有找到指定服务 | +| 10005 | no characteristic | 没有找到指定特征值 | +| 10006 | no connection | 当前连接已断开 | +| 10007 | property not support | 当前特征值不支持此操作 | +| 10008 | system error | 其余所有系统上报的异常 | +| 10009 | system not support | Android 系统特有,系统版本低于 4.3 不支持BLE | + +
iBeacon
+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.startBeaconDiscovery | 开始搜索附近的iBeacon设备 | | | +| wx.stopBeaconDiscovery | 停止搜索附近的iBeacon设备 | | | +| wx.getBeacons | 获取所有已搜索到的iBeacon设备 | | | +| wx.onBeaconUpdate | 监听 iBeacon 设备的更新事件 | | | +| wx.onBeaconServiceChange | 监听 iBeacon 服务的状态变化 | | | + +**iBeacon错误码列表** + +|错误码 |说明 |备注 | +| :------------ |:---------------| :-----| +| 0 | ok | 正常 | +| 11000 | unsupport | 系统或设备不支持 | +| 11001 | bluetooth service unavailable | 蓝牙服务不可用 | +| 11002 | location service unavailable | 位置服务不可用 | +| 11003 | already start | 已经开始搜索 | + +

界面交互

+ +|API |功能 |说明 |示例 | +| :------------ |:---------------| :-----| :-----| +| wx.showToast | 显示消息提示框 | | | +| wx.showLoading | 显示 loading 提示框 | 需主动调用 [wx.hideLoading](https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-react.html#wxhideloading) 才能关闭提示框 | | +| wx.hideToast | 隐藏消息提示框 | | | +| wx.hideLoading | 隐藏 loading 提示框 | | | +| wx.showModal | ​显示模态弹窗 | | | +| wx.showActionSheet | ​显示操作菜单 | | | +| wx.setNavigationBarTitle | 动态设置当前页面的标题 | | | +| wx.showNavigationBarLoading | 在当前页面显示导航条加载动画 | | | +| wx.hideNavigationBarLoading | 隐藏导航条加载动画 | | | +| wx.setNavigationBarColor | | | | +| wx.setTopBarText | 动态设置置顶栏文字内容 | | | +| wx.navigateTo | 保留当前页面,跳转到应用内的某个页面 | 使用 `wx.navigateBack` 可以返回到原页面 | | +| wx.redirectTo | 关闭当前页面,跳转到应用内的某个页面 | | | +| wx.switchTab | 跳转到 tabBar 页面,并关闭其他所有非 tabBar 页面 | | | +| wx.navigateBack | 关闭当前页面,返回上一页面或多级页面 | 可通过 `getCurrentPages()` 获取当前的页面栈,决定需要返回几层 | | +| wx.reLaunch | 关闭所有页面,打开到应用内的某个页面 | | | +| wx.createAnimation | 创建一个动画实例[animation](https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-animation.html#animation) | 调用实例的方法来描述动画。最后通过动画实例的`export`方法导出动画数据传递给组件的`animation`属性 | | +| wx.pageScrollTo | 将页面滚动到目标位置 | | | +| wx.createSelectorQuery | 返回一个SelectorQuery对象实例 | 可以在这个实例上使用`select`等方法选择节点,并使用`boundingClientRect`等方法选择需要查询的信息 | | +| Page.onPullDownRefresh | 在 Page 中定义 onPullDownRefresh 处理函数,监听该页面用户下拉刷新事件 | * 需要在 config 的window选项中开启 enablePullDownRefresh。 +* 当处理完数据刷新后,wx.stopPullDownRefresh可以停止当前页面的下拉刷新 | | +| wx.startPullDownRefresh | 开始下拉刷新,调用后触发下拉刷新动画,效果与用户手动下拉刷新一致 | | | +| wx.stopPullDownRefresh | 停止当前页面下拉刷新 | | | +| 绘图 | | | | + + +* WXML节点信息 +* 第三方平台 +* 开放接口 +* 数据 +* 拓展接口 +* 调试接口 + +

小程序框架 MINA

+ +[MINA主页](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/MINA.html) + +* [app.json配置](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/config.html) +* [WXML标签语言](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/) +* [WXSS样式表](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxss.html) +* [事件](https://mp.weixin.qq.com/debug/wxadoc/dev/framework/view/wxml/event.html) + +

小程序UI组件-WeUI

+ +[基础组件](https://mp.weixin.qq.com/debug/wxadoc/dev/component/) + +

微信开发者工具

+ +

调试

+ +* 调试器 Console:输入和调试代码,比起在debug里面查看变量方便很多 +* 调试器 Wxml:可以直接查看wxml 转化后的界面,与chrome里面查看html的DOM模型一样 +* 调试器 Source:查看源码,下断点,调试 +* 调试器 AppData:查看数据非常方便,比如定义的userInfo、motto等信息 +* 调试器 Storage:查看本地存储,配合清缓存调试 +* 调试器 Network:查看网络调用,与后台通信时用到 +* 调试器 Sensor:模拟地理位置和重力感应,高级功能(不大常用:P) + +

相关技术

+ +

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 中分别进行了赋值和使用 + +

console.log

+ +``` + getUserInfo: function(e) { + console.log(e) +``` + +这是很重要的调试技巧,上面的代码把 `UserInfo` 在Console面板中打印了出来 + +* Source面板下断点 +* 执行 `console.log(e)` 或者 直接在Console面板下输入 `console.log(e)` 回车,都可以看到返回的用户信息 + + diff --git a/program-vocabulary/java.md b/program-vocabulary/java.md new file mode 100644 index 0000000..07ae74d --- /dev/null +++ b/program-vocabulary/java.md @@ -0,0 +1,373 @@ +# 编程词汇表 + +**抽象类(abstract class):**抽象类不能创建对象,主要用来创建子类。Java中的抽象类使用 abstract 修饰符定义。 + +**抽象数据类型(abstract data type ADT):**抽象数据类型指明了可能的类型和允许进行的操作,但是没有提供实现。 + +**访问标识符(access specifier):**用于方法或变量定义,限定了哪些类可以访问该方法或变量。Java中的访问标识符有 public、protected 和 private。没有访问标识符修饰的方法或变量默认可见性为“package”。 + +**活动记录(activation record):**活动记录是包含了实现子程序调用必须的所有信息,包括参数值、子程序中的本地变量和子程序调用结束时计算机的返回地址。活动记录存储在栈中,使得多个子程序调用同时活跃成为可能。这对递归非常重要,递归时对同一个子程序的多个调用要求同时激活。 + +**实参(actual parameter):**子程序的参数叫做声明。当调用执行时,通过声明把值传递给自函数。实参也叫做“参数”。 + +**地址(address):**计算机内存中的每个位置都有一个地址,表示该位置的编号。内存中的位置按序号排列。在现代计算机中,内存中的每个字节都有自己的地址。在存储或读取内存信息时用需要用到地址。 + +**算法(algorithm):**完成某项任务所需要的一步一步的过程,过程本身没有歧义,且可以保证在有限的步骤内完成该任务。 + +**阿尔法颜色组成(alpha color component):**颜色组成用来描述颜色的透明度或不透明度。阿尔法组成越高,颜色越不透明。 + +**API:**应用编程接口。针对软件包或“工具箱”的接口说明。API包含了工具箱中所有类或子程序及其使用说明。 + +**Applet:**与可以单独运行的应用程序不同,Applet是一种在Web浏览器中运行在Web页面上的Java程序。 + +**动画(animation):**由一组静态图片快速显示展示出动态效果。每一幅静态图片叫做帧。在Java中,动画通常由 Timer 对象驱动。每次定时器触发时,会显示动画的下一帧。 + +**反锯齿(antialiasing):**当图形和文本以像素方式显示时,可以通过调整像素的颜色减轻“锯齿”效应。反锯齿画图时,图形只覆盖像素的一部分,图形的颜色与该像素之前的颜色混合而成。混合的程度由覆盖像素的多少决定。 + +**数组(array):**一个顺序排列的元素列表。列表中,每个元素都可以由自己的索引标识,即序号。在Java中,数组里所有元素必须类型相同,该类型也称作数组的基类型。数组是一种可随机访问的数据结构,也就是说,你可以随时直接访问数组中的任意元素。 + +**数组类型(array type):**这种数据类型的值是数组。比如类型的名字为 Type,那么 Type[] 就是数组类型,基类型为 Type。 + +**赋值语句(assignment statement):**计算机程序中的一种语句,可以读取或计算数值,并将其存储到变量中。Java中的赋值语句形式为:**变量名 = 表达式**。 + +**异步事件(asynchronous event):**异步事件指发生时间不可预料的事件,计算机程序无法对其控制。像点击鼠标、按键这样的用户输入事件都是异步的。 + +**ASCII码:**美国信息交换标准码。这种编码使用7个比特对字符编码。ASCII码只支持128个字符,不支持重音字符、非英语字符、特殊符号或非字符化语言的表意符号,比如中文。Java采用了容量更大、更加完整的Unicode编码处理字符。 + +**基线条件(base case):**在递归算法中,基线条件可以直接处理不需要继续递归。 + +**二进制数(binary number):**数值被编码为一组0、1序列。一般数字以“10为基数”,二进制数与其类似,只是以“2为基数”。 + +**二叉树(binary tree):**二叉树是一种链式数据结构。可以为空树,或者由两棵更小的二叉树(可能为空树)与根节点组成。根节点包含了指向两棵子树的指针。这两棵更小的二叉树被称作左子树和右子树。 + +**比特(bit):**一位二进制数,可能是0或1。 + +**黑盒(black box):**指系统或组件在使用时无需关心内部结构。黑盒包括接口和实现。在系统中,被当做组件使用的黑盒叫做模块。 + +**块(block):**在Java编程中,被花括号({})包围的一组语句称为块。(代码)块用来将一组语句组合成一条语句。块可以为空,表示不包含任何语句,即一对空的花括号。 + +**阻塞操作(blocking operation):**一个操作如果需要等待某些事件发生就称为“阻塞”操作,比如从网络连接读取数据。执行阻塞操作的线程会一直处在“阻塞”状态,直到事件发生。处于阻塞状态时,线程不能执行任何指令。而程序中的其它线程可以继续执行。 + +**阻塞队列(blocking queue):**当阻塞队列为空时,出队操作会引发阻塞,直到队列中有新成员加入。如果阻塞队列有大小限制,当队列填满时,入队操作也会引起阻塞。 + +**自底向上设计(bottom-up design):**自底向上设计是一种软件设计方法。从系统的基础组件开始设计,然后将它们组合成更复杂的组件,诸如此类。 + +**BufferedImage类:**BufferedImage类展示了“屏外画布”,即图片存储在计算机内存中,可以在屏幕外进行绘制。 + +**分支(branch):**分支是一种控制结构,计算机通过分支从2个或多个不同的执行路径中进行选择。Java有两种分支语句:**if 语句和 switch 语句**。 + +**字节(byte):**字节是一种由8个比特组成的内存单元。一个字节可以保存8个比特二进制数。 + +**字节码(bytecode):**“Java字节码”是Java虚拟机机器语言的常用名称。Java程序会被编译成Java字节码,后者由JVM执行。 + +**字符集(charset):**字符集是一种将字符数据编码为二进制的特定编码形式。例如UTF-8和ISO-8859-1。 + +**受检异常(checked exception):**在Java中受检异常必须处理,可以通过 try catch 语句捕获,或者在方法上使用 throw 语句抛出该异常。如果没有用这两种方式处理受检异常,会报告语法错误。 + +**类(class):**类是Java的基础编程单元。类是静态方法、非静态方法和变量的集合。静态成员是类自身的一部分,非静态或“实例”成员是创建对象的蓝本,由此创建的对象“属于”该类。 + +**类变量(class variable)和类方法(class methods):**“静态变量”和“静态方法”的别名。它们是类的一部分,与对象无关。 + +**客户端/服务器(client/server):**一种网络通讯模式。其中,“服务器”在网络上守候某个已知地址,等待“客户端”向它发起连接请求。这是TCP/IP协议的基础通讯模型。 + +**命令行接口(command-line interface):**一种计算机交互方法。用户向计算机输入命令,计算机对每个命令进行响应。 + +**注释(comment):**在一个计算机程序中,注释是那些被计算机忽略的文本。注释的目的是方便人们阅读,帮助理解程序。 + +**编译器(compiler):**编译器是一种计算机程序,将某种计算机语言(通常是高级语言)编写的程序翻译成机器语言程序。 + +**组件(component):**组件是对GUI可视元素的泛称,包括窗口、按钮或菜单等。在Java中,组件表现为 java.awt.Component 子类创建的对象。 + +**构造函数(constructor):**类的一种特殊子程序,主要用来创建类的对象。构造函数一般使用 new 操作符进行调用,通常不被看做“方法”。 + +**容器(container):**类似 JPanel 这样的组件,容器可以包含其它GUI组件。调用容器的 add() 方法可以向其添加组件。 + +**方法契约(contract of a method):**方法接口的语义组件。它指明了方法及其调用者的职责,如何调用该方法,以及正确调用方法时会执行的任务。方法契约应当在该方法的 Javadoc注释中完整说明。 + +**控制结构(control structure):**类似 if 语句、while 循环这样可影响程序控制流(即程序中指令执行顺序)的程序结构。 + +**CPU:**中央处理器。CPU是计算机中实际执行计算和运行程序的部分。 + +**数据结构(data structure):**经过组织的数据集合。在程序中被当做一个单元处理。 + +**死锁(deadlock):**一种多个线程无限等待的情况。出现死锁的原因,比如每个线程都在等待其它线程锁定的资源。 + +**默认方法(default method):**Java 8 接口中的方法,该方法提供了自己的实现。所有实现带有默认方法的接口都可以使用默认实现,但是不能覆盖默认方法。通过 default 保留字标记默认方法。Java 7不支持默认方法。 + +**默认包(default package):**默认包没有包名。没有在带有名字的包中声明的类都归属默认包。 + +**明确赋值(definite assignment):**在程序中,变量在使用前必须确保已经被赋值。局部变量只有在赋值后才能合法使用。为了达到这个要求,编译器必须对变量从声明开始到使用的每条路径都进行赋值检查。 + +**弃用(deprecated):**表示已经废弃,但为了先后兼容仍然保留。弃用的Java类或方法仍然是Java语言的一部分,但不建议在新代码中使用。在未来的Java版本中,弃用的内容会被移除。 + +**对话框(dialog box):**对话框是依赖其它窗体创建的新窗体。弹出对话框通常用作获取用户信息或展示消息。Swing API中,对话框表示为 JDialog 创建的对象。 + +**分布式计算(distributed computing):**一种在由网络连接的多个计算机中进行的并行处理。 + +**虚参数(dummy parameter):**调用子程序时,用来代替实际传入参数的标识符。虚参数也叫“形式参数”(有时候会用“变元 argument”表示实参,这时虚参数也叫做“参数”)。 + +**enum:**枚举类型。枚举类型的定义中列举了该类型所有可能值。在Java中,枚举类型是一个类,所有可能的值都是对象。 + +**事件(event):**在GUI编程中,事件指发生在程序控制以外的操作,比如点击鼠标。程序必须对发生的事件进行响应。 + +**异常(exception):**程序控制流程之外的错误或异常情况。在Java中,异常表示为 Throwable 对象,可以由 try..catch 语句捕捉并处理。 + +**获取-执行周期(fetch-and-execute cycle):**也称指令周期。指CPU执行机器语言程序的过程。CPU会从内存获取(即读取)指令,执行(运行)指令,然后再循环重复该过程。 + +**标志(flag):**一个布尔值。设为 true 时表示达到某些条件或发生了某种事情。可利用二进制数中的某个比特位作为标志。 + +**形式参数(formal parameter):**“虚拟参数”的另一种说法。 + +**帧(frame):**组成动画的某一幅画面,也是活动记录的另一种说法。 + +**函数(function):**带有返回值的子程序。 + +**垃圾回收(garbage collection):**自动回收内存的过程。被回收的内存由对象占用但已不再会对其访问。 + +**泛型编程(generic programming):**编写的代码不仅限于单一数据类型,可适应多种数据类型。Java集合框架及其它使用了相似技术的类都是泛型编程的实例。 + +**getter方法:**类中的一个实例方法,用来读取类的某个属性值。通常,属性代表一些实例变量的值。按惯例,getter方法被命名为 getXyz(),其中 xyz 是属性的名字。 + +**全局变量(global variable):**成员变量的别名。强调类中的成员变量可以在类方法外存在。 + +**图形上下文(graphics context):**用来绘制某些特定地点所必须得数据和方法。Java中的图形上下文是属于 Graphics 类的对象。 + +**GUI:**图形用户界面是与计算机的现代交互方式。计算机通过GUI在显示器上展示类似按钮和菜单这样的接口组件,用户可以通过像鼠标点击这样的方式与之交互。 + +**哈希表(hash table):**一种优化的数据结构,可以高效搜索、插入和删除对象。哈希表包含对象的地址数组。对象存储的地址由自身的“哈希代码”决定。通过对象的内容可以高效地计算出地址整数值。 + +**堆(heap):**计算机内存中存储对象的区域。 + +**高级语言(high level language):**类似Java这样的计算机语言,方便人们阅读,但在执行前需要翻译成机器语言。 + +**HSB:**一种颜色系统。其中颜色由3个数值表示(在Java中,实际的数值在0.0到1.0之间)。分别代表色调、饱和度和亮度。 + +**IDE:**集成开发环境。带图形用户界面的编程环境,集成了创建、编辑和执行程序的各种工具。 + +**标识符(identifier):**在程序中可用作名字的一组标识符。标识符可用作变量名、方法名和类名。 + +**索引号(index):**元素在数组中的位置编号。 + +**实现(implementation):**黑盒的内部实现,比如子程序的实现代码。 + +**不可变对象(immutable object):**不可变对象构造完成后不能改变,因为实例中所有变量都标记为 final。 + +**无限循环(infinite loop):**循环永远不会结束,因为它的循环条件永远判定为 true。 + +**继承(inheritence):**一个类可以继承另一个类。继承者会从父类继承数据和行为。 + +**类的实例(instance of a class):**指归属于类(或者该类型子类)的对象。当类用作对象模板时,对象由类中的构造函数创建的对象归属于这个类。 + +**实例方法(instance method):**类中的非静态方法,该类的所有实例都具有该方法。 + +**实例变量(instance variable):**类中的非静态变量,该类的所有实例都包含该变量。 + +**接口(interface):**对如何使用类似子程序这样的黑盒子一种通用说法。接口对其内部发生的情况没有提供任何信息。“interface”同时也是Java中的保留字。从这个意义上说,接口是一种定义了一个或多个抽象方法的类型。实现该接口的对象必须提供这些方法的定义。 + +**解释器(interpreter):**一种执行程序的计算机程序,被执行的程序由某种编程语言编写。通过从程序中一个接一个读取指令然后逐条执行(将指令翻译为等价的机器语言)。 + +**I/O:**输入/输出。计算机程序与其它部分的通讯方式,比如向用户展示数据、从用户那里获取信息、读写文件、通过网络发送和获取数据。 + +**迭代器(iterator):**与 list 或 set 这样的集合相关联的对象。可用来对该集合进行遍历。迭代器会轮流访问集合中的每个元素。 + +**Java集合框架(Java Collection Framework JCF):**一组实现了泛型数据结构的标准类。包括 ArrayList、TreeSet等。 + +**JavaFX:**新的应用程序GUI工具集。在Java 8中推荐使用。JavaFX不在本书的讨论范围。 + +**JDK:**Java开发工具集。支持编译、运行Java程序的基本软件。JDK包含命令行编程环境以及JRE。要编译Java源代码或执行预编译程序时,需要使用JDK。 + +**JRE(Java Runtime Environment):**Java运行时环境。支持运行已编译的标准Java程序。JRE包括一个Java虚拟机和所有标准的Java类。 + +**即时编译器(just-in-time compiler):**一种解释器和编译器的结合,在解释程序某部分的同时可对其进行编译。接下来对该部分程序执行时比首次运行更快速。这样可以大大提高执行速度。现代JVM都使用了即时编译器。 + +**JVM:**Java虚拟机。将Java字节码作为机器语言执行的虚拟计算机。也用来称呼解析字节码程序的计算机程序。要在计算机上运行Java程序需要使用JVM。 + +**布局管理器(layout manager):**负责对容器中组件进行布局的对象。进行的部分操作包括设置大小和位置。不同类型的布局管理器实现的布局策略各不相同。 + +**链式数据结构(linked data structure):**一组由之指针相互链接的对象数据。这些指针存储在对象的实例变量中。链式数据结构包括链表和二叉树。 + +**链表(linked list):**一种链式数据结构,节点之间由指针串连形成线性链表。 + +**监听器(listener):**在GUI编程中,可以向对象注册特定事件的触发通知。因此可以说,对象在“监听”这些事件。 + +**文字(literal):**在程序中键入的一组字符序列,表示常量值。例如,当A在Java程序中出现时,’A'是一个常量字符。 + +**(内存)位置(location in memory):**计算机内存由一系列位置组成。这些位置顺序编号,标识特定位置的编号被称为该位置的地址。 + +**本地变量(local variable):**在方法内部声明的变量,只能在该方法内部使用。代码块中声明变量的有效性,从声明处开始到该代码块的尾部结束。 + +**循环(loop):**一种控制结构,重复执行一组指令。Java提供了3种循环:**for 循环、while 循环和 do 循环**。 + +**循环控制变量(loop control variable):**for 循环中的变量,每次执行 for 循环时都会修改循环变量值,通过检查该变量决定是否结束循环。 + +**机器语言(machine language):**由计算机能够直接执行的指令组成的编程语言。机器语言中的指令会被编码成二进制数。每种类型的计算机都有自己的机器语言。用其它语言编写的程序必须翻译为该计算的机器语言,才能在它上面执行。 + +**主内存(main memory):**程序和数据可以存储在计算机的主内存中,主内存可以被CPU直接访问。其它形式的内存,比如磁盘驱动器,虽然也能存储信息,但是唯有主内存可被CPU直接访问。磁盘分区中的程序和数据只有拷贝到内存中才能被CPU访问。 + +**map:**一种映射数组。这种数据结构将一组(Collection)中的某个对象与摸个集合(Set)中的所有对象关联在一起。在Java中,map 由泛型接口 Map 表示。 + +**成员变量(member variable):**定义在类中的变量,但不属于任何方法。成员变量与本地变量不同,后者在某个方法中定义。 + +**内存(memory):**计算机中的内存用来存储程序和数据。 + +**方法(method):**子程序的另一种称呼,在面向对象编程中使用。方法指包含在类或对象中的子程序。 + +**模块(module):**大型系统中的组件,与系统中其它部分以简单、定义清晰、直接的方式进行交互。 + +**多任务(multitasking):**一次执行多个编程任务。要么在多个任务之间快速来回切换,要么同时逐个执行多个任务。 + +**多重处理(multiprocessing):**进行多任务处理时使用多个处理器。这样,多个任务可以同时逐个执行。 + +**互斥(mutual exclusion):**防止两个线程同时访问相同的资源。在Java中,这种方法应用于多个线程同时访问同步方法或同步语句中的资源。互斥可以阻止竞态条件,但是可能引发死锁。 + +**MVC模式(MVC pattern):**模型-视图-控制器模式。一种用在GUI组件中进行职责划分的策略。模型代表组件的数据,视图指该模型在屏幕上的展示,控制器负责响应模型变化事件。在MVC模式中,这些职责由不同的对象负责处理。 + +**非数值(NaN):**不是一个数值。Double.NaN表示一种特殊的 double 值,表示未定义或非法值。 + +**节点(node):**链式数据结构中,某个对象的常用称呼。 + +**null:**一种特殊的指针值,表示“没有指向任何东西”。 + +**数值分析(numerical analysis):**使用逼近法研究算法的领域,比如实数以及从逼近计算中得到的错误。 + +**差一错误(off-by-one error):**一种常见错误,处理时多减或多加了一个元素。通常是技术错误或者循环时由其它原因过早停止或过度执行造成的。 + +**对象(object):**计算机程序中带有数据(变量)和行为(方法)的实体。Java中的对象必须以某个类作为创建模板。对象所属的类决定了对象包含的类和方法。 + +**对象类型(object type):**这种类型的值是对象而非基础类型。类和接口都是对象类型。 + +**OOP(Object-Oriented Programming):**面向对象编程。一种计算机程序设计和实现的方法。OOP使用类和对象创建、表示实体及实体间的交互。 + +**操作系统(operating system):**在计算机中一直运行的基础软件。没有操作系统的计算机无法工作。操作系统由Linux、Mac OS 和 Windows Vista。 + +**操作符(operator):**类似“+”、“<=”或”++”这样的操作符,可以在表达式中计算一个或多个值。 + +**(操作符)重载(overloading of operators):**相同操作符可以在不同类型的数据上使用。比如“+”操作可以同时应用于数字和字符类型。 + +**(方法名)重载(overloading of method names):**同一个类中定义了几个名称相同的方法,区别在于各个方法的签名不同。 + +**重写(覆盖)(overriding):**在子类中进行重定义。子类中,对从父类继承的方法重新定义,新定义的方法就是对原方法进行重写。 + +**包(package):**在Java中,相关类和子包的有名集合称为包,例如 java.awt 和 javax.swing。 + +**并行处理(parallel processing):**同时执行多个任务,可以是多个处理器,也可以由一个处理器在多个任务间返复执行。 + +**参数(parameter):**调用子程序时,参数用来向子程序提供信息。在执行子程序代码前,子程序调用语句中的“实参”会分配给子程序定义的“虚参数”。 + +**参数化类型(parameterized type):**类似 ArrayList 这样,包含了一种或多种类型参数的类型(这里的参数类型是String)。 + +**解析(parsing):**确定预演中字符串语法结构的过程。解析字符串用来确定字符串中是否遵循该语言的语法;如果是,那么会确定该字符串是如何根据语法进行创建。 + +**部分完全数组(partially full array):**数组是用来存储数量各异的元素。部分完全数组表示为一个带有追踪元素个数计数器的普通数组。 + +**像素(pixel):**指屏幕或图片中的“图像元素”。一幅图像由像素的行和列组成。每个像素的色彩都可以单独设置。 + +**多态(polymorphism):**多态是指调用实例方法的意义取决于调用方法时对象的实际类型。也就是说,如果变量的类型是 var,那么调用方法的语句,比如 var.action() 取决于执行时 var 所指向的对象类型,而非 var 变量的类型。 + +**指针(pointer):**代表计算机内存中某个地址的值,因此可以看做“指向”具有该地址的位置。在Java中,变量不存有对象;变量只是指向存储该对象的位置。指针也称作“引用”。 + +**语用学(pragmatics):**描述如何编写好程序的经验法则。例如样式规则、程序组织指南都是编程语用学的一部分。 + +**优先级(precedence):**操作符的优先级指,在没有括号的情况下,表达式中多个操作符的作用顺序。 + +**前置条件(precondition):**在程序的执行过程中,为了让程序正确运行,前置条件必须判定为 true。子程序的前置条件是指,为了让子程序正确运行必须满足的前置条件。子程序的前置条件通常是对传入的子程序的实参值进行的限制。 + +**优先级队列(priority queue):**一种表示元素结合的数据结构,其中每个元素都有自己的“优先级”。优先级队列具有添加和移除操作。可以按照任意的顺序添加元素,但移除时总是先移除优先级最低的元素。(某些版本的优先级队列会先移除优先级最高的元素) + +**后置条件(postcondition):**在执行程序的某个节点,该条件的计算结果为 true。子程序的后置条件在子程序执行结束后必须为 true。函数的后置条件通常表示为函数的返回值。 + +**基本类型(primitive type):**Java的8个内建基本数据类型有 double、float、long、int、short、byte、boolean 和 char。基本类型变量存储了真实的值,而非指向数值的指针。 + +**线程优先级(priority of a thread):**与线程关联的整数值,可以影响线程的执行顺序。优先级高的线程比优先级低的线程提前执行。 + +**生产者/消费者(producer/consumer):**并行编程中的一种经典模式,一个或多个生产者生产的产品被一个或更多的消费者使用。生产者和消费者设计为可以并行执行。这里的难点在于,如何安全、高效地从生产者向消费者非配产品。在Java中,通过阻塞队列实现生产者/消费者模式。 + +**程序(program):**用某种合适的编程语言编写的一组指令,由计算机执行。用做动词时,表示创建该指令的动作。 + +**编程语言(programming language):**用来为计算机编程的一种语言。编程语言的复杂性,从机器语言到像Java这样的高级语言跨度很大。 + +**协议(protocol):**在指定上下文中,构成合法通信的一组规范。协议中规定了合法的消息、传送的时间、期待的恢复类型等。 + +**伪代码(pseudocode):**非正式算法规范。与实际编程语言相比,伪代码更加接近英语。并且,通常无需明确地写出过程的每个细节。 + +**队列(queue):**由一组元素构成的数据结构。只能在列表的一头添加数据,在列表的另一头移除数据。 + +**竞态条件(race condition):**并行编程中可能的错误源。由于某个线程改变了第二个程序依赖的程序状态(比如变量值),从而引发错误。 + +**RAM(Random Access Memory):**随机访问内存。计算机主内存的同义词。然而,从技术角度看,RAM是指在任意时间内都可以同样访问内存地址。RAM也意味着可以同时读写数据。 + +**递归(recursion):**用自身的形式定义自己。特别地,递归子程序可以直接或通过一系列其它子程序间接调用自己。递归算法的工作方式,通过将一个复杂问题拆分成更小的子问题。子问题要么可以直接解决,要么可以“递归”使用相同的算法。 + +**RGB:**一种颜色系统。颜色由3个数值定义(在Java中,数值的范围从0到255)。分别表示颜色中的红色、绿色和蓝色组成。 + +**引用(reference):**“指针”的另一种称呼。 + +**函数返回类型(return type of a function):**函数返回值的类型。 + +**保留字(关键字)(reserved word):**一组字符串序列,看起来和标识符很像。但是由于在编程语言中有特殊含义,所以不能用作标识符。例如 class、public 是Java中的保留字。 + +**资源(resource):**图片、声音、文字或程序中的数据文件都是资源。Java资源文件与编译好的class文件存储在相同的路径(class path)。 + +**健壮的程序(robust program):**健壮的程序不仅正确,同时也能合理地处理错误,比如文件不存在或者无法建立网络连接。 + +**集合(set):**没有重复的一组对象。在Java中,集合用泛型接口 Set 表示。 + +**作用域(scope):**表示程序中声明的标识符的有效作用域。 + +**语义(semantics):**语义是指,语言的语义规则决定了该语言中字符串符号(例如句子或语句)的含义。 + +**哨兵值(sentinel value):**表示数据序列结束的特殊标记,表明该数据已结束。 + +**setter方法:**类中的实例方法,用来设置类中的一些属性值。通常,这些属性只是实例变量值。按照惯例,setter 方法命名为 setXyz(),其中 xyz 是属性的名字。 + +**方法签名(signature of a method):**方法名、方法定义中形参的个数以及每个形参的类型。编译器通过方法签名来识别指定子程序调用语句究竟调用了哪个方法。 + +**套接字(socket):**网络上两个计算机之间的连接,对其中一端的抽象表示。套接字表示计算机程序间的一个逻辑连接,而非计算机间的物理连接。 + +**栈(stack):**一组元素组成的列表数据结构,只能在列表的尾部,也称作“栈顶”。向栈中添加元素叫“入栈 push”,移除元素称作“出栈 pop”。栈也指用来实现子程序调用的活动记录。 + +**标准输入(standard input):**程序读取输入数据的标准源,由 System.in 对象表示。通常,标准输入来自用户键入的文本,但是标准输出也可以重定向到其它源,比如文件。 + +**标准输出(standard output):**程序将输出文本写入的标准目标,由 System.out 对象表示。通常,标准输出会向用户展示,但是也可以“重定向”到其它目标,比如文件。此外,System.err 对象用来输出错误信息。 + +**状态机(state machine):**一种计算机模型。抽象的“机器”可处于有限状态集中的任何一种状态。机器会根据自身的状态决定行为,根据输入或事件进行状态切换。GUI程序的基本逻辑可表现为状态机。 + +**逐步精化法(step-wise refinement):**一种算法开发技术。开始列出算法步骤大纲,通常用伪代码表示,然后逐步填充细节。 + +**流(stream):**输入数据源或输出数据目标的抽象表示。Java为字符和二进制数据输入、输出流提供了4个基础类。这些类组成了Java I/O API的基础。 + +**源代码(source code):**用高级编程语言编写的文本。在计算机执行前,必须翻译成机器语言,比如Java字节码。 + +**子类(subclass):**一个类,直接或间接继承了其它类,从而继承了它的数据和行为。前一个类就叫做第二类的子类。 + +**子程序(subroutine):**一系列程序指令。通过子程序名可以“调用”该子程序。在面向对象编程中,子程序也称作方法。 + +**子程序调用语句(subroutine call statement):**程序中调用子程序的语句。当执行子程序调用语句时,计算机会执行子程序内部的代码。 + +**super:**一个特殊变量,在实例方法中自动定义。super指包含该方法的对象,归属于方法所在类的父类。super可以访问父类中被隐藏的成员变量,这些变量与子类中的成员变量同名。 + +**语法(syntax):**定义了该语言中哪些字符串符号符合该语言的语法规则。 + +**TCP/IP:**Internet上用来网络通讯的协议。 + +**this:**一个特殊变量,在实例方法中自动定义,归属于方法所在的类。 + +**线程(thread):**对一系列逐条执行语句的抽象表示。计算机可以并行执行多个线程。 + +**线程池(thread pool):**执行任务时可以使用的一组“工作线程”。当任务就绪时,可分配给池中的线程。线程池通常使用阻塞式队列存储任务。 + +**自顶向下设计(top-down design):**一种软件设计方法。开始把问题作为一个整体,然后拆分成更小的问题,再逐步细化,直到子问题可以直接解决。 + +**类型(type):**数值的特定类型。例如,int类型规定了整形值可以表示为32比特二进制数。在Java中,类型可以是基本类型、类名或接口名。类型名可用来定义变量的类型,子程序中的虚拟参数和子程序的返回类型。 + +**类型转换(type cast):**把一种类型的值强制转换为另一种类型。例如,在 (int)(6*Math.random()) 中,(int) 是一个类型转换操作,将 (6*Math.random()) 的浮点值转换为了整形,丢弃了实数中的小数部分。 + +**Unicode:**将字符编码成二进制数的一种方式。Unicode字符集包含了许多语言的字符,不仅限于英语。Java内部使用的就是Unicode字符集。 + +**URL:**全球资源定位器。Internet上资源的地址,比如网页。 + +**变量(variable):**一个带名字的内存位置(或一系列位置),用来存储数据。在程序中创建变量,通过变量声明语句将名字赋予该变量。根据使用情况,这个名字在程序中可以代指该内存位置,或者向内存地址中存储数据。在Java中,变量具有类型,可以表示变量持有数据的种类。 + +**包装类(wrapper class):**类似 Double、Integer这样的类,将一个基本类型的值“包装”在对象中,该对象归属于包装类。这样,在需要使用对象的地方也可以使用基本类型值,比如Java集合框架。 + +**XML(eXtensible Markup Language):**可扩展标记语言。一种非常常见且语法标准、支持良好的语言。用来创建基于文本的数据表示。 \ No newline at end of file