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. Luogu P3165 [CQOI2014]排序机械臂

    先讲一下和这题一起四倍经验的题: Luogu P4402 [Cerc2007]robotic sort 机械排序 SP2059 CERC07S - Robotic Sort UVA1402 Robot ...

  2. 最新版XCoder 的使用方法

    1.项目中,新建一个类库.名字随意,我取名:XCoder 2.右键 > 管理nuget程序包:搜索 XCode 并安装 3.在项目中新建:data.project.xml 的xml文件,并写入数 ...

  3. Django Restframework 过滤器

    一.基本配置: 1.安装:pip install django-filter 2.将 django_filters 配置到INSTALLED-APPS中 3.对 REST_FRAMEWORK 配置: ...

  4. H5 标签选择器

    08-标签选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是标题 <!DOCTYPE html> <html lang="en"> <he ...

  5. UVA -580 组合数学

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

  6. Python Revisited Day 04 (控制结构与函数)

    目录 4.1 控制结构 4.1.1 条件分支 4.1.2 循环 4.2 异常处理 4.2.1 捕获与产生异常 4.2.2 自定义异常 4.3 自定义函数 Tips 参数默认值为可变时 危险 4.3.1 ...

  7. Day3 Python基础之while、for循环(二)

    1.数据运算 算数运算 整除运算:// 取余运算:% 指数运算:** 赋值运算 b+=a;等价于b=b+a 比较运算 >,<,==,!=,>=,<= 逻辑运算符 and .or ...

  8. 集大软件工程15级结对编程week1

    集大软件工程15级结对编程week1 0. 团队成员 姓名 学号 博客园首页 码云主页 孙志威 20152112307 Agt Eurekaaa 孙慧君 201521123098 野原泽君 野原泽君 ...

  9. hadoop实例-网站用户行为分析

    一.数据集 网站用户购物行为数据集2030万条,包括raw_user.csv(2000万条)和small_user.csv(30万条,适合新手) 字段说明: user_id 用户编号,item_id ...

  10. 解决linux用户切换失败 su:execute /usr/bin 没有权限

    问题描述: 回宿舍前,在root用户中安装fish,并修改其shell为fish.回宿舍之后,在图形界面用root用户进行登陆,莫名其妙登陆失败.没有任何提示信息,直接回到登陆界面.用非root用户登 ...