![](https://img-blog.csdnimg.cn/20210817141552539.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 74
Java
巨輪
How many ten years are in left time?
展开
-
Java中int[]与Integer[]相互转化的方法
传统方法//Convert int[] to Integer[]public static Integer[] toObject(int[] intArray) { Integer[] result = new Integer[intArray.length]; for (int i = 0; i < intArray.length; i++) { result[i] = Integer.valueOf(intArray[i]); } return原创 2021-04-16 00:23:56 · 2697 阅读 · 0 评论 -
Java开发常见面试题详解(并发,JVM)
预览并发问题详解请谈谈你对volatile的理解linkCAS你知道吗?link原子类Atomiclntegerl的ABA问题谈谈?原子更新引用知道吗?link我们知道ArrayList是线程不安全,请编码写一个不安全的案例并给出解决方案link公平锁/非公平锁/可重入锁/递归锁/自旋锁谈谈你的理解?请手写一个自旋锁linkCountDownLatch/CyclicBarrier/Semaphore使用过吗?link阻塞队列知道吗?l原创 2021-03-12 02:53:38 · 81564 阅读 · 37 评论 -
如何单元测试Java的private方法
问题Java类中private方法只能被其所属类的调用,其他类只能望而却步,单元测试private方法也就一筹莫展。尝试解法:在测试时,手动将private改为public,测试完后再将其改回。将测试方法写进private方法的所属类中,这样就能调用private方法了。上述解法虽然可行,但这些解法或多或少地违背单元测试应遵守AIR原则。单元测试在线上运行时,感觉像空气(AIR)那样透明,但在测试质量的保障上,却是非常关键的。好的单元测试宏观上来说,具有自动化、独立性、可重复执行的特点。原创 2020-12-19 01:50:22 · 16511 阅读 · 1 评论 -
JMH初体验
什么是JMHJMH是 Java Microbenchmark Harness 的缩写。中文意思大致是 “JAVA 微基准测试套件”。基准测试是指通过设计科学的测试方法、测试工具和测试系统,实现对一类测试对象的某项性能指标进行定量的和可对比的测试。——百度百科为什么要使用 JMH基准测试的特质有如下几种:可重复性:可进行重复性的测试,这样做有利于比较每次的测试结果,得到性能结果的长期变化趋势,为系统调优和上线前的容量规划做参考。可观测性:通过全方位的监控(包括测试开始到结束,执行机、服务器、原创 2020-10-24 14:42:12 · 303 阅读 · 0 评论 -
Java中<? super T>和List<? extends T>的区别
Java中<? super T>和List<? extends T>的区别<? extends T>下面通配符声明List<? extends Number> foo3的赋值式是合法的:List<? extends Number> foo3 = new ArrayList<Number>(); // Number "extends" Number (in this context)List<? extends Numbe原创 2020-09-25 11:47:54 · 683 阅读 · 0 评论 -
如何优雅互换Map键与值
一般方法//map must be a bijection in order for this to work properlypublic static <K,V> HashMap<V,K> reverse(Map<K,V> map) { HashMap<V,K> rev = new HashMap<V, K>(); for(Map.Entry<K,V> entry : map.entrySet())原创 2020-09-19 11:10:10 · 4179 阅读 · 0 评论 -
《Java8实战》笔记汇总
《Java8实战》笔记(01):为什么要关心Java8《Java8实战》笔记(02):通过行为参数传递代码《Java8实战》笔记(03):Lambda表达式《Java8实战》笔记(04):引入流《Java8实战》笔记(05):使用流《Java8实战》笔记(06):用流收集数据《Java8实战》笔记(07):并行数据处理与性能《Java8实战》笔记(08):重构、测试和调试《Java8实战》笔记(09):默认方法《Java8实战》笔记(10):用Optional取代null《Java8实战原创 2020-08-19 16:26:37 · 1041 阅读 · 0 评论 -
《Java8实战》笔记(16):结论以及Java的未来
结论以及Java的未来回顾Java8的语言特性行为参数化(Lambda以及方法引用)流CompletableFutureOptional默认方法Java的未来集合类型系统的改进声明位置变量更多的类型推断模式匹配更加丰富的泛型形式具化泛型泛型中特别为函数类型增加的语法灵活性原型特化和泛型对不变性的更深层支持值类型为什么编译器不能对Integer和int一视同仁值对象——无论简单类型还是对象类型都不能包打天下装箱、泛型、值类型——互相交织的问题写在最后的话Java原创 2020-08-19 12:58:54 · 207 阅读 · 0 评论 -
《Java8实战》笔记(15):面向对象和函数式编程的混合-Java 8和Scala的比较
面向对象和函数式编程的混合:Java 8和Scala的比较Scala是一种混合了面向对象和函数式编程的语言。它常常被看作Java的一种替代语言,程序员们希望在运行于JVM上的静态类型语言中使用函数式特性,同时又期望保持Java体验的一致性。和Java比较起来,Scala提供了更多的特性,包括更复杂的类型系统、类型推断、模式匹配、定义域语言的结构等。除此之外,你可以在Scala代码中直接使用任何一个Java类库。Scala简介HelloWorld命令式Scalaobject Beer { def原创 2020-08-19 12:42:40 · 405 阅读 · 0 评论 -
《Java8实战》笔记(14):函数式编程的技巧
函数式编程的技巧无处不在的函数术语“函数式编程”意指函数或者方法的行为应该像“数学函数”一样——没有任何副作用。对于使用函数式语言的程序员而言,这个术语的范畴更加宽泛,它还意味着函数可以像任何其他值一样随意使用:可以作为参数传递,可以作为返回值,还能存储在数据结构中。能够像普通变量一样使用的函数称为一等函数(first-class function)。这是Java 8补充的全新内容:通过::操作符,你可以创建一个方法引用,像使用函数值一样使用方法,也能使用Lambda表达式(比如,(int x)原创 2020-08-19 10:10:47 · 728 阅读 · 1 评论 -
《Java8实战》笔记(13):函数式的思考
函数式的思考实现和维护系统为了让程序易于使用,你还希望它具备哪些特性呢?你会希望它具有良好的结构,最好类的结构应该反映出系统的结构,这样能便于大家理解;甚至软件工程中还提供了指标,对结构的合理性进行评估,比如耦合性(软件系统中各组件之间是否相互独立)以及内聚性(系统的各相关部分之间如何协作)。对大多数程序员而言,最关心的日常要务是代码维护时的调试:代码遭遇一些无法预期的值就有可能发生崩溃。为什么会发生这种情况?它是如何进入到这种状态的?想想看你有多少代码维护的顾虑都能归咎到这一类!很原创 2020-08-19 00:05:29 · 351 阅读 · 0 评论 -
《Java8实战》笔记(12):新的日期和时间API
新的日期和时间API相信大多数有经验的程序员都会赞同Java 8之前的库对日期和时间的支持就非常不理想。值得高兴的是 Java 8中引入全新的日期和时间API就是要解决这一问题。Java 8之前的日期和时间API在Java 1.0中,对日期和时间的支持只能依赖java.util.Date类。正如类名所表达的,这个类无法表示日期,只能以毫秒的精度表示时间。更糟糕的是它的易用性,由于某些原因未知的设计决策,这个类的易用性被深深地损害了,比如:年份的起始选择是1900年,月份的起始从0开始。这意味着,如果原创 2020-08-18 14:43:08 · 397 阅读 · 0 评论 -
《Java8实战》笔记(11):CompletableFuture-组合式异步编程
CompletableFuture:组合式异步编程最近这些年,两种趋势不断地推动我们反思我们设计软件的方式。第一种趋势和应用运行的硬件平台相关,第二种趋势与应用程序的架构相关,尤其是它们之间如何交互。我们注意到随着多核处理器的出现,提升应用程序处理速度最有效的方式是编写能充分发挥多核能力的软件。你已经看到通过切分大型的任务,让每个子任务并行运行,这一目标是能够实现的;你也已经了解相对直接使用线程的方式,使用分支/合并框架(在Java 7中引入)和并行流(在Java 8中新引入)能以更简单、更有原创 2020-08-18 13:54:20 · 731 阅读 · 0 评论 -
《Java8实战》笔记(10):用Optional取代null
用Optional取代null本文的代码众所周知,对任何一位Java程序员来说,无论是初出茅庐的素人,还是久经江湖的老司机,NullPointerException都是他心中的痛,可是我们又无能为力,因为这就是我们为了使用方便甚至不可避免的像null引用这样的构造所付出的代价。这就是程序设计世界里大家都持有的观点,然而,这可能并非事实的全部真相,只是我们根深蒂固的一种偏见。1965年,英国一位名为Tony Hoare的计算机科学家在设计ALGOL W语言时提出了null引用的想法。如何为缺失的值建模原创 2020-08-18 12:04:42 · 661 阅读 · 1 评论 -
《Java8实战》笔记(09):默认方法
默认方法本文的源码实现接口的类必须为接口中定义的每个方法提供一个实现,或者从父类中继承它的实现。但是,一旦类库的设计者需要更新接口,向其中加入新的方法,这种方式就会出现问题。现实情况是,现存的实体类往往不在接口设计者的控制范围之内,这些实体类为了适配新的接口约定也需要进行修改。由于Java 8的API在现存的接口上引入了非常多的新方法,这种变化带来的问题也愈加严重,一个例子就是像Guava和Apache Commons这样的框架现在都需要修改实现了List接口的所有类,为其添加sort方法的实现。Ja原创 2020-08-17 15:41:07 · 469 阅读 · 1 评论 -
《Java8实战》笔记(08):重构、测试和调试
重构、测试和调试为改善可读性和灵活性重构代码利用Lambda表达式,你可以写出更简洁、更灵活的代码。用“更简洁”来描述Lambda表达式是因为相较于匿名类,Lambda表达式可以帮助我们用更紧凑的方式描述程序的行为。改善代码的可读性改善代码的可读性到底意味着什么?通常的理解是,“别人理解这段代码的难易程度”。改善可读性意味着你要确保你的代码能非常容易地被包括自己在内的所有人理解和维护。为了确保你的代码能被其他人理解,有几个步骤可以尝试,比如确保你的代码附有良好的文档,并严格遵守编程规范。跟之原创 2020-08-17 14:01:58 · 351 阅读 · 0 评论 -
《Java8实战》笔记(07):并行数据处理与性能
并行数据处理与性能在Java 7之前,并行处理数据集合非常麻烦。第一,你得明确地把包含数据的数据结构分成若干子部分。第二,你要给每个子部分分配一个独立的线程。第三,你需要在恰当的时候对它们进行同步来避免不希望出现的竞争条件,等待所有线程完成,最后把这些部分结果合并起来。Java 7引入了一个叫作分支/合并的框架,让这些操作更稳定、更不易出错。并行流ParallelStreams可以通过对收集源调用Stream接口parallelStream方法来把集合转换为并行流。并行流就是一个把内容分原创 2020-08-17 08:06:47 · 583 阅读 · 0 评论 -
《Java8实战》笔记(06):用流收集数据
你会发现collect是一个归约操作,就像reduce一样可以接受各种做法作为参数,将流中的元素累积成一个汇总结果。具体的做法是通过定义新的Collector接口来定义的,因此区分Collection、Collector和collect是很重要的。下面是一些查询的例子,看看你用collect和收集器能够做什么。对一个交易列表按货币分组,获得该货币的所有交易额总和(返回一个Map<Currency,Integer>)。将交易列表分成两组:贵的和不贵的(返回一个Map<Boolea原创 2020-08-14 20:21:28 · 576 阅读 · 0 评论 -
《Java8实战》笔记(05):使用流
筛选和切片Filtering用谓词Predicate筛选-filterList<Dish> vegetarianMenu = menu.stream()// .filter(Dish::isVegetarian)//Predicate<T>做参数 .collect(toList());vegetarianMenu.forEach(System.out::println);筛选各异的元素-去重-distinct// Filtering unique eleme原创 2020-08-14 10:49:48 · 615 阅读 · 0 评论 -
《Java8实战》笔记(04):引入流
几乎每个Java应用程序都会制造和处理集合。尽管集合对于几乎任何一个Java应用都是不可或缺的,但集合操作却远远算不上完美。很多业务逻辑都涉及类似于数据库的操作,比如对几道菜按照类别进行分组 (比如全素菜肴),或查找出最贵的菜。你自己用迭代器重新实现过这些操作多少遍?大部分数据库都允许你声明式地指定这些操作。比如,以下SQL查询语句就可以选出热量较低的菜肴名称:SELECT name FROM dishes WHERE calorie < 400。你看,你不需要实现如何根据菜肴的属性进行筛选(原创 2020-08-14 08:39:40 · 308 阅读 · 0 评论 -
《Java8实战》笔记(03):Lambda表达式
本文源码Lambda 管中窥豹可以把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。Lambda表达式可以让你十分简明地传递代码。Lambda组成结构参数列表——这里它采用了Comparator中compare方法的参数,两个Apple。箭头——箭头->把参数列表与Lambda主体分隔开。Lambda主体——比较两个Apple的重量。表达式就是Lambda的返回值了。Lambda的基本原创 2020-08-14 02:45:31 · 557 阅读 · 0 评论 -
《Java8实战》笔记(02):通过行为参数传递代码
本文源码应对不断变化的需求通过筛选苹果阐述通过行为参数传递代码初试牛刀:筛选绿苹果public static List<Apple> filterGreenApples(List<Apple> inventory){ List<Apple> result = new ArrayList<>(); for(Apple apple: inventory){ if("green".equals(apple.getColor())){ resul原创 2020-08-14 00:34:54 · 439 阅读 · 0 评论 -
《Java8实战》笔记(01):为什么要关心Java8
Java 8 新特性:Stream API向方法传递代码的技巧接口中的默认方法助记://Java8主要有哪些新特性?//1.Stream API 2.接口的默认实现 3.方法晋升一级公民inventory.stream().filter((Apple a) -> a.getWeight() > 150) .collect(Collectors.toList());在Java 8之前://对inventory中的苹果按照重量进行排序Collections.sort原创 2020-08-13 23:23:37 · 697 阅读 · 0 评论 -
MyBatis学习笔记
教学视频---1.简介2.下载3.HelloWorld4.接口式编程5.小结(1)6.全局配置文件-引入dtd约束7.全局配置文件-properties-引入外部配置文件8.全局配置文件-settings-运行时行为设置9.全局配置文件-typeAliases-别名10.全局配置文件-typeHandlers-类型处理器简介11.全局配置文件-plugins-插件简介12.全局配置文件-enviroments-运行环境13.全局配置文件-dat原创 2020-08-07 09:28:18 · 9002 阅读 · 7 评论 -
Shiro学习笔记
Shiro教学视频源码文章目录1. 简介功能简介Shiro 架构Shiro 架构(Shiro外部来看)Shiro 架构(Shiro内部来看)2. HelloWorldshiro.ini配置文件解析Quickstart.java解析运行结果3. 集成Spring配置web.xml配置spring-servlet.xml配置applicationContext.xml4. Shiro工作流程5. DelegatingFilterProxy6. 权限URL配置细节URL 匹配模式Shiro中默认的过滤器URL原创 2020-07-12 00:56:49 · 584 阅读 · 0 评论 -
用Java的Set实现交并差等集合运算
放码过来package com.lun.util;import java.util.HashSet;import java.util.Set;public class SetUtils { public static <T> Set<T> union(Set<T> setA, Set<T> setB) { Set<T>...原创 2020-03-08 02:55:54 · 1674 阅读 · 0 评论 -
用Tomcat构建一个简单图片服务器
前提条件Tomcat 7.0.90方法一:修改配置文件在TOMCAT_HOME/conf/server.xml配置文件内的<Host>内添加一子标签:<Context docBase="C:\exambase\" path="/img"/>方法二:添加Servlet新建一应用,然后添加如下的Servlet,然后部署应用启动Tomcat。package ...原创 2020-02-11 17:15:12 · 622 阅读 · 0 评论 -
在Windows下安装JDK的通常步骤
获取安装包 从官网或其他途径下载JDK的Windows版本的安装包,并点击安装。安装向导中无需选择配置项,默认操作即可,除了自定义的JDK安装目录。假设JDK的安装目录为C:\Program Files\Java。设置环境变量 右击桌面上的计算机,在菜单项依次单击属性->高级系统配置->高级->环境变量。新建或修改一下系统变量:JAVA_HOME = C:\Prog...原创 2020-02-05 23:49:37 · 285 阅读 · 0 评论 -
SLF4J简介与使用(整合log4j)
SLF4J简介与使用(整合log4j)一、概念SLF4J的全称是Simple Logging Facade for Java,即简单日志门面。SLF4J并不是具体的日志框架,而是作为一个简单门面服务于各类日志框架,如java.util.logging, logback和log4j。SLF4J提供了统一的记录日志的接口,对不同日志系统的具体实现进行了抽象化,只要按照其提供的方法记录即可,最终日...转载 2020-02-02 16:27:34 · 563 阅读 · 0 评论