java学习
文章平均质量分 73
何以解忧,唯有..
这个作者很懒,什么都没留下…
展开
-
MyBatisPlus 中 LambdaQueryWrapper使用
MyBatis-Plus是一个强大的MyBatis扩展插件,它为MyBatis提供了许多实用的功能,其中之一就是LambdaQueryWrapper。LambdaQueryWrapper是一个条件构造器,用于构建SQL查询条件。通过使用LambdaQueryWrapper,我们可以以更简洁、更直观的方式编写查询条件,提高开发效率。LambdaQueryWrapper是MyBatis-Plus提供的一个条件构造器,它基于Java 8的Lambda表达式特性,允许我们通过Lambda表达式来构建查询条件。原创 2024-10-31 19:30:58 · 405 阅读 · 0 评论 -
Java List 结合删除元素的方法
正序删除方法不可取,因为会致 list 的长度发生了改变,后续遍历时,存在元素下标取不到了。倒序删除可以避免这个问题出现。创建一个待删除的集合,调用 removeAll()方法进行删除。原创 2024-08-19 15:39:51 · 287 阅读 · 0 评论 -
Lombok 注解总结
Lombok 是一个 Java 库,用于通过注解方式自动化生成 Java 类的常用方法(如 getter、setter、toString 等),从而简化开发流程并减少重复性代码。以下是 Lombok 库中常用的注解及其作用。这些注解可以根据需求单独使用,也可以组合在一起使用,以简化 Java 类的开发过程,减少冗余代码,并提高代码的可读性和维护性。请注意,使用 Lombok 需要在项目中添加 Lombok 的依赖,以便编译器能够正确处理这些注解。原创 2024-04-25 17:16:49 · 897 阅读 · 0 评论 -
MybatisPlus 常用注解
Mybatis-Plus是一个在Mybatis基础上进行增强的ORM框架,提供了许多便捷的注解来简化数据库操作。本文将介绍Mybatis-Plus常用的注解以及它们的使用方法。原创 2024-04-23 10:28:55 · 2391 阅读 · 0 评论 -
Java中 List 集合,通过 Stream 流进行排序总结
【代码】Java中 List 集合,通过 Stream 流进行排序总结。原创 2024-03-25 17:15:37 · 3149 阅读 · 0 评论 -
400 HTTP响应码之客户端错误
HTTP/1.1 可用。HTTP/1.1 可用。请求实体大小超过服务器的设置的最大限制,服务器可能会关闭HTTP链接并返回Retry-After 头字段。HTTP/1.1 可用。HTTP/1.1 可用。请求中包含的Range头字段无法被满足,通常是因为Range中的数字范围超出所请求资源的大小。HTTP/1.1 可用。HTTP/1.1 可用。HTTP/1.1 可用。HTTP/1.1 可用。HTTP/1.1 可用。HTTP/1.1 可用。服务器不支持客户端所请求的媒体类型,因此拒绝该请求。原创 2022-11-30 10:14:30 · 1110 阅读 · 1 评论 -
认识字符集、ASCII、GBK、Unicode、UTF-8
Unicode 是国际组织制定的,可以容纳世界上所有文字、符号的字符集。注意:技术人员在开发时都应该使用UTF-8编码!汉字编码字符集,包含了2万多个汉字等字符,注意:GBK 兼容了 ASCII 字符集。原创 2022-11-03 21:28:29 · 2451 阅读 · 0 评论 -
Java 中的异常处理机制
Java的异常处理机制可以让程序具有极好的容错性,让程序更加健壮。当程序运行出现意外情形时,系统会自动生成一个Exception对象来通知程序,从而实现将“业务功能实现代码” 和 “错误处理代码” 分离,提供更好的可读性。原创 2022-10-17 15:54:40 · 6519 阅读 · 0 评论 -
Java8 Optional 类
Optional 类(java.util.Optional) 是一个容器类,它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用 null 表示一个值不存在,现在 Optional 可以更好的表达这个概念。有利于注意避免空指针异常的问题。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。1、提示用户要注意该对象有可能为null2、简化if else代码。原创 2022-09-28 16:53:19 · 170 阅读 · 0 评论 -
简单介绍 Gradle 的安装与配置
基于Apache Ant和Apache Maven概念的项目自动化构建开源工具,基于Groovy这个特定DSL语言来进行声明项目设置,也增加了基于Kotlin语言的kotlin-based DSL。简介:Gradle是一个基于JVM的构建工具,是一款通用灵活的构建工具,支持maven, Ivy仓库,支持传递性依赖管理,而不需要远程仓库或者是pom.xml和ivy.xml配置文件,基于Groovy,build脚本使用Groovy编写。特点:①可切换的,像maven一样的基于约定的构建框架(约定优于配置)原创 2022-09-03 23:26:38 · 20643 阅读 · 2 评论 -
详解 Springboot 中使用 Aop
AOP (Aspect Oriented Programming),意为面向切面编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP的编程思想是把对类对象的横切问题点,从业务逻辑中分离出来,从而达到解耦的目的,增加代码的复用性,提高开发效率。...原创 2022-08-17 23:14:46 · 2338 阅读 · 1 评论 -
Arrays.asList() 使用说明
在我们日常工作中,经常需要把数组转换成List集合。因为数组的长度是固定的,不太好扩容,而List的长度是可变的,它的长度会根据元素的数量动态扩容。在JDK的Arrays类中提供了asList方法,可以把数组转换成List1、该方法适用于对象型数据的数组(String、Integer…)2、该方法不建议使用于基本数据类型的数组(byte,short,int,long,float,double,boolean)3、该方法将数组与List列表链接起来:当更新其一个时,另一个自动更新。...原创 2022-08-15 07:19:08 · 961 阅读 · 0 评论 -
SpringBoot Starter 学习总结 —— 写一个自定义的Starter
1.1、创建配置类,根据自己项目需求进行创建,实质上就是一个实体类1.2、根据场景进行相关业务的开发1.3、创建自动配置类1.4、在resources下面创建META-INF目录中创建spring.factories文件1.5、发布至maven仓库供其他项目使用...原创 2022-06-26 21:28:27 · 114 阅读 · 0 评论 -
Spring Cloud 微服务网关Gateway组件
一、网关介绍大家都知道在微服务架构中,一个系统会被拆分为多个微服务,那么作为客户端如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去用。这样的架构会存在诸多的问题:1、每个业务都需要鉴权、限流、权限校验、跨域等逻辑 ,如果每个业务都各自为战,自己造轮子实现一遍 ,就会很蛋疼,完全可以抽出来,放到一个统一的地方去处理。2、如果业务量比较简单的话,这样的方式前期不会存在什么问题,但是随着业务的发展越来越复杂,比如淘宝、亚马逊打开一个页面会涉及到数百个微服务原创 2022-05-08 22:46:00 · 927 阅读 · 0 评论 -
什么是跨域问题?
一、为什么会出现跨域问题出于浏览器的同源策略限制.同源策略是一种约定,它是浏览器最核心也是最基本的安全功能,如果缺少了同源策略,则浏览器的正常的功能可能会受到影响,跨域收是Web是构建在同源策略基础上的,浏览器只是针对同源策略的一种实现,同源策略会阻止一个域的JavaScript脚本和另一个域的内容进行交互,所谓同源(即指同一个域)就是两个页面具备同样的协议(protocol),主机(host)和端口号(port)。跨域报错的原因请求是跨域的,并不一定会报错。普通的图片请求,css文件请求是不会报错的原创 2022-05-08 10:17:13 · 883 阅读 · 0 评论 -
了解Java中的注解Annotation
一、什么是注解Annontation是Java5开始引入的新特征,中文名称叫注解。它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素(类、方法、成员变量等)进行关联。为程序的元素(类、方法、成员变量)加上更直观更明了的说明,这些说明信息是与程序的业务逻辑无关,并且供指定的工具或框架使用。Annontation像一种修饰符一样,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中。 Java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行原创 2022-05-06 23:10:35 · 509 阅读 · 0 评论 -
Map的遍历方式与Map的排序方法总结
一、Map的5种遍历方式Map<String, String> map = new HashMap<String, String>();map.put("bors", "博士");map.put("bear2", "熊二");1.1、entrySet遍历,相当于遍历Entry集合for (Map.Entry<String, String> entry : map.entrySet()) { String k = entry.getKey();原创 2022-05-06 20:16:53 · 3735 阅读 · 0 评论 -
TCP协议与UDP协议的区别
一、前言计算机与网络设备要相互通信,双方就必须基于相同的方法。比如,如何探测到通信目标、由哪一边先发起通信、使用哪种语言进行通信、怎样结束通信等规则都需要事先确定。不同的硬件、操作系统之间的通信,所有的这一切都需要一种规则。而我们就把这种规则称为协议(protocol)。TCP/IP 是互联网相关的各类协议族的总称。比如:TCP,UDP,IP,FTP,HTTP,ICMP,SMTP 等都属于 TCP/IP 族内的协议。【TCP/IP协议是一个协议簇。里面包括很多协议的。UDP只是其中的一个。之所以命名为原创 2022-05-05 22:58:33 · 7779 阅读 · 1 评论 -
LeetCode 单调栈练习题归纳总结
什么是单调栈?单调栈,栈内顺序要么从大到小 要么从小到大。一:739. 每日温度解题思路:遍历每日温度,维护一个单调栈,若栈为空或者当日温度小于、等于栈顶温度,则直接入栈;反之若当日温度大于栈顶温度,说明栈顶元素的升温日已经找到了,则将栈顶元素出栈,计算其与当日相差的天数即可。注意:题目要求返回的是升温的天数,而不是升温的温度,因此栈中保存的应是数组的下标,而非温度。代码:class Solution { public int[] dailyTemperatures(int[] te原创 2022-02-08 23:49:01 · 6361 阅读 · 0 评论 -
OpenTSDB入门学习总结
前言OpenTSDB是其中一种时序数据库实现,因为基于HBase生态构建而获得了广泛的关注。目前,华为云的CloudTable服务已经推出了OpenTSDB特性。一、OpenTSDB存储的核心概念1.1、Metric监控项(指标),比如CPU、MEMORY等1.2、Tags标签,Tags由一系列的Tag组成,是一种K/V格式的数据。标签是用来描述Metric,往往用来多维数据的展现(比如Prometheus中的数据格式)1.3、ValueValue表示的一个Metric的实际值1.4、T原创 2021-08-03 23:31:03 · 2250 阅读 · 0 评论 -
stream流学习总结,帮你快速写代码
一、stream流的概要和使用场景1.1 stream流概要首先要澄清的是,java8 中的stream与InputStream和OutputStream是完全不同的概念,stream是用于对集合迭代器的增强,使之完成更高效的聚合操作(过滤、排序、统计分组)或者大批量的数据操作,此外stream与lambda表达式结合后,编码效率大大提升,并且可读性更强。代码演示:stream流可以大大简化代码public class StreamTest01 { private static List&原创 2021-05-11 22:42:04 · 358 阅读 · 1 评论 -
Kafka学习总结(二)
Kafka消费者一、消费方式consumer 采用 pull(拉)模式从broker中读取数据。push(推)模式很难适用于消费速率不同的消费者,因为消息发送速度由broker决定,它的目标时尽可能以最快的速度发送消息,但是这样很容易造成consumer来不及处理消息,典型的表现是拒绝服务以及网络堵塞,而pull模式可以根据consumer的消费能力以适当的速度消费消息。pull模式不足之处是,如果Kafka没有数据,消费者可能会陷入循环中(空轮询),一直返回空数据,针对这一点,Kafka的消费者在原创 2021-04-22 11:58:46 · 192 阅读 · 0 评论 -
Kafka学习总结(一)
一、概述1.1、概念Kafka 是一种分布式的基于发布/订阅模式消息队列(Message Queue),主要应用于大数据实时处理领域。1.2、传统消息队列应用场景1.3、使用消息队列的好处1.3.1、解耦允许独立的扩展或者修改两边的处理过程,只要确保它们遵守同样的接口约束。1.3.2、可恢复性系统的一部分组件失效时,不会影响到整个系统,消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列的消息仍然可以在系统恢复后被处理。1.3.3、缓冲有助于控制和优化数据经过系统的速原创 2021-04-20 09:04:58 · 934 阅读 · 0 评论 -
Nginx的实现原理
Nginx的实现原理1、启动 Nginx 会有 master 进程和 worker 进程2、worker进程的工作原理3、一个Master,多个Worker的好处3.1、有利于Nginx进行热部署,nginx -s reload 热部署(热部署命令执行后,让空闲的worker重新加载,正在执行任务的worker在执行完任务后再重新加载)3.2、每个worker是独立的进程,不需要加锁,因此省掉了锁带来的开销;如果其中一个worker出现问题,其他worker独立的,继续进行争抢,实现请求过程原创 2021-04-19 15:32:15 · 591 阅读 · 0 评论 -
ZooKeeper学习笔记
一、概述ZooKeeper 是一个开源的、分布式的,为分布式应用提供协调服务的Apache项目。ZooKeeper 的工作机制:ZooKeeper 从设计模式上来理解,是一个基于观察者设计模式设计的分布式服务管理框架,它负责储存和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据状态发生变化,ZooKeeper 就将在ZooKeeper上注册的那些观察者做出相应的反应。ZooKeeper = 文件系统 + 通知系统二、ZooKeeper的特点1、ZooKeeper,一个领导者(Lead原创 2021-04-09 22:24:48 · 236 阅读 · 0 评论 -
阻塞队列 —— BlockingQueue学习总结
一、什么是阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。阻塞队列提供了四种处理方法:抛出异常: 是指当阻塞队列满时候,再往队列里插入元素,会抛出IllegalStateException(“Queue f原创 2021-02-25 17:31:40 · 601 阅读 · 0 评论 -
mysql 中 instr函数 与 like之间的相同和不同
INSTR(STR,SUBSTR)在一个字符串(STR)中搜索指定的字符(SUBSTR),返回发现指定的字符的位置(INDEX);STR 被搜索的字符串 ,SUBSTR 希望搜索的字符串 。结论:在字符串STR里面,字符串SUBSTR出现的第一个位置(INDEX),INDEX是从1开始计算,如果没有找到就直接返回0,没有返回负数的情况。LIKE匹配关键字注意:"[]"通配符MySql不支持INSTR 和 LIKE 的使用总结:(1)instr>0 和like、instr=0 和no原创 2021-02-24 17:25:02 · 2996 阅读 · 1 评论 -
SpringBoot自动装配原理
引言SpringBoot框架是目前市面上Java开发运用最多的框架之一,SpringBoot的出现,得益于“约定大于配置”的原理,没有繁琐的xml配置,其自动配置的原理更是Java面试中,出现的高频问题,因此大家要熟记于心,理解自动配置原理@SpringBootApplication@SpringBootApplication是一个组合注解,其中包含最为重要的3个注解,@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan1原创 2020-12-16 21:59:31 · 151 阅读 · 0 评论 -
CountDownLatch的使用和原理解析
背景1、countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。2、存在于java.util.cucurrent包下。CountDownLatch概念1、countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。2、是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都原创 2020-09-04 11:15:03 · 380 阅读 · 0 评论 -
公平锁和非公平锁
概述在一个线程组里,能保证每个线程都能拿到锁,那么这个锁就是公平锁。相反,如果保证不了每个线程都能拿到锁,也就是存在有线程饿死,那么这个锁就是非公平锁。实现原理那如何能保证每个线程都能拿到锁呢,队列FIFO是一个完美的解决方案,也就是先进先出,java的ReenTrantLock也就是用队列实现的公平锁和非公平锁。在公平的锁中,如果有另一个线程持有锁或者有其他线程在等待队列中等待这个锁,那么新发出的请求的线程将被放入到队列中。而非公平锁上,只有当锁被某个线程持有时,新发出请求的线程才会被放入队列中(原创 2020-08-11 22:42:48 · 153 阅读 · 0 评论 -
SpringMVC工作原理概述
SpringMVC框架介绍Spring的MVC框架主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。SpringMVC原理图SpringMVC工作流程概述:1、客户端向web服务器(如tomcat)发送一个http请求,web服务器对http请求进行解析,解析后的URL地址如果匹配了DispatcherServlet的映射路径(通过web.xml中的servlet-mapping配置),web容器就将请求交给DispatcherServlet处理。2、D转载 2020-07-31 17:55:46 · 568 阅读 · 0 评论 -
ArrayList 线程安全问题
概述ArrayList用在多线程环境中存在线程安全问题。关键的原因就是ArrayList底层实现,在新增元素时数组索引的移动操作。ArrayList的add()方法源码:Java中 i++ 并非线程安全的,这样多个线程同时往一个ArrayList中加元素,导致元素丢失,出现空洞。那么如果想在多线程环境中使用ArrayList,有哪些保证其线程安全性的方法呢?代码案例public class UnsafeArrayList2 { public static void main(Strin原创 2020-07-30 15:13:27 · 1507 阅读 · 0 评论 -
CAS机制和ABA问题解决
CAS概述CAS:Compare and Swap,即比较再交换,它是一条CPU并发原语。它的功能是判断内存某个位置的值是否为预期值,如果是,则更改为最新值,这个过程是原子的。CAS并发原语体现在Java语言中的sun.misc.Unsafe类中的各个方法,调用Unsafe类中的CAS方法,JVM会帮我们实现CAS汇编指令,它是一种完全依赖于硬件的功能,通过它实现了原子操作,再次强调,由于CAS是一种系统原语,原语属于操作系统用语的范畴,是由若干条指令组成的,用于完成某个功能的一个过程,并且原语的执行原创 2020-07-29 21:49:57 · 208 阅读 · 0 评论 -
JMM内存模型
概况JMM(Java Model Memory)本身是一种抽象的概念并不真实存在,它描述的是一组规则或规范,通过这组规范定义了程序中各个变量(包括实例字段,静态字段和构成数组对象的元素)的访问方式。JMM三大特性1、可见性2、原子性3、有序性JMM关于同步的规定1、线程解锁前,必须把共享变量的值刷新到主内存2、线程加速前,必须读取主内存的最新值到自己的工作内存3、加锁解锁必须是同一把锁由于JVM运行程序的实体是线程,而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间),工原创 2020-07-27 07:56:36 · 148 阅读 · 0 评论 -
Docker学习(一)
Docker本身并不是容器,它是创建容器的工具,是应用容器引擎Docker的三大要素:镜像、容器、仓库镜像我们都知道,操作系统分为内核和用户空间。对于 Linux 而言,内核启动后,会挂载 root 文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root 文件系统。Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。镜像不包含任何动态数据,其内容在构建原创 2020-07-23 23:14:13 · 142 阅读 · 0 评论 -
Java3大特征之继承
概述继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。子类继承父类,父类派生子类。父类又叫基类。子类又叫派生类。面向对象的程序设计有三大特征:1、封装:解决了数据的安全性问题2、继承:解决了代码的重用问题3、多态:解决了程序的扩展问题通常情况,最高层是最普遍的、最一般的情况,往下每一层都比上一层更具体,并包含有高层的特征,通过这样的层次结构使下层的类能自动享用上层类的特点和性质。继承其实就是自动地共享基类中成员属原创 2020-07-21 18:01:14 · 479 阅读 · 0 评论 -
Java反射机制
概况反射是Java的特征之一,是一种间接操作目标对象的机制,核心是JVM在运行的时候才动态加载类,并且对于任意一个类,都能够知道这个类的所有属性和方法,并且能调用其属性和方法,不需要提前在编译期知道运行的对象是谁,它允许运行中的Java程序获取类的全部信息,并且可以操作类或对象内部属性。程序中对象的类型一般都是在编译期就确定下来的,而当我们的程序在运行时,可能需要动态的加载一些类,这些类因为一开始用不到,所以没有加载到JVM,这时,使用Java反射机制可以在运行期动态的创建对象并调用其属性,它是在运行时根原创 2020-07-17 15:19:40 · 143 阅读 · 0 评论 -
什么是泛型,泛型的基本使用
为什么使用泛型?泛型是 Java SE 1.5 的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。相对于传统上的形参,可以使我们的参数具有更多类型上的变化,使代码能更好地复用。先看代码:public class Box { private String value; public String getValue() { return value;原创 2020-07-08 14:37:06 · 642 阅读 · 0 评论 -
Java 浅拷贝 和 深拷贝
Cloneable接口cloneable其实就是一个标记接口,只有实现这个接口后,然后在类中重写Object中的clone方法,然后通过类调用clone方法才能克隆成功,如果不实现这个接口,则会抛出CloneNotSupportedException(克隆不被支持)异常。Object中clone方法:native修饰的方法都是空的方法,但是这些方法都是有实现体的(这里也就间接说明了native关键字不能与abstract同时使用。因为abstract修饰的方法与java的接口中的方法类似,他显式的说明原创 2020-07-07 17:35:38 · 145 阅读 · 0 评论 -
StringUtils中的 isBlank() 和 isEmpty() 的区别
在校验一个String类型的变量是否为空时,一般存在这五种情况1、是否为null2、是否为""3、是否为空字符串(引号中间有空格) 如: " "。4、制表符、换行符、换页符和回车5、空白public static boolean isBlank(String str)方法可以一次性校验这五种情况,返回值都是true,否则为false举栗子:public static boolean isEmpty(String str)判断某字符串是否为空,为空的标准是 str==null 或原创 2020-06-29 09:40:38 · 327 阅读 · 0 评论