
从头开始学java
NewBee.Mu
这个作者很懒,什么都没留下…
展开
-
JVM知识点整理(整理中)
运行过程:调用T.count时,首先将T.class通过app加载到内存,再经过Verification进行校验,之后再通过Preparation对T里面的静态成员变量赋默认值,此时t是空值,,count是0,再进行Resolution,之后再通过Initializing对静态成员变量赋初始值,此时t会被赋值new T(),对count++,此时count是1,之后count又被赋值为2,因此count为2。所用到的类库,会在class文件被加载到 JVM的同时,也被装载到类加载器中。原创 2023-01-20 15:10:33 · 2511 阅读 · 3 评论 -
用stream流取出两个数组中不同和相同的部分
【代码】用stream流取出两个数组中不同和相同的部分。原创 2022-11-30 10:06:58 · 2502 阅读 · 1 评论 -
组织架构树的查询
在项目的实际开发中,肯定会遇到需要对组织架构树进行查询的业务场景,也就是多层的父子级关系查询原创 2022-11-11 17:28:36 · 578 阅读 · 0 评论 -
用户登录和退出,以及访问请求的token校验
用户登录和退出,以及访问请求的token校验原创 2022-11-06 23:24:55 · 829 阅读 · 0 评论 -
算法与数据结构解析学习笔记
第三个的时间复杂度计算过程和第二个有点像,只不过是输出语句变成了一个遍历循环。因此计算公式变成了1+(n+1)+n+n(3n+2)=2n+2+3n。i < n的判断共进行了n+1次,所以运行时间是n+1。所以他们加起来就是1+(n+1)+n+n=3n+2。输出语句也运行了n次,所以运行时间是n。i++共运行了n次,所以运行时间是n。int i = 0的运行时间是1。原创 2022-10-09 14:32:52 · 707 阅读 · 0 评论 -
Flowable之FlowableUI应用
Flowable之FlowableUI应用转载 2022-09-07 17:05:21 · 627 阅读 · 0 评论 -
项目中的自定义注解
项目中的自定义注解原创 2022-09-06 15:32:22 · 416 阅读 · 0 评论 -
SpringBoot项目的用户登录与token校验
在实际的SpringBoot项目开发中,肯定会用到用户的账号密码登录,以及前端访问后端接口肯定也要进行token校验啥的。虽然一般项目中肯定有封装好了不需要我们操心,直接用就好了,但是想要进步,想要提升自己,肯定不能知其然不知其所以然,还是要弄明白到底是怎么做到的,所以我在这里做一个研究的记录,方便大家共同学习,共同进步。原创 2022-09-04 22:30:25 · 743 阅读 · 0 评论 -
对象中的字段隐藏
工作中遇到了一个情况,一个对象里面的字段挺多的,但是每次调用接口只会用到其中的部分字段,全传过去前端渲染就会花很久,然后就会很卡,这个时候就需要将对象中为空的字段隐藏掉,保证给前端的对象中只有有值的字段。点进去这个Include枚举。这个时候就可以用这个注释。原创 2022-08-24 17:58:52 · 585 阅读 · 0 评论 -
从源码学习Map.merge()方法
如果oldValue为空的话,直接把新输入的参数value赋值给newValue,否则的话按照传入的设定好的规则组装参数,比如我的代码里面,就是。首先调用了Objects类里面的requireNonNull()方法,这个方法的作用是判断参数是否为空,如果参数为空就会抛出异常。然后如果newValue为空的话,就从map中直接把这个key给remove掉,如果不为空,就把newValue赋值给key。总结一下,就是原来的参数是空的,就直接新参数覆盖,原来的参数不为空,就按照设定好的规则处理后覆盖原有的参数。.原创 2022-08-17 10:48:06 · 286 阅读 · 0 评论 -
list中将具有对应字段的某一个对象放在第一个
list中将具有对应字段的某一个对象放在第一个原创 2022-07-11 11:09:35 · 2235 阅读 · 0 评论 -
java.lang.ClassCastException格式转换错误的解决方法
原来的代码其实就是个从redis中取出值的操作,然后报错了换成下面这样就解决了应该就是Object对象不能直接强换成LoginUser对象,需要根据情况来进行转换原创 2022-07-07 21:06:15 · 602 阅读 · 0 评论 -
物联网亿万级通信一站式解决方案EMQ
MQTT(Message Queuing Telemetry Transport,消息队列遥测传输协议),是一种基于发布/订阅(publish/subscribe)模式的"轻量级"通讯协议,该协议构建于TCP/IP协议上,由IBM在1999年发布。MQTT最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。作为一种低开销、低带宽占用的即时通讯协议,使其在物联网、小型设备、移动应用等方面有较广泛的应用。一个使用MQTT协议的应用程序或者设备,它总是建立到服务器的网络连接。客户原创 2022-06-25 23:07:20 · 2054 阅读 · 1 评论 -
Java并发编程学习笔记
Synchronized学习笔记使用场景修饰实例方法修饰静态方法修饰代码块成员锁实例对象锁当前类的 class 对象锁Java对象的构成对象头Mark Word(标记字段)Klass Point(类型指针)实例数据对其填充synchronized怎么实现有序性、可见性、原子性有序性as-if-serial可见性原子性synchronized特性可重入性不可中断性底层实现同步代码同步方法monitor重量级锁用户态和内核态优化锁升级偏向锁轻量级锁自旋锁用synchronized还是Lock呢使用场景修饰实原创 2022-04-12 16:20:23 · 827 阅读 · 2 评论 -
使用stream流进行条件查询
public class Demo { private Integer id; private Integer num; public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getNum() { return num; } publ.原创 2022-04-11 11:51:49 · 3476 阅读 · 0 评论 -
redis内部工作机制
本文将分五个部分来分析和总结Redis的内部机制,分别是:Redis数据库、Redis客户端、Redis事件、Redis服务器的初始化步骤、Redis命令的执行过程。首先介绍一下Redis服务器的状态结构。Redis使用一个类型为“redisServer”的数据结构来保存整个Redis服务器的状态(每个属性按照即将讲解的顺序进行排序):struct redisServer {int dbnum;//服务器的数据库数量,值由服务器配置的“databases”选项决定,默认为16redisDb *db;转载 2022-02-07 15:31:05 · 307 阅读 · 0 评论 -
完整的项目流程(以修改密码为例)
前端:1、html<div id="modifyPassword" class="modifyPassword"> <br/><br/><br/><br/><br/><br/><br/><br/><br/> <div align="center"> <div style="width:30%; color:#666666; text-align:left; f原创 2022-01-10 15:53:58 · 539 阅读 · 0 评论 -
docker安装node.js
拉取官方的最新版本的镜像:docker pull node:latest使用以下命令来查看是否已安装了 nodedocker images安装完成后,我们可以使用以下命令来运行 node 容器:docker run -itd --name node-test node–name node-test:容器名称。最后进入查看容器运行的 node 版本:docker exec -it node-test /bin/bash...原创 2021-12-28 16:08:08 · 1366 阅读 · 0 评论 -
docker安装nginx
拉取官方的最新版本的镜像:docker pull nginx:latest使用以下命令来查看是否已安装了 nginx:docker images安装完成后,我们可以使用以下命令来运行 nginx 容器:docker run --name nginx-test -p 8080:80 -d nginx发现有问题,这个时候我们把docker容器关闭再重启,但是发现还是不行docker: Error response from daemon: Conflict. The containe原创 2021-12-28 15:58:08 · 1509 阅读 · 0 评论 -
docker安装tomcat
拉取官方的镜像:docker pull tomcat等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 tomcat 的镜像:docker images运行容器docker run --name tomcat -p 8080:8080 -v $PWD/test:/usr/local/tomcat/webapps/test -d tomcat-p 8080:8080:将主机的 8080 端口映射到容器的 8080 端口。-v $PWD/test:/usr/原创 2021-12-28 15:30:24 · 564 阅读 · 0 评论 -
docker安装mysql
拉取官方的最新版本的镜像:docker pull mysql:latest使用以下命令来查看是否已安装了 mysql:docker images安装完成后,我们可以使用以下命令来运行 mysql 容器:docker run -itd --name mysql-test -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql-p 3306:3306 :映射容器服务的 3306 端口到宿主机的 3306 端口,外部主机可以直接通过 宿主机ip:3原创 2021-12-28 14:34:00 · 287 阅读 · 0 评论 -
docker安装redis
我们拉取官方的最新版本的镜像:docker pull redis:latest使用以下命令来查看是否已安装了 redis:docker images安装完成后,我们可以使用以下命令来运行 redis 容器:docker run -itd --name redis-test -p 6379:6379 redis-p 6379:6379:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。最后我们可以通过 doc原创 2021-12-28 14:02:31 · 796 阅读 · 0 评论 -
安装docker
执行以下命令安装依赖包:sudo yum install -y yum-utils这样就说明安装依赖包完毕接下来设置稳定的仓库,我们使用的是阿里云sudo yum-config-manager \ --add-repo \ https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo安装最新版本的 Docker Engine-Community 和 containerdsudo yum install原创 2021-12-28 11:23:37 · 246 阅读 · 0 评论 -
用自己的阿里云服务器模拟公司服务器安装redis
我来研究一下我用我自己的阿里云服务器能不能模拟出我是怎么在公司的服务器上安装redis的。在自己的服务器上,自己肯定是root用户。但是在公司里,肯定不可能随便拿着root用户用,所以我们要先创建一个user用户来供我们使用。1、首先创建一个用户名为user的普通用户:useradd user2、然后设置登录密码:passwd user然后会提示你输入密码,输入即可这个时候就创建user用户成功,然后我们用user用户登录1、redis安装1.1、安装要求用户及目录准备见下表(文件不原创 2021-12-26 21:07:31 · 657 阅读 · 0 评论 -
Java1.8新增元注解@Repeatable
最近在复习元注解这一块的时候,发现Java1.8除了带来了很多新特性以外,还带来了一个新的元注解@Repeatable@Repeatable这个元注解的作用就是他注解的值可以取多个,是可以重复的举个栗子,假设我很牛,我一个人可以干产品,可以干前端,可以干后端,还可以做测试。。。@interface Mines{ Mine[] value();}@Repeatable(Mines.class)@interface Mine{ String role default "";}@原创 2021-12-07 19:50:28 · 554 阅读 · 0 评论 -
工作中Spring缓存注解@Cacheable、@CacheEvict、@CachePut的使用场景
在工作中,遇到了一段代码,业务上是进行登录时输入错误代码的次数的记录和清零。因为之前没用过@Cacheable、@CacheEvict、@CachePut这三个注释,所以花了点功夫学习了一下,在这里记录一下 @Override //value:缓存名 //keyCode:缓存的key //condition:判断执行条件 //allEntries:是否需要清除缓存中的所有元素。默认为false,表示不需要 //beforeInvocation:当我们指定为true时原创 2021-11-05 14:45:32 · 550 阅读 · 0 评论 -
getAnnocation方法的源码探索(未完成)(剩下的不会了,寻求帮助中。。。)
在熟悉项目代码的过程中,看到了一条代码,因为涉及到具体业务,因此我自己写了一个模拟当时的情况PersonEnum.javapublic enum PersonEnum{ TEACHER("teacher","老师"), STUDENT("student","学生"), WORKER("worker","工人"); private String name; private String desc; public String getName(){ return name; }原创 2021-04-23 16:27:09 · 256 阅读 · 0 评论 -
BeanFactory 和factoryBean的差别
BeanFactory是个Factory,也就是IOC容器或对象工厂,FactoryBean是个Bean。在Spring中,所有的Bean都是由BeanFactory(也就是IOC容器)来进行管理的。但对FactoryBean而言,这个Bean不是简单的Bean,而是一个能生产或者修饰对象生成的工厂Bean,它的实现与设计模式中的工厂模式和修饰器模式类似...原创 2021-04-22 15:49:33 · 141 阅读 · 0 评论 -
公平锁和非公平锁的性能差异
公平锁:多个线程按照申请锁的顺序去获得锁,线程会直接进入队列去排队,永远都是队列的第一位才能得到锁。优点:所有的线程都能得到资源,不会饿死在队列中。缺点:吞吐量会下降很多,队列里面除了第一个线程,其他的线程都会阻塞,cpu唤醒阻塞线程的开销会很大。非公平锁:多个线程去获取锁的时候,会直接去尝试获取,获取不到,再去进入等待队列,如果能获取到,就直接获取到锁。优点:可以减少CPU唤醒线程的开销,整体的吞吐效率会高点,CPU也不必取唤醒所有线程,会减少唤起线程的数量。缺点:你们可能也发现了,这样可能导致原创 2021-04-22 15:14:34 · 651 阅读 · 0 评论 -
如何判断链表是否有环
有两个指针fast和slow,开始的时候两个指针都指向链表头head,然后在每一步操作中slow向前走一步即:slow = slow->next,而fast每一步向前两步即:fast = fast->next->next。由于fast要比slow移动的快,如果有环,fast一定会先进入环,而slow后进入环。当两个指针都进入环之后,经过一定步的操作之后二者一定能够在环上相遇,并且此时slow还没有绕环一圈,也就是说一定是在slow走完第一圈之前相遇。...原创 2021-04-20 14:30:07 · 154 阅读 · 0 评论 -
arraylist扩容机制
如果没有向集合中添加任何元素时, 容量为0 size为0添加第一个元素的时候,容量为10 才扩容 容量第一次为10 后面是原来的1.5倍原创 2021-04-20 14:13:07 · 160 阅读 · 0 评论 -
多线程有几种实现方法,都是什么?同步有几种实现方法,都是什么
多线程的实现方法1.直接继承thread类;2.实现runnable接口;3.实现callable接口;同步的实现方法1.同步方法;2.同步代码块;3.使用特殊域变量(volatile)实现线程同步;4.使用重入锁实现线程同步;5.使用局部变量实现线程同步 。...原创 2021-04-16 15:12:24 · 370 阅读 · 0 评论 -
Spring中涉及的设计模式
Spring中涉及的设计模式总结简单工厂 实现方式:BeanFactory。 Spring中的BeanFactory就是简单工厂模式的体现,根据传入一个唯一的标识来获得Bean对象,但是否是在传入参数后创建还是传入参数前创建这个要根据具体情况来定。工厂方法 实现方式:FactoryBean接口。单例模式 Spring依赖注入Bean实例默认是单例的;数据库的连接池也是单例的。适配器模式 实现方式:SpringMVC中的适配器HandlerAdatper。装饰器模式 实现原创 2021-04-15 15:01:13 · 147 阅读 · 0 评论 -
一句话总结软件设计七大原则
开闭原则、里氏替换原则、依赖倒置原则、单一职责原则、接口隔离原则、迪米特法则和合成复用原则这7 种设计原则是软件设计模式必须尽量遵循的原则,是设计模式的基础。在实际开发过程中,并不是一定要求所有代码都遵循设计原则,而是要综合考虑人力、时间、成本、质量,不刻意追求完美,要在适当的场景遵循设计原则。这体现的是一种平衡取舍,可以帮助我们设计出更加优雅的代码结构。各种原则要求的侧重点不同,下面我们分别用一句话归纳总结软件设计模式的七大原则,如下表所示。设计原则一句话归纳目的开闭原则对扩原创 2021-04-14 11:12:37 · 488 阅读 · 0 评论 -
软件设计七大原则之合成复用原则
合成复用原则的定义合成复用原则(Composite Reuse Principle,CRP)又叫组合/聚合复用原则(Composition/Aggregate Reuse Principle,CARP)。它要求在软件复用时,要尽量先使用组合或者聚合等关联关系来实现,其次才考虑使用继承关系来实现。如果要使用继承关系,则必须严格遵循里氏替换原则。合成复用原则同里氏替换原则相辅相成的,两者都是开闭原则的具体实现规范。合成复用原则的重要性通常类的复用分为继承复用和合成复用两种,继承复用虽然有简单和易实现的优原创 2021-04-14 10:30:20 · 234 阅读 · 0 评论 -
软件设计七大原则之迪米特法则
迪米特法则的定义迪米特法则(Law of Demeter,LoD)又叫作最少知识原则(Least Knowledge Principle,LKP),产生于 1987 年美国东北大学(Northeastern University)的一个名为迪米特(Demeter)的研究项目,由伊恩·荷兰(Ian Holland)提出,被 UML 创始者之一的布奇(Booch)普及,后来又因为在经典著作《程序员修炼之道》(The Pragmatic Programmer)提及而广为人知。迪米特法则的定义是:只与你的直接朋原创 2021-04-13 17:50:26 · 173 阅读 · 0 评论 -
软件设计七大原则之接口隔离原则
接口隔离原则的定义接口隔离原则(Interface Segregation Principle,ISP)要求程序员尽量将臃肿庞大的接口拆分成更小的和更具体的接口,让接口中只包含客户感兴趣的方法。2002 年罗伯特·C.马丁给“接口隔离原则”的定义是:客户端不应该被迫依赖于它不使用的方法(Clients should not be forced to depend on methods they do not use)。该原则还有另外一个定义:一个类对另一个类的依赖应该建立在最小的接口上(The depe原创 2021-04-13 16:44:48 · 204 阅读 · 0 评论 -
软件设计七大原则之单一职责原则
单一职责原则的定义单一职责原则(Single Responsibility Principle,SRP)又称单一功能原则,由罗伯特·C.马丁(Robert C. Martin)于《敏捷软件开发:原则、模式和实践》一书中提出的。这里的职责是指类变化的原因,单一职责原则规定一个类应该有且仅有一个引起它变化的原因,否则类应该被拆分(There should never be more than one reason for a class to change)。该原则提出对象不应该承担太多职责,如果一个对象承原创 2021-04-13 14:01:10 · 367 阅读 · 0 评论 -
软件设计七大原则之依赖倒置原则
依赖倒置原则的定义依赖倒置原则(Dependence Inversion Principle,DIP)是 Object Mentor 公司总裁罗伯特·马丁(Robert C.Martin)于 1996 年在 C++ Report 上发表的文章。依赖倒置原则的原始定义为:高层模块不应该依赖低层模块,两者都应该依赖其抽象;抽象不应该依赖细节,细节应该依赖抽象(High level modules shouldnot depend upon low level modules.Both should depe原创 2021-04-13 11:40:06 · 263 阅读 · 0 评论 -
软件设计七大原则之面向对象设计原则
里氏替换原则的定义里氏替换原则(Liskov Substitution Principle,LSP)由麻省理工学院计算机科学实验室的里斯科夫(Liskov)女士在 1987 年的“面向对象技术的高峰会议”(OOPSLA)上发表的一篇文章《数据抽象和层次》(Data Abstraction and Hierarchy)里提出来的,她提出:继承必须确保超类所拥有的性质在子类中仍然成立(Inheritance should ensure that any property proved about supert原创 2021-04-13 10:55:19 · 141 阅读 · 0 评论