java进阶-基础篇
文章平均质量分 60
基础篇主要针对有一定java知识的程序员,通过该专栏能够扩展自己的基础知识,能够在项目中运用解决一些疑难杂症!
wwwzhouzy
一个有情怀的奋斗者!
展开
-
Minio工具类 - Java
一、pom.xml中引依赖<dependency> <groupId>io.minio</groupId> <artifactId>minio</artifactId> <version>7.1.0</version></dependency>二、配置ymlminio: endpoint: http://127.0.0.1:9000 #MinIO服务所在地址 bucke转载 2022-01-05 09:46:11 · 3841 阅读 · 1 评论 -
idea启动项目报错Error:(5, 52) java: 程序包org.springframework.scheduling.annotation不存在
好好的一个项目别人idea都能够启动,我来运行就是不行。项目是没有问题的,clean install也是没有问题的。下面是解决方案转载 2022-01-04 11:49:00 · 724 阅读 · 0 评论 -
记录maven项目导入eclipse报错的问题-Plugin execution not covered by lifecycle configuration
一、问题Plugin execution not covered by lifecycle configuration: org.apache.maven.plugins:maven-compiler-plugin:3.7.0:compile (execution: default-compile, phase: compile)二、解决方案Window” -- “Preferences” -- “Maven” -- “Lifecycle Mapping”查看Change mapping fi原创 2021-11-28 14:58:31 · 462 阅读 · 0 评论 -
java程序CPU过高如何定位代码
一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?首先显示线程列表:ps -mp pid -o THREAD,tid,time找到了耗时最高的线程28802,占用CPU时间快两个转载 2021-10-31 21:10:52 · 558 阅读 · 0 评论 -
java的SPI机制与简单实例
一、什么是SPI这里先说下SPI的一个概念,SPI英文为Service Provider Interface单从字面可以理解为Service提供者接口,正如从SPI的名字去理解SPI就是Service提供者接口;我对SPI的定义:提供给服务提供厂商与扩展框架功能的开发者使用的接口。很多框架都使用了java的SPI机制,如java.sql.Driver的SPI实现(mysql驱动、oracle驱动等)、common-logging的日志接口实现、dubbo的扩展实现等等框架;二、机制约定1).原创 2021-10-16 11:29:16 · 597 阅读 · 0 评论 -
PostgreSQL - 查询表结构和索引信息
PostgreSQL的表一般都是建立在public这个schema下的,假如现在有个数据表t_student,可以用以下几种方式来查询表结构和索引信息。使用\d元命令查看表字段信息和索引信息在cmd界面使用psql连接db后,输入\d加上表名即可:通过系统数据字典查询表结构selectcol.table_schema,col.table_name,col.ordinal_position,col.column_name,col.data_type,col.character_m原创 2021-09-19 10:44:37 · 4745 阅读 · 0 评论 -
Java中常见的异常类型
异常类型在 Java 中所有异常类型都是内置类 java.lang.Throwable 类的子类,即 Throwable 位于异常类层次结构的顶层。Throwable 类下有两个异常分支 Exception 和 Error,如图 1 所示。Throwable 类是所有异常和错误的超类,下面有 Error 和 Exception 两个子类分别表示错误和异常。其中异常类 Exception 又分为运行时异常和非运行时异常,这两种异常有很大的区别,也称为不检查异常(Unchecked Exceptio原创 2021-09-11 17:39:06 · 1172 阅读 · 0 评论 -
jdbc中getString()方法与getObject()方法有什么区别
JDBC提供了getString()、getInt()、getData()等方法从ResultSet中获取数据。先是将数据加载到内存中,如果数据量大,那么会抛异常:OrcelException未处理:ORA-01000:maximum open cursors exceedde(以Orcel数据库为例)。数据量小不会有这个问题而getObject是不会有这个问题,主要是getObject不是一次性加载到内存里的,而是从数据库中获取,因此数据量大时要用getObject方法...原创 2021-09-11 17:35:05 · 402 阅读 · 0 评论 -
Windows 查看端口占用进程并关闭该进程
1.打开CMD命令行,输入 netstat -ano|findstr "端口号" 查看进程,不要漏掉双引号:netstat -ano|findstr "端口号"以我查找的 8989 端口为例,通过 Netstat 可以找到是 PID 为 31684 的进程占用了 8989 端口:2.使用Tasklist查看对于 PID 的进程名:tasklist|findstr "PID号"可以看到是 java.exe 进程占用了该端口:同时我们可以在任务管理器(详细信息)内找到..原创 2021-09-05 17:08:14 · 202 阅读 · 0 评论 -
springboot+netty+websocket实现一个简单的聊天室
一、介绍1、websocketWebSocket是html5开始浏览器和服务端进行全双工通信的网络技术。在该协议下,与服务端只需要一次握手,之后建立一条快速通道,开始互相传输数据,实际是基于TCP双向全双工,比http半双工提高了很大的性能,常用于网络在线聊天室等2、WebSocket与http比较http WebSocket 半双工,可以双向传输,不能同时传输 全双工 消息冗长繁琐,消息头,消息体,换行... 对代理、防火墙、路由器透明 http轮询实现推送请原创 2021-09-05 17:05:34 · 356 阅读 · 0 评论 -
springboot 实现国际化语言切换
一、配置1、springboot配置spring: messages: basename: i18n/messages encoding: UTF-82、文件内容:messages.properties和messages_zh_CN.propertiestext.value=我是中国人messages_en_US.propertiestext.value=I'm Chinese3、代码1、I18nConfig.javap..原创 2021-09-04 16:37:24 · 2065 阅读 · 0 评论 -
eclipse解决ASCII码转中文的问题
1. 打开Eclipse的hellp=>Install New Software2. 添加插件PropertiesEditorname:PropertiesEditorLocation:http://propedit.sourceforge.jp/eclipse/updates/安装后需要重启,重启后:3、选择PropertiesEditor打开properties文件...原创 2021-09-03 22:27:06 · 554 阅读 · 0 评论 -
使用explain执行计划对SQL进行性能分析
一、什么是执行计划执行计划是用于计算数据库优化器处理SQL的资源成本,在MySQL中使用执行计划的命令是explain(也可以写为desc、describe),通过该命令可以查看SQL在真正执行时所需要经历的一系列过程,通过执行结果可以看出一条复杂的SQL查找顺序、是否有通过索引查询等信息。执行计划命令所带的SQL并不会真正执行,所以不会担心占用系统资源,用于对SQL进行分析优化非常有用。如下示例:mysql > EXPLAIN SELECT id,name FROM table; #ex原创 2021-09-01 20:56:53 · 553 阅读 · 0 评论 -
mysql索引数据结构
MySql存储引擎MyISAM: 拥有较高的插入,查询速度,但不支持事务InnoDB :5.5版本后Mysql的默认数据库,事务型数据库的首选引擎,支持ACID事务,支持行级锁定MySql索引数据结构(BTREE和Hash)BTREE和Hash的区别1、Hash 索引,其检索效率非常高,索引的检索可以一次定位。BTREE 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问2、Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。3、Hash原创 2021-08-31 20:32:59 · 327 阅读 · 0 评论 -
java类加载为什么是双亲委派机制
一、类加载器java类加载机制主要包括:加载—>验证—>准备—>解析—>初始化—>使用—>卸载,而类加载器的作用主要发生在加载阶段。加载阶段,类加载器主要做了但不限于如下三件事:1、通过一个类的全限定名获取这个类的二进制字节流。2、将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。3、在内存中生成一个代表这个类的Class对象,作为方法区这个类的各种数据的访问入口。因为每一个类加载器,都拥有一个独立的类名称空间,所以一个类的唯一性由加载原创 2021-08-30 21:14:03 · 895 阅读 · 0 评论 -
java单例模式-指令重排陷阱
一、案例public class SingletonTest { private static SingletonTest SingletonTest; private SingletonTest() { } public static SingletonTest getInstance() { if (SingletonTest == null) { SingletonTest = new SingletonTest(); } retu原创 2021-08-29 17:38:07 · 450 阅读 · 0 评论 -
并发编程JUC系列AQS(CountDownLatch、CyclicBarrier、Semaphore)
一、CountDownLatchpackage com.jonychen.test;import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * 并发编程java.util.concurrent(JUC) * AQS(AbstractQueuedSynchronizer) */publ转载 2021-08-29 17:27:44 · 117 阅读 · 0 评论 -
springboot 自动装配原理
最近看各种文章的时候看到了springboot自动装配实现原理。用自己的话简单概括下。首先打开一个基本的springboot项目,点进去@SpringBootApplication注解@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Inherited@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan(excludeFi原创 2021-08-28 20:26:05 · 164 阅读 · 0 评论 -
java处理日期和时间
一、DateDate对象的主要方法toString() 把Date对象变成字符串 getTime()把Date对象转换成时间戳 @Test public void dateTest(){ /** * toString() 把Date对象变成字符串 getTime()把Date对象转换成时间戳 */ Date now = new Date(); System.out.println(now); System.out.println(now.toStrin原创 2021-08-26 20:38:57 · 98 阅读 · 0 评论 -
解决更新mysql和postgresql的sql字符串内含单引号的问题
一、sql案例UPDATE t_user_info set address = '上海浦东张江'浦东软件园'樟盛苑' where id = 14;二、解决方案单引号的内容用两个单引号可以解决这个问题UPDATE t_user_info set address = '上海浦东张江''浦东软件园''樟盛苑' where id = 14;...原创 2021-08-25 21:01:39 · 1054 阅读 · 1 评论 -
java Comparator实现排序
一、对象类package com.zhouzy.base.comparator;public class UserInfo{ private String name; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; }原创 2021-08-25 20:54:15 · 1055 阅读 · 0 评论 -
解决 enclosing instance of type XXX(你的类)(e.g. x.new A() wher x is an instance of XXX(你的类)).
一、原因出现上面错误的原因是,类UserInfo在ComparatorTest2中public class ComparatorTest2 { public static void main(String[] args) { UserInfo u1 = new UserInfo(); } class UserInfo{ private String name; private int age; public String getName() { ret原创 2021-08-25 20:51:18 · 240 阅读 · 0 评论 -
java Bigdecimal的加减乘除运算及保留小数位
一、运算java.math.BigDecimal。BigDecimal一共有多种够造方法,让我先来看看其中的两种用法:第一种:BigDecimal(double val)第二种:BigDecimal(String val) //通常采用这种方式来看看BigDecimal的四则运算:BigDecimal的四则运算 加法 bigDecimal1.add(bigDecimal2) 减法 bigDecimal1.subtract(bigDecimal2) 乘法 bi.原创 2021-08-24 21:44:11 · 4535 阅读 · 1 评论 -
springboot 整合整合Swagger文档
一、简介spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口。这些接口不但会服务于传统的web端(b/s),也会服务于移动端。在实际开发过程中,这些接口还要提供给开发测试进行相关的白盒测试,那么势必存在如何在多人协作中共享和及时更新API开发接口文档的问题。假如你已经对传统的wiki文档共享方式所带来的弊端深恶痛绝,那么尝试一下Swagger2 方式,一定会让你有不一样的开发体验。使用 Swagger 集成文档具有.原创 2021-08-22 14:38:21 · 253 阅读 · 0 评论 -
SpringBoot 内部方法调用,事务不起作用的原因及解决办法
一、原因外部经过spring容器调用service的方法事务才生效,service类内部方法间相互调用事务不生效,也就是传说中的自调用失效问题。主要原因是Spring数据库事务的约定,其实现原理是AOP,而AOP的原理是动态代理,在自调用的过程中,是类自身的调用,而不是代理对象去调用,那么就不会产生AOP,这样 Spring就不能把你的代码织入到约定的流程中,于是就产生了现在看到的失败场景。二、场景 @Resource private UserInfoService userI.原创 2021-08-22 11:22:16 · 1025 阅读 · 0 评论 -
springboot 实现session共享(spring-sesion+nginx + redis)
一、Spring-Session使用的场景HttpSession是通过Servlet容器进行创建和管理的,在单机环境中。通过Http请求创建的Session信息是存储在Web服务器内存中,如Tomcat/Jetty。假如当用户通过浏览器访问应用服务器,session信息中保存了用户的登录信息,并且session信息没有过期失,效那么用户就一直处于登录状态,可以做一些登录状态的业务操作。但是现在很多的服务器都采用分布式集群的方式进行部署,一个Web应用,可能部署在几台不同的服务器上,通过LVS或者Ng原创 2021-08-21 15:42:59 · 332 阅读 · 0 评论 -
springboot 整合 redis布隆过滤器
一、什么是布隆过滤器布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。Bloom Filter(BF)是一种空间效率很高的随机数据结构,它利用位数组很简洁地表示一个集合,并能判断一个元素是否属于这个集合。它是一个判断元素是否存在集合的快速的概率算法。Bloom Filter有可能会出现错误判断,但不原创 2021-08-21 11:15:03 · 1421 阅读 · 2 评论 -
redis缓存穿透、击穿、雪崩的解决方案
一、缓存雪崩对于系统 A,假设每天高峰期每秒 5000 个请求,本来缓存在高峰期可以扛住每秒 4000 个请求,但是缓存机器意外发生了全盘宕机。缓存挂了,此时 1 秒 5000 个请求全部落数据库,数据库必然扛不住,它会报一下警,然后就挂了。此时,如果没有采用什么特别的方案来处理这个故障,DBA 很着急,重启数据库,但是数据库立马又被新的流量给打死了。这就是缓存雪崩。缓存雪崩的事前事中事后的解决方案如下:事前:redis 高可用,主从+哨兵,redis cluster,避免全盘崩溃。 事中:本原创 2021-08-19 20:17:16 · 504 阅读 · 0 评论 -
JVM调优实例记录
一、设置jvm参数$ java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=128m -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:SurvivorRatio=8 -XX:+UseConcMarkSweepGC newframe-1.0.0.jar二、查看线程cpu占用[root@localhost ~]# ps p 6515 -L -o pcpu,pid,tid,time,tname,cmd --s原创 2021-08-18 21:40:10 · 266 阅读 · 0 评论 -
mybatis批量插入数据的两种方法
一、在xml文件中拼sql的方法1、定义mapper接口 /** * 批量插入用户信息 * @param users */ void insertBatch(@Param("users") List<UserInfo> users);2、mybatis文件sql<insert id="insertBatch"> insert into t_user_info ( name原创 2021-08-17 20:43:12 · 408 阅读 · 0 评论 -
java并发编程-CAS算法
一、什么是 CAS一句话:比较并交换 == Compare and SwapCAS(Compare-And-Swap)是一种硬件对并发的支持,针对多处理器操作而设计的处理器中的一种特殊指令,用于管理对共享数据的并发访问。 CAS 是一种无锁的非阻塞算法的实现。 CAS 包含了3个操作数: 》 需要读写的内存值 V 》 进行比较的值 A(预估值) 》 拟写入的新值 B(更新值) 当且仅当V的值等于A时,CAS算法通过原子方式用新值B来更新V的值,否则不会执行任何操作。二、CAS 的底原创 2021-08-15 15:40:30 · 538 阅读 · 0 评论 -
java并发编程-线程池解析(非常详细)
在前面的文章中介绍过如何去创建一个线程,这个比较简单,那么会有个问题,如果创建的线程多了,会大大降低系统的效率,因为频繁创建线程和销毁线程需要时间那么如何让现有的线程复用呢?那就是通过线程池来达到这个效果!首先我们从最核心的ThreadPoolExecutor类中的方法讲起,然后再讲述它的实现原理,接着给出了它的使用示例,最后讨论了一下如何合理配置线程池的大小。一、ThreadPoolExecutor类ThreadPoolExecutor是java.uitl.concurrent(简称JUC原创 2021-08-15 11:51:02 · 335 阅读 · 0 评论 -
java-AQS简介
一、什么是AQSAQS,在java.util.concurrent.locks包中,AbstractQueuedSynchronizer这个类是并发包中的核心,了解其他类之前,需要先弄清楚AQS。AQS就是一个同步器,要做的事情就相当于一个锁,所以就会有两个动作:一个是获取,一个是释放。获取释放的时候该有一个东西来记住他是被用还是没被用,这个东西就是一个状态。如果锁被获取了,也就是被用了,还有很多其他的要来获取锁,总不能给全部拒绝了,这时候就需要他们排队,这里就需要一个队列。AQS的核心思想是:原创 2021-08-14 16:36:13 · 12187 阅读 · 4 评论 -
java基础-RSA签名验签
一、介绍RSA加密是一种非对称加密。可以在不直接传递密钥的情况下,完成解密。这能够确保信息的安全性,避免了直接传递密钥所造成的被破解的风险。是由一对密钥来进行加解密的过程,分别称为公钥和私钥。两者之间有数学相关,该加密算法的原理就是对一极大整数做因数分解的困难性来保证安全性。通常个人保存私钥,公钥是公开的(可能同时多人持有)。二、RSA加密、签名区别 加密和签名都是为了安全性考虑,但略有不同。常有人问加密和签名是用私钥还是公钥?其实都是对加密和签名的作用有所混淆。简单的说,加密是为了防止信息被泄原创 2021-08-13 21:48:09 · 4670 阅读 · 1 评论 -
解析HashSet的原理
一、原理HashSet实际上是一个HashMap实例,都是一个存放链表的数组。它不保证存储元素的迭代顺序;此类允许使用null元素。HashSet中不允许有重复元素,这是因为HashSet是基于HashMap实现的,HashSet中的元素都存放在HashMap的key上面,而value中的值都是统一的一个固定对象private static final Object PRESENT = new Object();HashSet中add方法调用的是底层HashMap中的put()方法,而如果是在Has原创 2021-08-12 21:55:19 · 604 阅读 · 0 评论 -
java-了解下TreeMap的相关知识
一、TreeMap剖析1、特点TreeMap实现了NavigableMap接口,而NavigableMap接口继承着SortedMap接口,致使我们的TreeMap是有序的! TreeMap底层是红黑树,它方法的时间复杂度都不会太高:log(n) 非同步 使用Comparator或者Comparable来比较key是否相等与排序的问题2、注意点由于底层是红黑树,那么时间复杂度可以保证为log(n) key不能为null,为null为抛出NullPointException的 想要自.原创 2021-08-10 22:11:33 · 245 阅读 · 1 评论 -
HashMap底层实现原理
一、简介HashMap基于Map接口实现,元素以键值对的方式存储,并且允许使用null建和null值,因为key不允许重复,因此只能有一个键为null,另外HashMap不能保证放入元素的顺序,它是无序的,和放入的顺序并不能相同。HashMap是线程不安全的。二、数据结构jdk1.7底层实现是 数组+链表jdk1.8底层实现是 数组+链表+红黑树现在大部分都适用jdk1.8及以上版本了,所以就以1.8版本记录一下结构图:三、源码1、节点源码 // Node&.转载 2021-08-09 21:28:57 · 320 阅读 · 0 评论 -
java入门-第一个ssm框架(含layui)
源码地址:https://codechina.csdn.net/wwwzhouzy/zhouzyssm一、简介1、什么是ssmssm就是spring+springmvc+mybatis2、spring mvc原理先来个图:我们再来看看SpringMVC的流程吧1、 用户发送请求至前端控制器DispatcherServlet。2、 DispatcherServlet收到请求调用HandlerMapping处理器映射器。3、 处理器映射器找到具体的处理器,生成处理器对象及原创 2021-08-03 22:21:18 · 340 阅读 · 0 评论 -
netty解决拆包粘包的三种方案
一、什么是粘包拆包举个例子客户端和服务器建立一个连接,客户端发送一条消息,客户端关闭与服务端的连接。客户端和服务器简历一个连接,客户端连续发送两条消息,客户端关闭与服务端的连接。对于第一种情况,服务端的处理流程可以是这样的:当客户端与服务端的连接建立成功之后,服务端不断读取客户端发送过来的数据,当客户端与服务端连接断开之后,服务端知道已经读完了一条消息,然后进行解码和后续处理...。对于第二种情况,如果按照上面相同的处理逻辑来处理,那就有问题了,我们来看看第二种情况下客户端发送的两条消息递交原创 2021-07-27 22:07:10 · 7355 阅读 · 1 评论 -
Spring mvc框架Junit测试(实现自己的Listener)
一、使用SpringJUnit4ClassRunner进行单元测试1、在测试类上加注解@RunWith(SpringJUnit4ClassRunner.class)2、加载所需要的配置文件 @ContextConfiguration(locations={"/spring-gateway-py.xml","classpath:spring-repository-context.xml"})3、事务配置@TransactionConfiguration(transaction转载 2021-07-25 12:18:02 · 676 阅读 · 0 评论