JDK

告别 NPE,Optional 全网最全实战理解

孤者浪人 提交于 2020-10-27 08:31:40
1. 前言 相信不少小伙伴已经被java的NPE(Null Pointer Exception)所谓的空指针异常搞的头昏脑涨, 有大佬说过“防止 NPE,是程序员的基本修养。”但是修养归修养,也是我们程序员最头疼的问题之一。之前,Google Guava项目曾提出用Optional类来包装对象从而解决NullPointerException。受此影响,JDK8的类中也引入了Optional类,在新版的SpringData Jpa和Spring Redis Data中都已实现了对该方法的支持。我们今天就要尽可能的利用Java8的新特性 Optional来尽量简化代码同时高效处理NPE(Null Pointer Exception 空指针异常) 2. 初识Optional 首先我们看下面一段代码,肯定会很熟悉 public static String getFirstName(User user) { if(null == user) { return "Unkown"; } return student.getFirstName(); } 从上面看出,就是对这个实例是不是空做了判断,然后我们看下使用java8 的Optional类之后的代码 public static String getFirstName(User user) { return Optional

深入理解Java编程性能调优——深入浅出HashMap的设计与优化

Deadly 提交于 2020-10-27 08:24:19
HashMap 作为我们日常使用最频繁的容器之一,相信你一定不陌生了。今天我们就从HashMap 的底层实现讲起,深度了解下它的设计与优化。 常用的数据结构 我在 05 讲分享 List 集合类的时候,讲过 ArrayList 是基于数组的数据结构实现的,LinkedList 是基于链表的数据结构实现的,而我今天要讲的 HashMap 是基于哈希表的数据结构实现的。我们不妨一起来温习下常用的数据结构,这样也有助于你更好地理解后面地内容。 数组 :采用一段连续的存储单元来存储数据。对于指定下标的查找,时间复杂度为 O(1),但在数组中间以及头部插入数据时,需要复制移动后面的元素。 链表 :一种在物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(链表中每一个元素)组成,结点可以在运行时动态生成。每个结点都包含“存储数据单元的数据域”和“存储下一个结点地址的指针域”这两个部分。 由于链表不用必须按顺序存储,所以链表在插入的时候可以达到 O(1) 的复杂度,但查找一个结点或者访问特定编号的结点需要 O(n) 的时间。 哈希表 :根据关键码值(Key value)直接进行访问的数据结构。通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做哈希函数,存放记录的数组就叫做哈希表。 树 :由 n(n≥1

IntegerCache的妙用和陷阱!

给你一囗甜甜゛ 提交于 2020-10-27 05:38:39
考虑下面的小程序,你认为会输出为什么结果? public class Test { public static void main(String\[\] args) { Integer n1 = 123; Integer n2 = 123; Integer n3 = 128; Integer n4 = 128; System.out.println(n1 == n2); System.out.println(n3 == n4); } } 答案如下: true false 是否和你预想的一致? 我们知道==比较的是对象的引用,那这里为什么会这出这种情况呢? 原理 首先这是JDK在1.5版本中添加的一项新特性,把-128~127的数字缓存起来了,用于提升性能和节省内存。所以这个范围内的自动装箱(相当于调用valueOf(int i)方法)的数字都会从缓存中获取,返回同一个数字,所以现在你理解为什么了吧。同时这也会给我们开发带来预想不到的陷阱,直得注意!! 而我们通过new Integer(1)这样就不会从缓存中获取,大家可以自行测试。 我们来翻看下jdk中Integer的源码 上面是IntegerCache的源码,把从-128~high放在缓存中 上面是valueOf的源码,先从缓存中获取,获取不到再new一个返回 从源码里面我们可以看到最小边界是-128,最大边界可以通过-XX

IntelliJ IDEA 如何引入本地 jar 包

拟墨画扇 提交于 2020-10-27 03:28:46
通过添加Libraries的方式引入: 1、首先在根目录下创建一个 libs 的目录 2、打开 File -> Project Structure 3、单击 Libraries -> "+" -> "Java" -> 选择我们导入的项目主目录,点击OK 4、注意:在弹出的方框中点击“Cancel”,取消将其添加到Module中。 5、libs目录创建成功,删除目录中添加进来的多余内容,重新添加需要的jar包 6、重新添加需要的jar包 7、引入jar包:Modules -> 项目 -> “Dependencies”,点击“+” -> “Library”,将刚才创建成功的Library目录加入 8、jar包导入成功! 9、如果要将引入的jar包打包到war中,需要在pom文件中添加以下配置+ <!-- 引用本地jar包 --> <dependency> <groupId>com.aspose</groupId> <artifactId>aspose-words</artifactId> <version>16.8.0</version> <scope>system</scope> <systemPath>${pom.basedir}/libs/aspose-words-16.8.0-jdk16.jar</systemPath> </dependency> <dependency>

2020秋招面试必刷mybatis核心知识点(含答案)

最后都变了- 提交于 2020-10-27 00:39:00
嘿,每日干货分享来袭,持续更新内容涵盖: Java、MyBatis、ZooKeeper、Dubbo、Elasticsearch、Memcached、Redis、MySQL、 Spring、Spring Boot、Spring Cloud、RabbitMQ、Kafka、 Linux 等技术栈. MyBatis 面试题: 1、什么是 Mybatis? Mybatis 是一个半 ORM(对象关系映射)框架,它内部封装了 JDBC,开发时 只需要关注 SQL 语句本身,不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。程序员直接编写原生态 sql,可以严格控制 sql 执行性 能,灵活度高。 2、MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数 据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。 3、通过 xml 文件或注解的方式将要执行的各种 statement 配置起来 ,并通过 java 对象和 statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最 后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。(从执行 sql 到返 回 result 的过程). 2、Mybaits 的优点: 1、基于 SQL 语句编程,相当灵活

求收留,拒绝京东Offer之后的惨痛教训!

空扰寡人 提交于 2020-10-26 22:32:52
前言 前两个月小编好友拿下了 京东和华为的Offer ,当时一起聊了一下,犹豫再三好友选择去了华为,这一去, 连消息都没了 。 这两天好友又突然联系我了,向我各种诉苦,自从进了华为, 就没啥时间休息了,工作真特么辛苦! 身体上、心理上, 都是一种煎熬. 又遇上贸易战, 部门预算缩减, 裁员风声四起。 好友也是越说越上头,后悔当初没去京东。小编也是深表同情! 在这也将好友当初面试经历分享给大家吧! 京东一面(凉经) final finally finalize原理及使用场景 HashMap形成环的原因(需要从jdk7和jdk8角度答)? 多线程情况下,取HashMap中的某个键对应的值(比如{"1","2"}),多个线程可put() get(),请问什么时候get(1)为null? Hashmap如何保证key不重复 set如何保证不重复 concurrenthashmap原理 说说cas算法 Java中都有什么锁 synchronized实现原理、范围、如何用? spring事务传播 hibernate主键生成策略 mybatis 传参 Redis理解,常见数据结构 Redis平时是否有用,如何去使用? 用户登录信息的url 时间戳等信息存入一个Rrdis中,用户每点击一次页面就存放一次,请问如何利用Redis统计某个用户某段时间内点击了多少次?具体如何去实现? Redis使用场景

Java大文件分片上传/多线程上传解决方案

女生的网名这么多〃 提交于 2020-10-26 20:11:06
核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。 * 如何分片; * 如何合成一个文件; * 中断了从哪个分片开始。 如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块的轮子,虽然程序员的天性曾迫使我重新造轮子。但是因为时间的关系还有工作的关系,我只能罢休了。最后我选择了百度的WebUploader来实现前端所需。 如何合,在合之前,我们还得先解决一个问题,我们如何区分分块所属那个文件的。刚开始的时候,我是采用了前端生成了唯一uuid来做文件的标志,在每个分片请求上带上。不过后来在做秒传的时候我放弃了,采用了Md5来维护分块和文件关系。 在服务端合并文件,和记录分块的问题,在这方面其实行业已经给了很好的解决方案了。参考迅雷,你会发现,每次下载中的时候,都会有两个文件,一个文件主体,另外一个就是文件临时文件,临时文件存储着每个分块对应字节位的状态。 这些都是需要前后端密切联系才能做好,前端需要根据固定大小对文件进行分片,并且请求中要带上分片序号和大小。前端发送请求顺利到达后台后,服务器只需要按照请求数据中给的分片序号和每片分块大小(分片大小是固定且一样的)算出开始位置,与读取到的文件片段数据,写入文件即可。 为了便于开发,我 将服务端的业务逻辑进行了如下划分,分成初始化

Tomcat:第四章:Tomcat IO模型

跟風遠走 提交于 2020-10-26 12:54:22
知识点: Tomcat支持的IO模型说明 BIO 与NIO的区别 1、Tomcat支持的IO模型说明 描述 BIO 阻塞式IO,即Tomcat使用传统的java.io进行操作。该模式下每个请求都会创建一个线程,对性能开销大,不适合高并发场景。优点是稳定,适合连接数目小且固定架构。 NIO 非阻塞式IO,jdk1.4 之后实现的新IO。该模式基于多路复用选择器监测连接状态在通知线程处理,从而达到非阻塞的目的。比传统BIO能更好的支持并发性能。Tomcat 8.0之后默认采用该模式 APR 全称是 Apache Portable Runtime/Apache可移植运行库),是Apache HTTP服务器的支持库。可以简单地理解为,Tomcat将以JNI的形式调用Apache HTTP服务器的核心动态链接库来处理文件读取或网络传输操作。使用需要编译安装APR 库 AIO 异步非阻塞式IO,jdk1.7后之支持 。与nio不同在于不需要多路复用选择器,而是请求处理线程执行完程进行回调调知,已继续执行后续操作。Tomcat 8之后支持。 使用指定IO模型的配置方式: 配置 server.xml 文件当中的 <Connector protocol="HTTP/1.1"> 修改即可。 默认配置 8.0 protocol=“HTTP/1.1” 8.0 之前是 BIO 8.0 来源: oschina

java,从入土到出棺——3.逻辑结构与程序控制

梦想与她 提交于 2020-10-26 12:54:02
java,从入土到出棺——3.逻辑结构与程序控制 1 逻辑结构 1.1 概述 1.2 业务逻辑结构的“五常” 1.2.1 控制——调度者 1.2.2 处理——业务处理 1.2.3 储存——数据的时效储存 1.2.4 输入——数据的获取 1.2.5 输出——数据的处理反馈 2 程序控制结构 2.1 顺序结构 2.2 选择结构 2.2.1 逻辑判断 2.2.2 if语句 2.2.3 switch语句 2.2.4 switch与if的选择 2.3 循环结构 2.3.1 for 2.3.2 while 2.3.3 do-while 2.3.4 三种循环的区别与选择 写在前面:   其实这个系列的文章更加偏向于总结向,是对以往一些知识做个系统的总结,也是为已经有一定基础的人铺路,提供一个系统的思考。   对新人可能是很不友好的,可能有些人是刚接触,上来就是组合代理的,建议新人上网先做个学习,再把我这个对比记忆,说不定还能发现我的错误呢,说不准哦,三人行,必有我师;如果想和我讨论的,可以直接留言,也可以和我私信,我会很乐意和大家来讨论的。   同时也请大佬们不吝赐教! 1 逻辑结构 1.1 概述   逻辑结构分为业务逻辑结构(又称系统逻辑结构)和数据逻辑结构:   业务逻辑结构是对整个整个业务进行细分,把一整套的产品分成若干个业务逻辑单元,分别实现自己的功能。一般在系统开发时

java byte[]和base64互相转换

廉价感情. 提交于 2020-10-26 11:32:52
1.方式一 1 2 3 4 5 6 import java.io.UnsupportedEncodingException; import java.util.Base64; // byte[]转base64 String base64Str = Base64.getEncoder().encodeToString(byteArray); // base64转byte[] byte [] byteArray = Base64.getDecoder().decode(base64Str); 说明:使用jdk自带的Base64.java类实现,但是jdk版本必须>=1.8。      2.方式二 1 2 3 4 5 6 import java.io.UnsupportedEncodingException; import javax.xml.bind.DatatypeConverter; // byte[]转base64 String base64Str = DatatypeConverter.printBase64Binary(byteArray); // base64转byte[] byte [] byteArray = DatatypeConverter.parseBase64Binary(base64Str); 说明:使用jdk自带的DatatypeConverter