1.影响Servlet生命周期的注解:@PostConstruct和@PreDestroy

    @PostConstruct:被修饰的方法会在服务器加载Servlet的时候运行,并且只会被服务器调用一次,类似于Servlet的init()方法.注:方法会在构造函数之后,init()方法之前运行.

    @PreDestroy:被修饰的方法会在服务器卸载Servlet的时候运行,并且只会被服务器调用一次,类似与Servlet的destroy()方法.注:方法会在destroy()方法之后,彻底卸载前运行.

2.JVM垃圾回收小结

Java虚拟机将堆分为新生代和老年代,并且对不同代采用不同的垃圾回收算法。其中,新生代分为Eden区和两个大小一致的Survivor区,并且其中一个Survivor区是空的(默认情况下,JVM采用一种动态分配的策略,对应VM参数为-XX:+UserPSAdaptiveSurvivorSizePolicy,根据生成对象的速率,以及Survivor区的使用情况动态调整Eden区和Survivor区的比例)。

在只针对新生代的MinorGC中,Eden区和非空Survivor区的存活对象会被复制到空的Survivor区中,当Survivor区中的存活对象复制次数超过一定数量时(对应VM参数:-XX:+MaxTenuringThreshold),那么该对象将被晋升至老年代;另外,如果单个Survivor区已经被占用了50%(对应虚拟机参数 -XX:TargetSurvivorRatio),那么较高复制次数的对象也会被晋升(promote)至老年代。

因为Minor GC只针对新生代进行垃圾回收,所以在枚举GC Roots的时候,它需要考虑从老年代到新生代的引用。为了避免扫描整个老年代,Java虚拟机引入了名为卡表(Card Table)的技术,大致的标出可能存在老年代到新生代引用的内存区域。

3.File转MultipartFile

有时候做接口测试,处理前端上传的文件,这时可采用此方法,将本地文件转为上传文件类型 MultipartFile ,代码如下:

import java.io.File;
import java.io.FileInputStream;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.mock.web.MockMultipartFile; File pdfFile = new File("/home/nya/data/images/10000.jpg");
FileInputStream fileInputStream = new FileInputStream(pdfFile);
MultipartFile multipartFile = new MockMultipartFile(pdfFile.getName(), pdfFile.getName(),
                               "", fileInputStream);

4.@Deprecated @SuppressWarning @Override

Java注解annotation,作为被javac识别的一种标识,此处简述三种常见注解的意义表述

@Deprecated 过时的

@SuppressWarning 抑制警告

@Override 覆盖

@Deprecated   过时API注解   我们在用到JDK提供的API的时候,在编译中遇到 这样的提示 提示用到过时的API ,那么这个API 就被这个 @Deprecated注解所 标识,在javac进行编译的时候  发现了注解便做出相应的提示 。

@SuppressWarning("deprecation")  从字面意思上就是抑制 过时API的警告 ,这个可以放在调用过时的API的方法外部或者调用方法之前,那么在编译的时候 javac遇到这个标识 即使知道API过时那么也不会输出过时API的提示

@Override 这个是覆盖注解 ,也就是在继承中进行覆盖 父类的某个方法的时候可以加上这个注解 ,加上这个注解之后 如果我们的覆盖方法 出错了 Eclipse会提示我们错误

源码示例:

参见netty源码 : io.netty.channel.ChannelInboundHandler
/**
* Gets called if a {@link Throwable} was thrown.
*/
@Override
@SuppressWarnings("deprecation")
void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception; 

999.代码可读性规范与优化

1、Integer的equals方法

实际开发中,基本类型的包装类使用的更多,相关的操作方法也是量级递增,这时在方法选择上 包装类 --> commons.util --> 工具类 的优先级选择顺序。

此处以两个int类型的比较为例

    int a = 1;
int b = 1;
if ( a == b ) ...
if ( a != b ) ...
Integer a = 2;
Integer b = 2;
if ( a.equals(b)) ...
if ( !a.equals(b)) ...

2、stream的map使用

Java8引入的数据流Stream API,是Java在代码可读性上的一大突破。使得传统的数据流操作更加fluent。这里用作类型转换map方法愈加使得Stream调度富有变化,搭配lambda表达式更多了一种别样的美感。

而在实际使用中, -> 也推荐由 :: 替代使用,示例如下:

    // 基本类型转字符串
list.stream().map(item -> item.toString()).collect(Collectors.toList()); // 不推荐
list.stream().map(Object::toString).collect(Collectors.toList());
// 本地工具类方法的调度,以数据类型转md5为例
list.stream().map(item -> Md5Utils.md5(item)).collect(Collectors.toList()); // 不推荐
list.stream().map(Md5Utils::md5).collect(Collectors.toList());

注意:上例更多的适用于实体类中getXXX()的使用。***

Stream API的确给代码的编写赋予了许多便利,但一些基本的用法也是经典,一味的为了生套反而丧失了代码本身的可读性。以集合类型转换为例。

    // 以多线程处理常用的线程安全且多线程执行的高效队列ConcurrentLinkedDeque为例
ConcurrentLinkedDeque queue = new ...;
List<String> list = queue.stream().collect(Collectors.toList()); // 尽量避免
List<String> list = new ArrayList<>(queue);

由上可知,代码编写精炼反而赋予了更高的可读性,尽量避免脱裤子放屁,如下:

    // 循环中操作参数Map,为避免迭代中参数的变更,需在循环体中重新构建映射,此时只需作为带参构造获取新的Map即可
Map<Integer,Double> nowMap = new HashMap<>();
nowMap.putAll(paramMap); // 避免
Map<Integer,Double> nowMap = new HashMap<>(paramMap);

JavaEE进阶集锦(持续更新中)的更多相关文章

  1. Linux 集锦(持续更新中)

    // 获取文件夹下的代码总行数 find . -name "*.*" | xargs wc -l // ls 排序 ls -lt 按照最后修改时间降序 ls -lrt 按照时间升序 ...

  2. java视频教程 Java自学视频整理(持续更新中...)

    视频教程,马士兵java视频教程,java视频 1.Java基础视频 <张孝祥JAVA视频教程>完整版[RMVB](东西网) 历经5年锤炼(史上最适合初学者入门的Java基础视频)(传智播 ...

  3. Ext JS学习第十六天 事件机制event(一) DotNet进阶系列(持续更新) 第一节:.Net版基于WebSocket的聊天室样例 第十五节:深入理解async和await的作用及各种适用场景和用法 第十五节:深入理解async和await的作用及各种适用场景和用法 前端自动化准备和详细配置(NVM、NPM/CNPM、NodeJs、NRM、WebPack、Gulp/Grunt、G

    code&monkey   Ext JS学习第十六天 事件机制event(一) 此文用来记录学习笔记: 休息了好几天,从今天开始继续保持更新,鞭策自己学习 今天我们来说一说什么是事件,对于事件 ...

  4. 史上最全的spark面试题——持续更新中

    史上最全的spark面试题——持续更新中 2018年09月09日 16:34:10 为了九亿少女的期待 阅读数 13696更多 分类专栏: Spark 面试题   版权声明:本文为博主原创文章,遵循C ...

  5. git常用命令(持续更新中)

    git常用命令(持续更新中) 本地仓库操作git int                                 初始化本地仓库git add .                       ...

  6. Atom使用记录(持续更新中)

    部分内容取自:http://www.jianshu.com/p/dd97cbb3c22d,我自己也在使用,持续更新中 Atom安装插件在窗口中File---Setting---install 在里面进 ...

  7. Pig基础学习【持续更新中】

    *本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.* Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的,可以作为MapR ...

  8. Pig语言基础-【持续更新中】

      ***本文参考了Pig官方文档以及已有的一些博客,并加上了自己的一些知识性的理解.目前正在持续更新中.***   Pig作为一种处理大规模数据的高级查询语言,底层是转换成MapReduce实现的, ...

  9. 系列文章:老项目的#iPhone6与iPhone6Plus适配#(持续更新中,更新日期2014年10月12日 星期日 )

    本文永久地址为http://www.cnblogs.com/ChenYilong/p/4020399.html ,转载请注明出处. ********************************** ...

随机推荐

  1. javaweb 项目启动问题:Application Server was not connected before run configuration stop, reason: javax.manage

    参考:https://blog.csdn.net/whm18322394724/article/details/80290187 换成本机的jre就行了(路径要正确,特别是项目迁移的时候有时候用环境变 ...

  2. Java多线程编程核心技术(二)对象及变量的并发访问

    本文主要介绍Java多线程中的同步,也就是如何在Java语言中写出线程安全的程序,如何在Java语言中解决非线程安全的相关问题.阅读本文应该着重掌握如下技术点: synchronized对象监视器为O ...

  3. SpringBoot整合篇

    目录 SpringBoot整合篇 SpringBoot简介 SpringBoot运行 SpringBoot目录结构 整合JdbcTemplate @RestController 整合JSP 整合JPA ...

  4. iOS开发简记(7):网络请求模块

    主流的APP都少不了跟服务器交互,网络请求是少不了的事情. 开源的网络请求库,有很多,比如:AFNetworking.YTKNetwork.PPNetworkHelper.ASIHttpRequest ...

  5. 基于node.js的博客搭建

    一个博客应当具备哪些功能? 前台展示 点击下一页,可以点击分类导航. 可以点击进入到具体博文页面 下方允许评论.显示发表时间.允许留言分页. 右侧有登录注册界面. 后台管理 管理员账号:登陆后看到页面 ...

  6. Oja’s rule

    目录 Oja's rule 背景 Hebbian learning 主要的一些理论 论文里面一些主要的假设 引理1 引理2 引理3 定理1 LEMMA 3(ALL) 引理 4 定理 2 定理 3(关于 ...

  7. BOM、DOM

    window对象 所有浏览器都支持window对象,他表示浏览器窗口. 全局变量是window对象的属性.全局函数是window对象的方法. window的常用方法: window.innerHeig ...

  8. [2017BUAA软工助教]个人项目准备工作

    BUAA软工个人项目准备工作 零.注册Github个人账号(你不会没有吧..) 这是Git的使用教程: http://www.cnblogs.com/schaepher/p/5561193.html ...

  9. Linux watchdog

    使用 watchdog 构建高可用性的 Linux 系统及应用https://www.ibm.com/developerworks/cn/linux/l-cn-watchdog/index.html ...

  10. Es6数值拓展

    Es6数值拓展 一,Number扩展 1,ES6 提供了二进制和八进制数值的新的写法,分别用前缀0b(或0B)和0o(或0O)表示. 将0b和0o前缀的字符串数值转为十进制,要使用Number方法 N ...