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. jsp相关基础知识

    一.JSP简介 JSP全称是Java Server Page,它和Servlet一样,也是sun公司推出的一套开发动态web资源的技术,称为JSP/Servlet规范.其本质也是一个Servlet. ...

  2. Java学习之路- SQL注入

    用户名: __________ 密码:——————— 假如没有使用预处理的Statement 对象 拼接字符串查数据库的话,易收到sql注入攻击: 例如说 : mysql 中   #代表的是单行注释 ...

  3. 分布式系统消息中间件——RabbitMQ的使用基础篇

    分布式系统消息中间件——RabbitMQ的使用基础篇

  4. 读写分离子系统 - C# SQL分发子系统 - Entity Framework支持

    A2D Framework增加了EF支持,加上原先支持ADO.NET: 支持EF方式 支持ADO.NET方式 这次来讲如何让Entity Framework变成nb的读写分离 1. 先设计EF模型, ...

  5. 03 Django REST Framework 视图和路由

    01-DRF中的request 在Django REST Framework中内置的Request类扩展了Django中的Request类,实现了很多方便的功能--如请求数据解析和认证等. 比如,区别 ...

  6. linux下的shell脚本(基本)

    shell有些命令和格式不用老是容易忘,学而时习之,不亦说乎~ 先说明以下内容来自: http://c.biancheng.net/cpp/shell/ ,C语言中文网,请大家支持原作,点击链接查看. ...

  7. 建立一个单链表,并删除链表中值为W的元素

    #include<iostream> #include<algorithm> #include<string.h> #include<stdio.h> ...

  8. [Offer收割]编程练习赛97

    链接 [https://hihocoder.com/contest/offers97/problems] 题意 题目1 : 放置矩形 时间限制:10000ms 单点时限:1000ms 内存限制:256 ...

  9. pdf转eps后存在大片空白的处理

    之前pdf转eps的方式是用acrobat直接转,发现每次转完后,图片都显示在一张A4纸上,插入到论文中时会出现大片空白:但在pdf中是没有这么多空白的,与裁剪没关系. 后来在 http://tex. ...

  10. 使用JavaScript动态刷新页面局部内容

    html页面: <%@page contentType="text/html; charset=Shift_JIS"%><html>    <head ...