![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java
文章平均质量分 67
柒间
这个作者很懒,什么都没留下…
展开
-
提高单元测试的意义&如何用Mockito做好单元测试
定义:单元测试是开发者编写的一小段代码,用于检验代码的一个很小的,很明确的功能是否正确。通常而言,一个单元测试是用于判断某个特定条件下特定函数的行为(《单元测试之道 Java版》)。换句话说,指对软件中的最小可测试单元进行检查和验证,针对的是类和方法。我们是否需要从头开始一行行代码写?不用的,有些插件可以帮忙生成部分代码生成代码的插件idea自带的生成功能TestMe插件,这款插件只会给你生成一个壳,真正逻辑需要自己编写。squaretest插件,这里就不展开讲了。原创 2023-04-08 00:03:16 · 1587 阅读 · 0 评论 -
fastJson序列化与反序列化
Java泛型是jdk1.5引入的一个新特性。泛型的本质是参数化类型,也就是说操作的数据类型被指定为一个参数。原创 2022-10-05 21:40:48 · 2365 阅读 · 0 评论 -
linux下查看日志命令
Grep:查找文件中指定文本的命令语法:grep “测试” test.log解释:查找test.log所有包含"测试"字符串的行该命令常用参数:-a/-text: 不忽略二进制数据-A:显示匹配的行以及该行后n行-B:显示匹配的行以及该行前n行-C:显示匹配的行以及该行前后n行-c: 显示匹配的行数总和(注意是行数,如果一行匹配到两个也算一行)-H: 显示匹配的行说属文件名-i: 不区分大小写-n: 显示匹配的行并行显示当前行数原创 2021-12-10 15:38:27 · 826 阅读 · 0 评论 -
对象的共享
Java并发编程实战学习笔记。要编写正确的并发程序,关键问题在于:在访问共享的可变状态时需要进行正确的管理。可见性可见性是一种复杂的属性,可见性的错误总会违背我们的直觉。当写操作和读操作在不同的线程中执行的时候,我们无法确保执行读操作的线程能适时的看到其他线程写入的值,有时甚至是更本是不可能的事情。为了确保多个线程之间对内存写入操作的可见性,必须是有同步机制。 程序Novisibility说明了当前线程在没有同步的情况下共享数据时出现的错误。在代码中,主线程和读线程都访问共享ready和numbe原创 2021-11-25 23:16:54 · 429 阅读 · 1 评论 -
为什么HashMap的数组长度是2的幂
为什么HashMap的长度一定是2的次幂呢? 今天和朋友聊天被问到HashMap的数组长度为什么是2的倍数。说实话挺惭愧的,秋招结束了,还不能完整的给出一个完整的答案。我知道了HashMap的数据结构,也知道了什么是Hash冲突,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的eq原创 2021-11-25 08:52:45 · 2288 阅读 · 0 评论 -
JDK1.7与JDK1.8中HashMap的扩容
基础知识注意Java中散列表用链表数组实现,每个链表被称为桶,想要查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余数,所得到的结果就是保存这个元素桶的索引。hash:翻译为”散列表“,就是把任意长度的输入,通过散列算法,变成固定长度输出,该输出结果是散列值。这种转换是一种压缩映射,散列表的空间通常小于输入的空间,不同的输入可能会散列成相同的输出,所以不能从散列表来唯一的确定输入值。hash冲突:就是根据key即经过一个函数f(key)得到的结果的作为地址去存放当前的key value原创 2021-10-31 17:31:09 · 1913 阅读 · 0 评论 -
servlet注解 @WebListener
Servlet3.0中的监听器相比于2.5的差别在于3.0增加了对注解的支持。作用在JavaWeb中Listener是Servlet规范定义的一种特殊类,主要用于监听3个作用域的创建、销毁,以及其属性变更Servlet中的三个作用域分别为:HttpServletRequest,HttpSession,ServletContext。注意pageContext表示jsp整个页面,不属于Servlet中的作用域应用场景:统计在线人数页面访问量应用启动时做一些初始化工作等等监听器类应该实现下面接原创 2021-08-31 01:05:18 · 507 阅读 · 0 评论 -
Java八大内部排序算法
排序算法的分类时间复杂度以及空间复杂度注:为了进行一定的比较,此处不按照上面的顺序。直接插入排序基本思想在要排序的一组数中,假定前n-1个数已经排好序,现在将第n个数插到前面的有序数列中,使得这n个数也是排好顺序的。如此反复循环,直到全部排好顺序。场景:正如当我们打牌的时候,需要对扑克牌排序。抽到牌后(假设每次只抽一张),依次从排好序的排中与手中的牌进行比较,插入到合适的位置。/** * 插入排序 * @param a */public static void sort(in原创 2021-08-26 16:00:48 · 650 阅读 · 0 评论 -
CGLib代理
CGLib代理代理为控制要访问的目标对象提供了一种途径。当访问对象时,它引入了一个间接的层。JDK自从1.3版本开始,就引入了动态代理,并且经常被用来动态地创建代理。JDK的动态代理用起来非常简单,当它有一个限制,就是使用动态代理的对象必须实现一个或多个接口。如果想代理没有实现接口的继承的类,我们可以使用CGLib动态代理。动态代理的选用:目标对象要求实现接口,使用jdk动态代理。目标对象不需要实现接口,用CGLib代理。CGLlb整体架构图我们发现,cglib在字节码层面的操作技术主原创 2021-08-21 23:56:40 · 195 阅读 · 0 评论 -
复制数组的几种方式
遍历复制 通过遍历数组,遍历的过程中把原数组中的数据复制到新的数组中System.arraycopy源码: * @param src the source array. //原数组 * @param srcPos starting position in the source array. //在原数组中开始复制的位置 * @param dest the destination array. //目标数组 * @param de原创 2021-08-10 19:21:49 · 1355 阅读 · 0 评论 -
i++与++i分析 (操作数栈)
什么是操作栈? 操作数栈也被称为操作栈,它是一个后入先出栈。操作数栈中的每一个元素都是包括long和double在内的任意java类型。32位数据类型所栈的栈容量为1,64位数据类型所占的栈容量为2.当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的做算术运算的时候是通过将运算涉及的操作数栈压入顶后调用运算指令来进行的,在调用其他的方法的时候是通过操作数栈来进行方法参数来进行值传递的。自增自减对JVM来说是怎样操作的在学习中我们一直被告诫,在Java中任何赋值操作都不是原子操作!并且自原创 2021-08-07 21:29:50 · 508 阅读 · 0 评论 -
双重检查锁单例与内存屏障分析
单例(双重检查锁)public class DoubleCheckLockSingleton { private static DoubleCheckLockSingleton instance = null; private DoubleCheckLockSingleton(){ } public static DoubleCheckLockSingleton getInstance() { if (instance == null){原创 2021-08-06 14:38:36 · 243 阅读 · 0 评论 -
volatile关键字再理解
线程、主内存、工作内存文章的之前我们先连接一点JVM的知识。以便后期的理解Java内存模型规定了所有的变量都存储在主内存(Main Memory)中(此处的主内存与介绍物理硬件时提到的主内存名字一样,两者也可以类比,但物理上它仅是虚拟机内存的一部分)。每条线程还有自己的工作内存(Working Memory),可与处理器高速缓存类比,线程的工作内存中保存了被该线程使用的变量的主内存副本,线程对变量的所有操作(读取、赋值等)都必须在工作内存中进行,而不能直接读写主内存中的数据。不同的线程之间也无法直接访原创 2021-08-05 23:52:15 · 98 阅读 · 0 评论 -
windows下将jdk1.8切换成jdk1.6
1,首先先将环境变量里的变量值JAVA_HOME,JRE_HOME都改成是1.6的。Win+R cmd 输入java -version发现版本依然是1.82,打开控制面板–>程序–>Java–>Java(Java控制面板中)–>如下3,接着打开注册表进行如下操作4,然后先查看使用java -veison依然不行,查看java的路径5,进入如上目录C:\Program Files (x86)\Common Files\Oracle\Java\javapath6,把原创 2021-08-03 23:42:39 · 2242 阅读 · 0 评论 -
使用两个ArrayList集合实现简单的map
通过使用两个ArrayList集合实现简单的mappackage map;import java.util.Map;import java.util.Objects;/** * TODO 类描述 * * @author qijian. * @date 2021/7/21 15:35 */public class MapEntry<K, V> implements Map.Entry<K, V> { private K key; private原创 2021-08-02 21:16:21 · 296 阅读 · 0 评论 -
Java中的引用
JDK1.2后进行了扩充强引用关联的对象不会被回收(无论何种情况下,只要强引用关系还在,垃圾收集器就永远不会回收掉被引用的对象)对于强引用我们开始学Java的时候是使用的最多的,就是我们栈内存定义一个类型的申明,指向堆中的一个对象的实例,这就是一个强引用。用代码来描述最简洁了。Object obj = new Object();如果这个对象不需要了,需要弱化从而使GC能够回收。例如:obj = null;这之后GC会认为对象的引用不存在(通过可达性分析算法),就是说GC从GC Roots节点开始原创 2021-08-02 16:52:46 · 79 阅读 · 0 评论 -
jdk动态代理:ClassCastException: com.sun.proxy.$Proxy4 cannot be cast to com.cx.bank.dao.BankDaoImpl
问题动态代理报错:java.lang.ClassCastException: com.sun.proxy.$Proxy4 cannot be cast to com.cx.bank.dao.BankDaoImpl at com.cx.bank.factory.UserDaoFactory.getBankDao(UserDaoFactory.java:57) at com.qijian.cx.bank.manager.TestManager.<clinit>(TestManager.jav原创 2021-07-27 17:44:15 · 701 阅读 · 0 评论 -
利用Comparable接口实现对对象数组的排序
Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该方法的的参数必须是Object类型对象,返回一个整形数值 。在Java SE 5.0之后Comparable接口已经改进为泛型类型。1 public interface Comparable<T> {2 public int compareTo(T o);3 }对于c...原创 2021-07-21 21:37:31 · 691 阅读 · 1 评论 -
Integer自动拆箱与自动装箱的相关问题
问题1 Integer a = 9; int b = 9; boolean f = a==b;这里的输出是true,通过断点分析发现,在进行**==**判断的时候Integer类型的a拆箱,然后再对像个int类型的数据进行比较问题2 Integer a = 9; int b = 9; boolean ff = a.equals(b);这里自己先分析一下,应该是先对b进行装箱,让后再进行equal比较。断原创 2021-07-20 21:24:35 · 212 阅读 · 0 评论 -
自动装箱与自动拆箱
自动装箱与自动拆箱给我们开发提供了很多的便利,在jdk 1.5中,自动装箱首次被引入。而在jdk 1.5之前,如果你想要定义一个value为100的Integer对象,则需要通过new出来。断点跟踪为了能够了解,自动装箱与自动拆箱的过程,我们打上断点一步步跟踪看看自动装箱的过程。自动装箱接下来抬到了Integer的valueOf(int i)方法,当然我这里设置的数是在==[-128,127]==之中,一会在对范围之外的数据进行跟踪。下一步,紧接着我们继续执行,之后就跳出了该方法于是通原创 2021-07-20 20:28:59 · 96 阅读 · 2 评论 -
transient关键字
transient 关键字1,使用transient关键字向java虚拟机表明,transient变量不是对象的持久状态的一部分。为了方便理解直接上例子import lombok.Data;import java.io.Serializable;@Datapublic class Employee implements Serializable { private static final long serialVersionUID = 2624368016355021172L;原创 2021-07-18 16:55:50 · 293 阅读 · 3 评论 -
深拷贝与浅拷贝
我们知道Java中数据类型分为基本数据类型以及引用数据类型。一,数据类型的分类基本数据类型的特点:直接存储在栈(stack)中的数据引用数据类型的特点:存储的是该对象在栈中引用,真实的数据存放在堆内存里浅拷贝与深拷贝的区别浅拷贝:拷贝对象与原对象的引用时同一个对象深拷贝:拷贝对象与原对象的引用为不同对象浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。引用数据原创 2021-06-25 19:50:39 · 194 阅读 · 1 评论 -
Linux下redis安装
把redis压缩文件上传到/opt下解压(程序放在opt下)tar zxvf redis-6.0.7.tar.gz安装gcc环境 : 由于redis是由C语言编写的,它的运行需要C环境,因此我们需要先安装gcc。yum install gcc-c++gcc -v//检查gcc是否安装成功进到解压后的redis目录中进行编译make编译后再次make ,出现如下说面成功了。再make install 确认下make install~~~![在这里插入图片描述]..原创 2021-06-13 15:23:44 · 113 阅读 · 0 评论 -
linux下安装jdk
环境CentOS7.7工具:Xshell 6 ,Xftp 6第一种安装方式1,进入/usr下创建java目录,cd /usrmkdir java2,进入java目录使用Xftp把jdk上传到该目录下,解压。删除压缩包tar zxvf jdk-8u271-linux-i586.tar.gzrm -f jdk-8u271-linux-i586.tar.gz3,修改环境变量vim /etc/profile4,添加如下配置,保存并退出export JAVA_HOME=/usr/jav原创 2021-06-13 15:20:43 · 1546 阅读 · 3 评论 -
导入sql 出现错误代码: 1273
导入数据库文件时出现如下:错误代码: 1273 Unknown collation: 'utf8mb4_0900_ai_ci'网上找了一下发现原因是由于高版本数据库(8.0)转存sql文件后 并导入低版本数据库(5.7)才会出现这类问题。那这样的话我们自然升级一下MySQL的版本就可以了。但是这种方法使用明显是不可取的。所以我们将需要导入的sql文件,把其中的utf8mb4_0900_ai_ci全部替换为utf8_general_ci,utf8mb4替换为utf8...原创 2021-05-26 21:39:07 · 1166 阅读 · 0 评论 -
如何替换 if (someobject != null), 实现判空
今天刷着有关技术方面微信订阅号的帖子,是有关避免空指针调用的,说实话没有看这个帖子之前我还真没有想过有关 if (someobject != null) 这样的语句会有什么不好判空后在进行相关的功能实现这个是我们常用的啊!这篇文章记录一下该种使用希望之后对自己有帮助。然后用工厂模式的使用来体验一下。public interface Shape { void draw();}public class Circle implements Shape{ @Override pu原创 2021-05-07 19:35:23 · 139 阅读 · 0 评论 -
反射实现对象的创建
1,什么事反射?反射: Java的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。反射被视为动态语言的关键 —百度百科注意:反射是jdk1.5加入的性特性2,准备User.javapackage com.qijian.reflect;import lombok.AllArgsConstruct原创 2021-04-21 00:18:07 · 247 阅读 · 0 评论 -
Lombok的使用
Lombok的使用1,了解Lombok看到网上的大佬都在使用Lombok插件我也就跟风学习一下。首先,当然看的是官网。官网是这样解释的:Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java. Never write another getter or equals method again, with one annotation原创 2021-03-25 00:18:07 · 146 阅读 · 0 评论 -
mybatis实现MySQL数据库的增删改查
//UserMapperpackage com.qijian.dao;import com.qijian.pojo.User;import org.apache.ibatis.annotations.Select;import java.util.List;public interface UserMapper { //查询所有的用户 //@Select("SELECT * FROM mybatis.user WHERE id = #{id}") List<原创 2020-12-29 00:04:41 · 376 阅读 · 0 评论 -
jsp执行步骤
一个jsp文件的执行过程可以分为七个执行步骤:启动Tomcat浏览器发送HTTP请求给服务器Tomcat找到jsp文件,识别出这是一个jsp网页请求,并将该请求传递给jsp引擎,通过使用URL或.jsp文件来完成jsp引擎从磁盘载入jsp文件,并将所有的jsp文件转换成相应的java文件java文件编译得到字节码文件(.class文件)服务器执行字节码文件,把结果嵌入到静态代码返回到浏览器中...原创 2020-11-10 15:13:55 · 1482 阅读 · 0 评论 -
设计模式之工厂模式(Java)
工厂模式是Java中最常见的模式之一简单工厂模式:一个抽象的接口,多个抽象接口的实现类,一个工厂类,用来实例化抽象的接口//接口与产品实体类//共同使用的接口interface phone{ public void run(); public void stop();}//具体实现类miphoneclass miPhone implements phone{...原创 2020-04-20 15:53:15 · 146 阅读 · 0 评论 -
maven Junit 测试判断是否是闰年
(100分)编写一个DateUtil的类,里面有一个isLeapYear(int year) 的方法,判断输入年份是否是闰年。如果是闰年,返回true,其他返回false。闰年需要满足以下3个条件:年份必须大于0,且小于等于10000。年份不能整除100,且可以整除4。年份可以整除100,且可以整除400。请编写JUnit测试类DateUtilTest,采用以下用例,使用assertE...原创 2020-03-07 22:10:52 · 2640 阅读 · 0 评论 -
给定一个汉字句子,可以输出句子的读音。借鉴第三方库:pinyin4j 。
给定一个汉字句子,可以输出句子的读音。可以借鉴第三方库:pinyin4j 。这个是网址:https://mvnrepository.com/artifact/com.belerweb/pinyin4j 。要求工程是Maven项目。第一次使用创建maven项目,在eclipse的配置上就花费了不少的时间。依赖: <!-- https://mvnrepository.com/ar...原创 2020-03-06 14:27:00 · 1257 阅读 · 0 评论