Java学习日报—注解、Hash、Lombok—2021/12/02
目录
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注解各参数含义:
- name
- value:请求路由地址
- path:指定路由地址
- params:指定request中必须包含某些参数值
- headers:指定request中必须包含某些指定的header值
- consumes:请求提交内容类型,MediaType方式,如 application/json、application/x-www-urlencode、multipart/form-data等
- 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不是线程安全的,有如下几点原因:
- 多线程下扩容死循环。JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表的问题
- 多线程的put可能导致元素的丢失。多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。此问题在JDK 1.7和 JDK 1.8 中都存在。
- 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相关推荐
- 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 ...
- 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 参 ...
- Java学习日报 — 问题记录 — 2021/12/14
1.出现问题:org.apache.ibatis.binding.BindingException: Invalid bound statement (not found) 分析:出现没有找到mapp ...
- Java学习日报—Java并发—2021/11/22
目录 1. Spring.Spring Boot.Spring Cloud区别 2. Java并发之容器 2.1 CopyOnWriteArrayList和CopyOnWriteArraySet 2. ...
- Java学习日报—2021/11/18
目录 一.JDK8常用的新特性 二.Spring的IOC 三.Spring的AOP 四.MVC 五.SpringBoot和SpringCloud的关系理解 一.JDK8常用的新特性 (1)Date/T ...
- 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 常 ...
- Java学习日报—SQL基础—2021/11/29
今天效率很低,就看了以下内容... 目录 1.1关键词DISTINCT 1.2 连表查询 1.2.1 内连接 1.2.2 外连接 1.3 查询执行顺序 1.1关键词DISTINCT DISTINCT ...
- Java学习日报—消息队列—2021/11/23
1. 消息队列 1.1 基本概念 消息队列的本质就是发送 -存储 - 消费: 生产者先将消息投递一个叫做「队列」的容器中,然后再从这个容器中取出消息,最后再转发给消费者,仅此而已. 这是传统的队列模型 ...
- Java学习之注解(五)Android循序渐进实现高逼格自定义ViewBinder
前言 Butterknife的代码到目前为止还没有仔细去看,这里也是自己在网上找的一个资料,主要是针对注解学习理解,但是发现这个学习资料估计是在Butterknife里面扣的,因为如果单单实现一个Vi ...
最新文章
- LINUx设置ip导致内核挂死,Linux之TCPIP内核参数优化
- git add -u与-A .三者的区别
- np.dot()函数用法(亲测矩阵算法)
- skysat重访周期_重访小恶梦
- java二级缓存技术_Java二级缓存
- http返回头中content-length与Transfer-Encoding: chunked的问题释疑
- centos 6.9 +nginx 配置GIT HTTPS服务器(证书采用自签名)
- 一款好用的切换目录的工具autojump
- 手机内存8+128与6+256价格相同,你会选哪个?
- ffplay for mfc 代码备忘
- pin码计算器网页版_PIN码计算锦集
- win7主题破解_VM 15.5虚拟机安装win7系统的流程
- 基于【国基北盛】云基础架构平台软件搭建openstack私有云平台(先电V2.4版本)
- 2020-1024=996(程序员节)
- C#通过WebBrowser对网页截图
- 使用Go语言开发生成阿里云ECS监控报表,定时自动发送邮件给指定人员
- post man以Content-type: application/octet-stream方式请求api
- react之通俗易懂配置less
- python 的 int() 函数
- 数据分享和开源软件有助于对抗新型冠状肺炎,开源布道师等;开源之道每周评论2020 03 16...
热门文章
- Centos/Linux在线环境下载安装包,到离线环境安装,并解决依赖问题
- python numpy 写入、读取 .npz 压缩文件
- java读取与写入excel(.xls .xlsx)
- php apache 404,如何从PHP显示默认的Apache 404
- java文件上传控件_java实现大文件上传控件
- vant 上传附件后回显_Vue + VantUI Uploader 上传组件, 实现上传功能, 但 手机实时上传照片只回显, 上传不上去 。...
- python发送文件_python:socket传输大文件
- pyplot 余弦函数_python如何画出三角函数
- Xavier上的第一个I2C驱动
- ubuntu nginx php问题研究