Java学习
文章平均质量分 53
记录java学习中的点点滴滴
路窑
这个作者很懒,什么都没留下…
展开
-
@DateTimeFormat不生效的解决方法(之一)
在做项目的时候需要将前端字符串类型的时间传递到后端,自动映射到Date类型的属性上:前端时间格式:后端时间类型:@DateTimeFormat(pattern="yyyy-MM-dd hh:mm:ss")//主要是限制前台的时间格式 @JsonFormat(pattern = "yyyy-MM-dd hh:mm:ss",timezone = "GMT+8")//主要是控制后台到前台的时间格式原创 2022-04-12 16:20:39 · 10815 阅读 · 2 评论 -
java String字符串拼接原理
java中的字符串的拼接可以分为下面三种情况: 1. 字符串常量与字符串常量的拼接String s1 = "a"+"b"+"c"; 2. 字符串常量与变量的拼接String s1 = "a";String s2 = s1+"b"; 3. 变量与变量的拼接String s1 = "a";String s2 = "b";String s4 = s1+s2;(1)常量与常量的拼接原理:原创 2021-09-14 12:32:27 · 7687 阅读 · 0 评论 -
redis持久化之RDB
为什么持久化? 由于 Redis 是一个内存数据库,所谓内存数据库,就是将数据库中的内容保存在内存中,这与传统的MySQL,Oracle等关系型数据库直接将内容保存到硬盘中相比,内存数据库的读写效率比传统数据库要快的多(内存的读写效率远远大于硬盘的读写效率)。但是数据保存在内存中也随之带来了一个缺点,一旦断电或者宕机,那么内存数据库中的数据将会全部丢失。 为了解决这个缺点,Redis提供了将内存数据持久化到硬盘,以及用持久化文件来恢复数据库数据的功能。Redis 支持两种形式的持久化,一种原创 2021-07-28 20:15:11 · 268 阅读 · 0 评论 -
SpringBoot启动类.java文件变为灰色无法启动、执行的解决策略
今天在查看springboot项目的时候发现自己的项目变成了这个样子:java文件变为了灰色,甚至启动类的启动标志都消失了首先想到的是右键我们的java文件夹标记为sources root目录可以看到文件恢复成为了正常的颜色,但是仍然在报错:无法识别注解等等错误彻底的解决方法(上述操作可以忽略):选择我们项目的pom文件,选中右键选择 Add as Maven Project 选项,将其作为Maven项目添加解决效果:java文件正常,启动类也有了启动按钮成功启动项目原创 2021-07-27 16:29:17 · 10448 阅读 · 14 评论 -
java线程池之四种拒绝策略
什么时候执行拒绝策略:1、ThreadPoolExecutor.AbortPolicy()默认的拒绝策略,当任务数大于线程池最大容量+阻塞队列时,丢弃任务并抛出RejectedExecutionException异常。2、ThreadPoolExecutor.DiscardPolicy丢弃任务,但是不抛出异常3、ThreadPoolExecutor.DiscardOldestPolicy()该策略下,抛弃进入队列最早的那个任务,然后尝试把这次拒绝的任务放入队列。丢弃队列最前面的任务,然原创 2021-07-19 20:13:05 · 333 阅读 · 0 评论 -
Java线程池之七大参数
在自定义线程池或者使用Executors创建线程池时,都会使用到ThreadPoolExecutor这个类的构造方法进行线程池的创建,而这个类的构造方法中就包含著名的七大参数(1)corePoolSize:核心池的大小。在创建了线程池后,默认情况下,线程池中并没有任何线程,而是等待有任务到来才创建线程去执行任务,除非调用了prestartAllCoreThreads()或者prestartCoreThread()方法,从这2个方法的名字就可以看出,是预创建线程的意思,即在没有任务到来之前就创建c原创 2021-07-19 16:46:52 · 353 阅读 · 0 评论 -
Java 线程通信中的if和while的理解与使用
多个线程之间的共享资源:Money多个线程使用Money这个资源结果分析:将逻辑判断if改为while循环,为if时,被阻塞的线程重新获得CPU的执行器执行时直接从阻塞的点向后执行;为while时,被阻塞的线程执行时同样也是直接从阻塞的点向后执行,但是它为while循环体,不会立刻跳出循环体,还是会先判断,若满足条件还是会执行while循环,然后被堵塞。说明:java的多线程执行默认是抢占式的,这也是为什么会出现输出线程名字(如:大儿子)而(大儿子线程)未执行消费操作,被二儿子线程抢占了CP原创 2021-07-17 12:09:43 · 348 阅读 · 2 评论 -
Java中HashMap默认的加载因子为什么是0.75
加载因子的作用:Hashmap的底层使用的是hash表进行数据的存储,随着表中的元素不断增加,当哈希表中的条目数超出了加载因子与当前容量的乘积时,则要对该哈希表进行扩容、rehash操作(即重建内部数据结构)。即加载因子是哈希表在其容量自动扩容之前可以达到多满的一种度量,其大小决定了HashMap的数据密度。加载因子为什么是为什么是0.75?首先明白什么是hash冲突:假设哈希表的地址集为[0,n),冲突是指由关键字得到的哈希地址为j(0<=j<=n-1)的位置上已经有记录。在关键字得到原创 2021-07-17 10:20:41 · 859 阅读 · 0 评论 -
Java 多线程同步中while(true)位置的理解
在学习多线程同步问题的时候,经常使用多窗口同时买票的例子进行理解学习当while(true)不在同步函数内部时:3个窗口交替卖票while(true)不在同步代码块中:当窗口一获取到CPU执行权后,进入while(true)语句,执行同步方法,然后执行sleep方法,进程堵塞,假设此时窗口3进程获取到CPU执行权,进入while(true)语句,执行ticket.sale()同步方法,但是由于未获取到同步锁(窗口一线程执行的是sleep方法,不会释放锁对象)只能进入堵塞状态,当窗口1自动苏醒后继续执原创 2021-07-16 12:04:14 · 2286 阅读 · 0 评论 -
Java通过反射获取注解以及注解中的信息
首先自定义两个注解:1、用于描述表名,只能用在类、接口、枚举上@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)public @interface TableName { String value();}2、用于描述列的信息,列名、数据类型、长度@Target(ElementType.FIELD)@Retention(RetentionPolicy.RUNTIME)public @interface Colum原创 2021-07-15 17:04:04 · 5677 阅读 · 0 评论 -
Java中获取Class对象的四种方法
什么是Class对象Class类位于java核心包lang包中,它是反射的源头。Class对象用于记录每个类的运行时数据结构,或者说是在内存中访问类的静态数据的接口,每个类都有一个唯一的Class对象。Class对象不能直接通过new来获取,因为其构造器是私有的,下面是Class类的源码:private Class(ClassLoader loader) { // Initialize final field for classLoader. The initialization va原创 2021-07-15 16:51:33 · 3732 阅读 · 0 评论 -
设计模式6大原则
设计模式的目的设计模式是为了让程序(软件),具有更好的:1)代码可重用性(即:相同功能的代码,不用多次编写)2)可读性(即:编程规范性,便于其他程序员的阅读和理解)3)可扩展性(即:当需要增加新的功能时,非常的方便,称为可维4)可靠性(即:当我们增加新的功能后,对原来的功能没有影响)5)使程序呈现高内聚,低耦合的特性(1)单一职责原则(Single Responsibility Principle)对类来说的,即一个类应该只负责一项职责。如类A负责两个不同职责:职责1,职责2。当职责1需求原创 2021-07-09 09:41:20 · 6072 阅读 · 1 评论 -
has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present on the requested
Access to XMLHttpRequest at ‘http://localhost:8080/pics/lb’ from origin ‘http://127.0.0.1:8020’ has been blocked by CORS policy: No ‘Access-Control-Allow-Origin’ header is present on the requested resource.在进行跨域请求时通常会报上述的错误。通过输出台报的错误可以看出:我们页面发出的请求因为同源策略原创 2021-07-02 20:39:01 · 2179 阅读 · 0 评论 -
Unknown character set: ‘utf8mb4‘
今天使用Mysql数据库运行SQL文件时遇到了这个错误:Unknown character set: ‘utf8mb4’错误原因:我的Mysql是5.0版本的,版本比较低,而这个sql文件是在5.7版本的数据库中转储的,但是 MySQL 原字符集为utf8,从5.5开始采用的是utf8mb4。导致在我的数据库中无法识别这个字符集解决方法:使用记事本打开sql文件找到:set names utf8mb4这一行将utf8mb4改为utf8即可成功运行sql文件:还是建议将mysql版本原创 2021-06-22 11:45:36 · 6894 阅读 · 0 评论 -
Java实现堆排序
算法介绍1)堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为O(nlogn),它也是不稳定排序。2)堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆,注意︰没有要求结点的左孩子的值和右孩子的值的大小关系。3)每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆4)一般升序采用大顶堆,降序采用小顶堆基本思想(升序排列)1)将待排序序列构造成一个大顶堆2)此时,整个序列的最大值就是堆顶的根节点。3)将其原创 2021-06-16 18:37:23 · 343 阅读 · 0 评论 -
Java实现基数排序(桶排序)
算法介绍1)基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sort)或bin sort,顾名思义,它是通过键值的各个位的值,将要排序的元素分配至某些“桶”中,达到排序的作用2)基数排序法是属于稳定性的排序,基数排序法的是效率高的稳定性排序法3)基数排序(Radix Sort)是桶排序的扩展4) 基数排序是1887年赫尔曼·何乐礼发明的。它是这样实现的:将整数按位数切割成不同的数字,然后按每个位数分别比较。5)基数排序是典型的原创 2021-06-15 16:54:41 · 3216 阅读 · 1 评论 -
Java实现归并排序
算法介绍 归并排序是稳定排序,它也是一种十分高效的排序,能利用完全二叉树特性的排序一般性能都不会太差。java中Arrays.sort()采用了一种名为TimSort的排序算法,就是归并排序的优化版本。从上文的图中可看出,每次合并操作的平均时间复杂度为O(n),而完全二叉树的深度为|log2n|。总的平均时间复杂度为O(nlogn)。而且,归并排序的最好,最坏,平均时间复杂度均为O(nlogn)。基本思想归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用经典的分治(divid原创 2021-06-15 16:21:00 · 2684 阅读 · 1 评论 -
Java实现快速排序
算法简介快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列基本思想1.先从数列中取出一个数作为基准数。2.分区过程,将比这个数大的数全放到它的右边,小于或等于它的数全放到它的左边。3.再对左右区间重复第二步,直到各区间只有一个数。代码是以中间值为基值进行快速排序: /**原创 2021-06-15 16:01:33 · 184 阅读 · 0 评论 -
Java实现希尔排序
算法简介希尔排序是希尔(Donald Shell)于1959年提出的一种排序算法。希尔排序也是一种插入排序,它是简单插入排序经过改进之后的一个更高效的版本,也称为缩小增量排序,同时该算法是冲破O(n2)的第一批算法之一。基本思想 希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止。 简单插入排序很循规蹈矩,不管数组分布是怎么样的,依然一步一步的对元素进行比较,移动,插入,比如[5,4,3原创 2021-06-15 15:34:24 · 187 阅读 · 0 评论 -
Java实现直接插入排序
排序思想插入排序(Insertion Sorting)的基本思想是:把n个待排序的元素看成为一个有序表(有序子数组)和一个无序表(无序子数组),开始时有序表中只包含一个元素,无序表中包含有n-1个元素,排序过程中每次从无序表中取出第一个元素,把它的排序码依次与有序表元素的排序码进行比较,将它插入到有序表中的适当位置,使之成为新的有序表。算法实现核心聚焦于找到要插入的位置以及怎样实现插入这个动作代码实现:public class InsertionSort { public static原创 2021-06-12 10:30:08 · 387 阅读 · 0 评论 -
Java实现简单选择排序
基本介绍选择式排序属于内部排序法(在内存中完成排序),是从待排序的数据中,按指定的规则选出某一元素(一般选择无序子数组的首元素),再依规定(从大到小还是从小到大)交换位置后达到排序的目的。排序思想第一次从arr[0]arr[n-1]中选取最小值,与arr[0]交换,第二次从arr[l]arr[n-1]中选取最小值,与 arr[1]交换,第三次从arr[2]–arr[n-1]中选取最小值,与arr[2]交换,…,第i次从arr[i-1]–arr[n-1]中选取最小值,与arrli-1]交换,…,第n-1原创 2021-06-12 10:02:06 · 184 阅读 · 0 评论 -
Java实现冒泡算法及优化冒泡算法
基本思想冒泡排序(Bubble Sort)通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序(前后大小与要求的顺序不一致)则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐向上冒。代码实现public class BubbleSort { /** * 按照从小到达的顺序进行排序 * @param array 要进行排序的数组 */ public static void bubbleSort(int[] ar原创 2021-06-12 09:38:51 · 2087 阅读 · 0 评论 -
Failed to import bean definitions from URL location [classpath:spring-dao.xml]
在整合SSM的适合遇到了上述的错误Caused by: org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [spring-dao.xml]; nested exception is com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceExc原创 2021-05-15 16:24:10 · 3194 阅读 · 4 评论 -
Linux系统通过RPM安装JDK
在Linux系统中安装程序常见的三种方式:(1)rpm(2)解压缩(3)yum在线安装JDK的安装本人使用的是第一种安装方式:rpm安装什么是rpmrpm(英文全拼:redhat package manager) RPM Package Manager (RPM) 是一个强大的命令行驱动的软件包管理工具,用来安装、卸载、校验、查询和更新 Linux 系统上的软件包。 原本是 Red Hat Linux 发行版专门用来管理 Linux 各项套件的程序,由于它遵循 GPL 规则且功能强大方便,因而广原创 2021-05-04 11:18:29 · 1133 阅读 · 1 评论 -
在IDEA中向纯java项目导入测试类jar包
在学java基础时我们要想测试一些结果,大多数情况下都是在main方法中进行。但一个类中只能有一个main方法,这样会浪费时间和空间。这时我们可利用单元测试进行结果的测试。public class TestD { public static void main(String[] args) { } @Test public void test(){ System.out.println("测试jar包导入"); } @Test p原创 2021-04-19 09:20:00 · 1081 阅读 · 0 评论