目录

1 相关注解

1.1 @Controller 和 @RestController

1.2 @ApiIgnore

1.3 @PostMapping

2 Java知识点

2.1 instanceof关键字

2.2 StringUtils

2.3 Hash

2.3.1 HashMap的扩容

2.3.2 HashMap并发

2.3.3 ConcurrentHashMap

3 lombok

3.1 介绍

3.2 使用方法

3.3 具体使用


今天看了下公司的一些业务代码,有如下收获。

1 相关注解

1.1 @Controller 和 @RestController

(1)如果只是使用@RestController注解Controller,则Controller中的方法无法返回jsp页面,返回的内容就是Return 里的内容。例如:本来应该到success.jsp页面的,则其显示success。

(2)如果需要返回到指定页面,则需要用 @Controller才行。

(3)如果需要返回JSON,XML或自定义mediaType内容到页面,则需要在对应的方法上加上@ResponseBody注解。

(4)在控制器类上加 @RestController 注解,相当于@Controller + @ResponseBody两个注解的结合,返回json数据不需要另外在方法前面加@ResponseBody注解了,但使用@RestController这个注解,就不能返回jsp,html页面,视图解析器无法解析jsp,html页面。

1.2 @ApiIgnore

@ApiIgnore 注解主要作用在类、方法、参数上。

当作用在方法上时,方法将被忽略;作用在类上时,整个类都会被忽略;作用在参数上时,单个具体的参数会被忽略。

忽略的意思就是 swagger-ui.html 上不会显示对应的接口信息(被Swagger框架忽略)。

1.3 @PostMapping

@PostMapping注解各参数含义:

  1. name
  2. value:请求路由地址
  3. path:指定路由地址
  4. params:指定request中必须包含某些参数值
  5. headers:指定request中必须包含某些指定的header值
  6. consumes:请求提交内容类型,MediaType方式,如 application/json、application/x-www-urlencode、multipart/form-data等
  7. produces:请求返回的数据类型,仅当request请求头中的(Accept)类型中包含该指定类型才返回,如application/json

2 Java知识点

2.1 instanceof关键字

instanceof 严格来说是Java中的一个双目运算符,用来测试一个对象是否为一个类的实例,用法为:

boolean result = obj instanceof Class

  其中 obj 为一个对象,Class 表示一个类或者一个接口,当 obj 为 Class 的对象,或者是其直接或间接子类,或者是其接口的实现类,结果result 都返回 true,否则返回false

  注意:编译器会检查 obj 是否能转换成右边的class类型,如果不能转换则直接报错,如果不能确定类型,则通过编译,具体看运行时定。

具体使用说明:Java关键字(一)——instanceof

2.2 StringUtils

StringUtils类中有对字符串的一些常用操作,如判断字符串是否为空就可以用静态方法isEmpty。

2.3 Hash

2.3.1 HashMap的扩容

HashMap 在容量超过负载因子所定义的容量之后,就会扩容。Java 里的数组是无法自动扩容的,方法是将 HashMap 的大小扩大为原来数组的两倍,并将原来的对象放入新的数组中

JDK1.8扩容做了两处优化:

1. resize 之后,元素的位置在原来的位置,或者原来的位置+oldCap (原来哈希表的长度)。不需要像 JDK1.7 的实现那样重新计算hash,只需要看看原来的 hash 值新增的那个bit是1还是0就好了,是0的话索引没变,是1的话索引变成“原索引 + oldCap”。这个设计非常的巧妙,省去了重新计算hash 值的时间。

2. JDK1.7 中 rehash 的时候,旧链表迁移新链表的时候,如果在新表的数组索引位置相同,则链表元素会倒置(头插法)。JDK1.8 不会倒置,使用尾插法。(JDK1.7扩容使用头插法,JDK1.8使用尾插法。

2.3.2 HashMap并发

HashMap不是线程安全的,有如下几点原因:

  1. 多线程下扩容死循环。JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表的问题
  2. 多线程的put可能导致元素的丢失。多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。此问题在JDK 1.7和 JDK 1.8 中都存在。
  3. put和get并发时,可能导致get为null。线程1执行put时,因为元素个数超出threshold而导致rehash,线程2此时执行get,有可能导致这个问题。此问题在JDK 1.7和 JDK 1.8 中都存在。

2.3.3 ConcurrentHashMap

2.3.3.1 JDK1.7

数据结构:ReentrantLock + Segment + HashEntry,每个Segment包含一个HashEntry数组,每个HashEntry是一个链表结构。

元素查询:两次Hash,第一次Hash定位到Segment,第二次Hash定位到元素所在链表的头部。

其中,Segment 继承了 ReentrantLock,所以 Segment 是一种可重入锁,扮演锁的角色;HashEntry用于存储键值对数据。

get方法无需加锁,有volatile保证。

2.3.3.2 JDK1.8

数据结构:Synchronized + CAS + Node + 红黑树,Node的val和next都用volatile修饰,保证了可见性。查找、替换、赋值操作都使用CAS。

在锁的实现上,抛弃了原有的 Segment 分段锁,采用 CAS + synchronized 实现更加低粒度的锁。将锁的级别控制在了更细粒度的哈希桶元素级别,也就是说只需要锁住这个链表头结点(红黑树的根节点),就不会影响其他的哈希桶元素的读写,大大提高了并发度。

扩容时阻塞所有的读写操作,并发扩容。

数组用volatile修饰,保证扩容时被线程感知。

3 lombok

3.1 介绍

Lombok能以简单的注解形式来简化java代码,提高开发人员的开发效率。例如开发中经常需要写的javabean,都需要花时间去添加相应的getter/setter,也许还要去写构造器、equals等方法,而且需要维护,当属性多时会出现大量的getter/setter方法,这些显得很冗长也没有太多技术含量,一旦修改属性,就容易出现忘记修改对应方法的失误。

Lombok能通过注解的方式,在编译时自动为属性生成构造器、getter/setter、equals、hashcode、toString方法。出现的神奇就是在源码中没有getter和setter方法,但是在编译生成的字节码文件中有getter和setter方法。这样就省去了手动重建这些代码的麻烦,使代码看起来更简洁些。

3.2 使用方法

(1)方法一

Lombok的使用跟引用jar包一样,可以在官网(https://projectlombok.org/download)下载jar包,也可以使用maven添加依赖:

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.16.20</version><scope>provided</scope>
</dependency>

(2)方法二

另一种方法是在Settings -> Plugins 中搜索安装:

3.3 具体使用

参考:https://www.cnblogs.com/heyonggang/p/8638374.html

Java学习日报—注解、Hash、Lombok—2021/12/02相关推荐

  1. Java学习日报—泳道与Feign—2021/11/30

    目录 1 泳道的概念和特性 1.1 背景 1.2 什么是泳道 1.3 泳道的特性 1.4 泳道的价值 2 feign的概念和简单使用 2.1 feign背景 2.2 feign使用说明 2.3 fei ...

  2. Java学习日报—Swagger介绍 与 布隆过滤器详解—2021/12/01

    目录 1. Swagger 1.1 介绍 1.2 Swagger 的优势 1.3 简单使用 1.3.1 集成 Swagger 管理 API 文档 1.3.2 在线测试接口 1.4 常用注解 1.5 参 ...

  3. Java学习日报 — 问题记录 — 2021/12/14

    1.出现问题:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 分析:出现没有找到mapp ...

  4. Java学习日报—Java并发—2021/11/22

    目录 1. Spring.Spring Boot.Spring Cloud区别 2. Java并发之容器 2.1 CopyOnWriteArrayList和CopyOnWriteArraySet 2. ...

  5. Java学习日报—2021/11/18

    目录 一.JDK8常用的新特性 二.Spring的IOC 三.Spring的AOP 四.MVC 五.SpringBoot和SpringCloud的关系理解 一.JDK8常用的新特性 (1)Date/T ...

  6. Java学习日报—JVM垃圾回收全解—2021/11/26

    目录 1.1 确定垃圾对象 1.1.1 引用计数法 1.1.2 可达性分析法 1.2 引用 1.2.1 宣告对象死亡 1.3 方法区回收 1.3.1 回收废弃常量 1.3.2 回收无用的类 1.4 常 ...

  7. Java学习日报—SQL基础—2021/11/29

    今天效率很低,就看了以下内容... 目录 1.1关键词DISTINCT 1.2 连表查询 1.2.1 内连接 1.2.2 外连接 1.3 查询执行顺序 1.1关键词DISTINCT DISTINCT  ...

  8. Java学习日报—消息队列—2021/11/23

    1. 消息队列 1.1 基本概念 消息队列的本质就是发送 -存储 - 消费: 生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者,仅此而已. 这是传统的队列模型 ...

  9. Java学习之注解(五)Android循序渐进实现高逼格自定义ViewBinder

    前言 Butterknife的代码到目前为止还没有仔细去看,这里也是自己在网上找的一个资料,主要是针对注解学习理解,但是发现这个学习资料估计是在Butterknife里面扣的,因为如果单单实现一个Vi ...

最新文章

  1. LINUx设置ip导致内核挂死,Linux之TCPIP内核参数优化
  2. git add -u与-A .三者的区别
  3. np.dot()函数用法(亲测矩阵算法)
  4. skysat重访周期_重访小恶梦
  5. java二级缓存技术_Java二级缓存
  6. http返回头中content-length与Transfer-Encoding: chunked的问题释疑
  7. centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
  8. 一款好用的切换目录的工具autojump
  9. 手机内存8+128与6+256价格相同,你会选哪个?
  10. ffplay for mfc 代码备忘
  11. pin码计算器网页版_PIN码计算锦集
  12. win7主题破解_VM 15.5虚拟机安装win7系统的流程
  13. 基于【国基北盛】云基础架构平台软件搭建openstack私有云平台(先电V2.4版本)
  14. 2020-1024=996(程序员节)
  15. C#通过WebBrowser对网页截图
  16. 使用Go语言开发生成阿里云ECS监控报表,定时自动发送邮件给指定人员
  17. post man以Content-type: application/octet-stream方式请求api
  18. react之通俗易懂配置less
  19. python 的 int() 函数
  20. 数据分享和开源软件有助于对抗新型冠状肺炎,开源布道师等;开源之道每周评论2020 03 16...

热门文章

  1. Centos/Linux在线环境下载安装包,到离线环境安装,并解决依赖问题
  2. python numpy 写入、读取 .npz 压缩文件
  3. java读取与写入excel(.xls .xlsx)
  4. php apache 404,如何从PHP显示默认的Apache 404
  5. java文件上传控件_java实现大文件上传控件
  6. vant 上传附件后回显_Vue + VantUI Uploader 上传组件, 实现上传功能, 但 手机实时上传照片只回显, 上传不上去 。...
  7. python发送文件_python:socket传输大文件
  8. pyplot 余弦函数_python如何画出三角函数
  9. Xavier上的第一个I2C驱动
  10. ubuntu nginx php问题研究