# Java基础开发规范
## 阿里Java开发手册
[阿里Java开发手册](https://github.com/alibaba/p3c/blob/master/%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4Java%E5%BC%80%E5%8F%91%E6%89%8B%E5%86%8C%EF%BC%88%E6%B3%B0%E5%B1%B1%E7%89%88%EF%BC%89.pdf)
## 规范检查
> 除了使用阿里开发规约插件`aliP3c`,还推荐使用开启更严格的规范检查以保证代码质量。一种为`sonarQube`的规范检查,一种为基于`Sun`和`Google`的`checkStyle`规范检查。
* `aliP3c`开发规约:
* 在IDEA中搜索安装`Alibaba Java Coding Guidelines`插件
* `sonarQube`规范检查:
* 在IDEA中搜索安装`sonarLint`插件,左下角可指定本地修改的文件或者全项目检查以及查看不符合检查的地方
* `checkStyle`规范检查,在IDEA中搜索安装`CheckStyle-IDEA`插件
## 附
`sonarQube`规范检查规则链接:[SonarRules](https://rules.sonarsource.com/java/RSPEC-3281)
`googleCheck`规范检查规则链接:[googleCheck](http://checkstyle.sourceforge.net/google_style.html)
`alibaba p3c`代码规范:[aliP3c](https://github.com/alibaba/p3c)
## Tceon-PERFOOT 作者提出的细节补充
1. 使用为底层以数组方式实现的集合、工具类时,如果能估计待添加的内容长度,请指定初始长度,避免引起多次扩容操作,这样可以明显地提升性能。比如`ArrayList、StringBuilder、StringBuffer、HashMap、HashSet`等等
* 但是,注意像`HashMap`这种是以数组+链表/树实现的集合,不要把初始大小和你估计的大小设置得一样,因为一个table上只连接一个对象的可能性几乎为0。初始大小建议设置为2的N次幂,如估计有2000个元素,可设置成`new HashMap(128)、new HashMap(256)`
2. 当复制大量数据时,使用`System.arraycopy`命令
3. 乘法和除法使用移位操作,用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的
* 移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。例如:
~~~
a = val * 8;
b = val / 2;
// 替换为 注释略
a = val << 3;
b = val >> 1;
~~~
5. 尽量使用`HashMap、ArrayList、StringBuilder`,除非线程安全需要,否则不推荐使用`Hashtable、Vector、StringBuffer`
6. 程序运行过程中避免使用反射
* 不建议在程序运行过程中使用尤其是频繁使用反射机制,特别是Method的`invoke`方法,如果确实有必要,一种建议的做法是将那些需要通过反射加载的类在项目启动的时候通过反射实例化出一个对象并放入内存—用户只关心和对端交互的时候获取最快的响应速度,并不关心对端的项目启动花多久时间。
7. 使用带缓冲的输入输出流进行IO操作
* 带缓冲的输入输出流,即`BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream`,这可以极大地提升IO效率。
8. 公用集合类中不使用的数据一定要及时清除掉
* 如果一个集合类是公用的(非方法里面的属性),那么这个集合里面的元素是不会自动释放的,因为始终有引用指向它们。所以如果公用集合里面的某些数据不使用而不去remove掉它们,那么将会造成这个公用集合不断增大,使得系统有内存泄露的隐患
9. 把一个基本数据类型转为字符串,基本数据类型`.toString()`是最快的方式、`String.valueOf()`次之、`数据+""`最慢
10. 使用最有效率的方式去遍历Map
* 遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是使用`Iterator`
~~~
Iterator it = map.entrySet().iterator();
while (it.hasNext()){
Map.Entry entry = (Map.Entry) it.next();
// 获得key与value
Object k = entry.getKey();
Object v = entry.getValue();
}
~~~
- 前言版本&说明
- 概念
- Tceon-PERFOOT 是什么?
- 系统架构
- 主要使用的开源组件
- 角色控制访问权限(RBAC)
- 用户手册
- 系统配置
- 工作流使用配置
- 定时任务调度
- 项目本地运行
- 后端运行
- 前端运行
- 项目结构说明
- 附:使用Oracle等数据库
- 模块化版本
- 后端开发指南
- 基本开发指南
- 前后端数据交互标准
- 工具类及数据权限
- 代码生成器
- 增删改查CRUD
- 日志类型注解扩展
- 逻辑删除
- 各验证码使用及配置
- 前端开发指南
- 基本开发指南
- 主题/Logo/首页等配置
- 路由菜单配置
- 多语言国际化配置
- 自定义图标icon
- 工具类及数据获取
- 完整版开发指南
- 前端Vue代码生成器
- Activiti工作流
- 单点登录配置
- MinIO对象存储服务搭建
- 第三方社交账号配置
- 短信开发/站内消息/邮件
- Vaptcha验证码
- 禁用词使用
- Monaco代码编辑器
- 开放平台及单点登录
- 开放平台使用指南
- Web接入开发流程
- 单点登录开发指南
- 微信小程序端开发指南
- 项目导入与开发必读
- 通用方法工具类说明
- Uniapp端开发指南
- APP后端开发指南
- Uniapp前端开发指南
- 开发新功能示例
- 后端开发新模块
- 前端开发新页面
- 测试
- SonarQube代码质量管理
- TestNG单元测试
- ExtentReports测试报告
- Selenuim自动化Web测试
- Appuim自动化App测试
- JMeter压测性能测试
- 部署
- Spring Boot配置
- 快速部署
- 后端部署
- 前端部署
- 前端部署优化
- Docker容器化部署
- 服务器配置
- DevOps环境搭建
- 组件安装列表
- 开发设计规范
- 分支管理
- 数据库设计规范
- Redis使用规范
- Java基础开发规范
- Rest API规范
- 项目结构规范
- 前端开发规范
- 前端设计规范
- 项目搭建分享
- 后端相关
- SpringBoot 2.x区别总结
- Spring Security整合JWT
- Spring Security动态权限管理
- Spring Boot 2.x整合Quartz
- Spring Boot 2.x整合Websocket
- Spring Boot 2.x整合Activiti工作流以及模型设计器
- Spring Boot + Security全局跨域配置
- 前端相关
- axios请求封装 统一异常处理
- 动态路由菜单加载
- 多维度控制权限至按钮显示
- 发送消息图标红点实时显示
- 动态组件单页操作
- 常见问题