Java学习
文章平均质量分 53
一名普通的编程学生
热爱漫无边际 生活自有分寸
展开
-
ThreadLocal是什么?子线程能否获取到父线程ThreadLocal变量中的值?
ThreadLocal是什么?子线程能否获取到父线程ThreadLocal变量中的值?一、ThreadLocal简介二、数据结构三、过期key的数据清理方式四、子线程能否获取到父线程ThreadLocal变量中的值一、ThreadLocal简介 ThreadLocal 是一个本地线程副本变量工具类,在每个线程中都创建了一个 ThreadLocalMap 对象,简单说 ThreadLocal 就是一种以空间换时间的做法,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这原创 2021-09-07 23:42:36 · 1782 阅读 · 0 评论 -
synchronized与volatile的作用与区别
synchronized与volatile的作用与区别一、synchronized关键字二、volatile关键字三、区别一、synchronized关键字 synchronized是关键字,用synchronize修饰表示这个方法或代码块为同步的,在运行过程中会上同步锁。对于普通同步方法,锁是当前实例对象。对于静态同步方法,锁是当前类的Class对象。对于同步方法块,锁是Synchonized括号里配置的对象。synchronized 关键字的底层原理synchronized 同步原创 2021-09-05 21:47:44 · 395 阅读 · 0 评论 -
JVM中的垃圾收集算法
JVM中的垃圾收集算法 JVM在进行垃圾回收前会首先判断哪些对象需要被回收,判断对象是否存活有两种算法,如下:引用计数算法 基本思想是在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一;任何时刻计数器为零的对象就是不可能再被使用的。缺点: 很难解决对象之间相互循环引用的问题。可达性分析算法 这个算法的基本思路就是通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称原创 2021-09-04 16:43:25 · 115 阅读 · 1 评论 -
Java虚拟机中对象创建的流程
Java虚拟机中对象创建的流程 当我们new一个对象时,如:Person p = new Person();Java虚拟机会进行如下的操作。第一步:当Java虚拟机遇到一条字节码new指令时,首先将去检查这个指令的参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已被加载、解析和初始化过。如果没有,那必须先执行相应的类加载过程第二步:在类加载检查通过后,接下来虚拟机将为新生对象分配内存。如果Java堆中内存是绝对规整的就采用指针碰撞的方式分配,否则采用空闲列表的方式分配。原创 2021-09-03 20:59:15 · 227 阅读 · 0 评论 -
JVM内存模型
JVM内存模型Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域,如上图所示。虚拟机栈Java虚拟机栈是线程私有的,它的生命周期与线程相同。虚拟机栈描述的是Java方法执行的线程内存模型:每个方法被执行的时候,Java虚拟机都会同步创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、态连接、方法出口等信息。本地方法栈为虚拟机使用到的本地(Native)方法服务。程序计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在原创 2021-08-31 00:18:32 · 93 阅读 · 0 评论 -
leetcode岛屿的最大面积(深度优先搜索)
leetcode岛屿的最大面积(深度优先搜索)问题描述: 给定一个包含了一些 0 和 1 的非空二维数组 grid 。 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相邻。你可以假设 grid 的四个边缘都被 0(代表水)包围着。 找到给定的二维数组中最大的岛屿面积。(如果没有岛屿,则返回面积为 0 。)示例:[[0,0,1,0,0,0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1,1,1,0,0,0],原创 2021-08-19 00:21:27 · 249 阅读 · 0 评论 -
leetcode图像渲染(深度优先搜索)
leetcode图像渲染(深度优先搜索)问题描述: 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间。 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的颜色值 newColor,让你重新上色这幅图像。 为了完成上色工作,从初始坐标开始,记录初始坐标的上下左右四个方向上像素值与初始坐标相同的相连像素点,接着再记录这四个方向上符合条件的像素点与他们对应四个方向上像素值与初始坐标相同的相连像素点,……,重复该过程。将所有原创 2021-08-19 00:16:28 · 184 阅读 · 0 评论 -
leetcode字符串的排列(滑动窗口)
leetcode字符串的排列(滑动窗口)问题描述: 给你两个字符串 s1 和 s2 ,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,s1 的排列之一是 s2 的 子串 。示例:输入:s1 = “ab” s2 = “eidbaooo”输出:true解释:s2 包含 s1 的排列之一 (“ba”).代码:class Solution { public boolean checkInclusion(String s1, String s2) { int n原创 2021-08-18 00:31:55 · 168 阅读 · 0 评论 -
leetcode无重复字符的最长子串问题(滑动窗口)
leetcode无重复字符的最长子串问题(滑动窗口)问题描述: 给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例:输入: s = “abcabcbb”输出: 3解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。代码:class Solution { public int lengthOfLongestSubstring(String s) { if(s.length()==0) return 0; //原创 2021-08-18 00:20:35 · 166 阅读 · 0 评论 -
Java中的强引用、软引用、弱引用、虚引用
Java中的强引用、软引用、弱引用、虚引用一、强引用二、软引用三、弱引用四、虚引用 在JDK 1.2版之后,Java对引用的概念进行了扩充,将引用分为强引用(Strongly Re-ference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)4种,这4种引用强度依次逐渐减弱。一、强引用 强引用是最传统的引用,类似Object object = new Object();这种引用关系。只要强引用关系还存在,垃圾收集器(原创 2021-08-15 22:53:47 · 803 阅读 · 0 评论 -
Java中的反射和代理
Java中的反射和代理一、反射1、概念2、反射的使用二、代理1、概念2、静态代理实现示例3、JDK动态代理实现示例3、CGLib动态代理实现示例一、反射1、概念 能够分析类能力的程序称为反射。就是在运行状态中,对任意一个类,能知道这个类的所有方法和属性,对于任意一个对象来说,都能调用他的任意一个方法和属性。这就是Java语言的反射机制,主要就是增加程序的灵活性。2、反射的使用 (1)反射获取类信息的三种方式// 方式一: 类名.classClass c1 = Person.class;/原创 2021-08-14 01:32:27 · 534 阅读 · 0 评论 -
Java中方法的参数传递
Java中方法的参数传递一、示例1、构建Person类2、编写demo测试类二、分析1、执行结果 在Java中,所有的参数传递方式都是值传递。下面通过例子来简单的说明一下。一、示例1、构建Person类public class Person { private String name; private Integer age; public String getName() { return name; } public void set原创 2021-08-12 22:37:26 · 421 阅读 · 0 评论 -
mybatis中的#占位符和$拼接符的区别
mybatis中的#占位符和$拼接符的区别一、sql注入1、什么是sql注入2、sql注入示例二、#占位符和$拼接符的区别三、mybatis如何防止sql注入四、总结 为更好地解释mybatis中的#占位符和$拼接符的区别,这里对sql注入做一个简单说明。一、sql注入1、什么是sql注入 SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编写时的疏忽,通过SQL语句,实现无账号登录,甚至篡改数据库。2、sql注入示例 首先定义一个sql字符串,来原创 2021-08-10 23:11:50 · 892 阅读 · 0 评论 -
前后端分离项目的跨域问题及解决办法
前后端分离项目的跨域问题及解决办法一、跨域简述1、问题描述2、什么是跨域3、出现跨域问题的原因二、解决办法1、第一种解决办法:后端配置跨域(spring boot设置方式)2、第二种解决办法:前端配置代理(vue项目)一、跨域简述1、问题描述 这里前端vue项目的端口号为9000,后端springboot项目的端口号为80802、什么是跨域 当一个请求url的协议、域名、端口三者之间任意一个与当前页面url不同即为跨域当前页面url被请求页面url是否跨域原因htt原创 2021-08-10 12:36:12 · 11566 阅读 · 1 评论 -
80端口被pid=4占用究极解决方案
80端口被pid=4占用究极解决方案一、一般情况二、特殊情况一、一般情况1、Win+R键输入cmd打开命令提示符,输入netstat -a -n -o发现80端口被pid=4的进程占用2、再Win+R键输入regedit打开注册表,按照下图找到HTTP下的start3、将start的值改为0,重启电脑生效二、特殊情况如果前面的方法用过后,重启计算机仍显示80端口被占用,请用下面这个究极解决办法1、Win+R键输入cmd打开命令提示符,输入netsh http show services原创 2021-08-09 18:33:54 · 3535 阅读 · 0 评论 -
@Autowire、@Resource、@Qualifier的区别
@Autowire、@Resource、@Qualifier的区别一、简单说明@Autowire@Resource@Qualifier二、场景示例1、场景一(接口只有一个实现类)2、场景二(接口有多个实现类)一、简单说明这三个注解的作用都是用来注入依赖对象@Autowire@Autowired 接口只能有一个实现类,通过byType方式注入默认情况下必须要求依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,如:@Autowired(required=false原创 2021-08-09 17:18:35 · 989 阅读 · 0 评论 -
spring boot项目集成redis
spring boot项目集成redis一、Maven依赖1、本项目springboot的版本2、redis相关依赖二、配置application.yml三、编写redis配置类1、首先看springboot的源码,提供了一个redis配置类2、编写RedisTemplate配置类四、编写redis工具类一、Maven依赖1、本项目springboot的版本<parent> <groupId>org.springframework.boot</groupId>原创 2021-08-08 21:00:04 · 257 阅读 · 0 评论 -
spring boot项目实现excel的导入导出
spring boot项目实现excel的导入导出一、添加依赖二、导出excel1、编写实体类,添加注解2、编写Controller三、导入excel编写Controller四、@Excel注解的属性本文采用的是EasyPOI操作Excel一、添加依赖<dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId&g原创 2021-08-08 09:50:53 · 715 阅读 · 2 评论 -
A bean with that name has already been defined in class path resource(bean名字重复报错解决)
A bean with that name has already been defined in class path resource(bean名字重复报错解决)报错信息The bean 'jsonCustomizer', defined in class path resource [com/study/learn/test/config/WebMvcConfig.class], could not be registered. A bean with that name has alread原创 2021-08-07 23:47:27 · 9572 阅读 · 0 评论 -
在后台将前台传来的string类型的json字符串转换为对象类型的数据
在后台将前台传来的string类型的json字符串转换为对象类型的数据示例:示例:@RequestMapping("/updateBatchUsers") @ResponseBody public Msg updateBatchUsers(String userList) { log.info("updateBatchUsers入参 {}",userList); //将字符串转换成json对象 JSONArray jsonArray = J原创 2021-07-13 23:15:14 · 1010 阅读 · 0 评论 -
spring boot项目时间类型转换全局配置(localDate和localDateTime)
spring boot项目时间类型转换全局配置(localDate和localDateTime)使用全局时间参数配置可以省去在每个时间字段上加上@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")或@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")注解全局时间参数入参转换类/** * @description 自定义时间参数入参转换类 * @author zzy * @da原创 2021-07-13 22:59:37 · 2457 阅读 · 0 评论 -
mybatis插入数据主键回填
mybatis插入数据主键回填在项目中,集成mybatis进行数据库操作,往往在插入数据时并不输入id值,那么,我们如何不经过查询就得到刚刚插入数据的id值呢?在xml中写sql语句时有这样一条属性:主键回填useGeneratedKeys="true" keyProperty="id",下面请看示例:<insert id="insertOne" parameterType="com.test.easy.demo.entity.Student" useGeneratedKeys="true"原创 2021-07-13 21:51:47 · 578 阅读 · 0 评论 -
将spring boot项目打成war包部署到服务器
将spring boot项目部署到服务器一、在idea中将spring boot项目打包默认打jar包,需要配置pom.xml文件来更改打包类型<!--修改默认打包类型,为:war包--> <packaging>war</packaging>修改启动类@SpringBootApplicationpublic class DemoApplication extends SpringBootServletInitializer { pu原创 2021-07-13 21:18:12 · 719 阅读 · 0 评论 -
实现layui中每次切换页面时刷新页面(tab页面)
实现layui中每次切换页面时刷新页面(tab页面)在html中找到tabChange方法,加上下面这部分代码即可实现每次切换tab页面时刷新页面(重新载入)tabChange: function (id) { //切换到指定Tab项 element.tabChange('demo', id); //根据传入的id传入到指定的tab项 //每次切换tab页面时刷新页面 var othis = $('.layui-tab-title').find('>li[lay-id="' + id原创 2021-07-08 15:14:40 · 4865 阅读 · 0 评论 -
mysql中插入数据时设置id重新从1开始自增
mysql中插入数据时设置id重新从1开始自增很多时候我们会在测试数据库的增删改查时,会增删数据,导致id变得不连续,想要id重新从1开始生成。首先删除该表中的所有数据新建查询,执行如下的sql语句,再插入数据时id就会从1开始了ALTER TABLE 表名 AUTO_INCREMENT = 1;...原创 2021-07-08 11:40:05 · 2484 阅读 · 1 评论 -
调用mybatis plus中的方法在数据库中插入一条数据时自动生成id规则的配置
调用mybatis plus中的方法在数据库中插入一条数据时自动生成id策略的配置在application.yml配置文件中配置,可以看到有多种id生成规则各种类型的解释id-typedescriptionauto数据库自增;注意:数据库中也要设置自增;assign_id该策略会使用雪花算法自动生成主键id,主键类型为Long或字符串;该策略使用接口IdentifierGenerator的方法nextId(以实现类为DefaultIdentifierGenerato原创 2021-07-08 11:20:10 · 1487 阅读 · 1 评论 -
spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天
spring boot 项目 前台向后台传递时间参数,插入到数据库中时间会少一天分析:解决办法分析:经过测试,时间从前台传到后台数据是一样的,说明是后台向数据库传递过程中出现了问题解决办法在自己的application.yml文件中将数据库配置中的时区更改为serverTimezone=GMT%2B8,也就是GMT+8时区url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=UTF-8&ser原创 2021-07-08 09:24:55 · 905 阅读 · 0 评论 -
spring boot的学习(1.创建一个初始的spring boot项目)
spring boot的学习(1.创建一个初始的spring boot项目)创建spring boot项目创建spring boot项目打开idea,选择新建项目在左侧选择Spring Initializr,右侧选择sdk版本,我这边选的时1.8,然后点击下一步上面的名字自己取即可,下面选择Java版本(因为我是8版本,所以我选的8)然后继续下一步左侧可以选择要引入的依赖,右侧是spring boot的版本,这里就我就不添加依赖了,为了更好的理解,一会儿手动添加依赖。继续下一步原创 2021-06-21 10:08:16 · 207 阅读 · 0 评论 -
编写类实现从后台向前台返回所要求的数据
编写类实现从后台向前台返回所要求的数据在实际的项目中,前台会要求后台传送各种各样的类型的数据。这里以从后台向前台返回下面这种格式的数据为例进行简单说明。 [{\"status\":0}, {\"message\": \"成功\" }, {\"count\": 1000},{\"data\": {}}]按要返回数据的格式编写类public class Result { /** * "[{\"status\":0}, {\"message\": \"成功\" }, {\"coun原创 2021-06-13 23:48:17 · 302 阅读 · 0 评论 -
在spring boot项目中修改包名要注意的一些问题
在spring boot项目中修改包名要注意的一些问题在修改包名时要连带修改一下几个配置,保证下面的地方引用的包名一致修改包名如果在这里修改了包名,idea会自动将大部分引用了该包名的地方进行修改,但还是有一些地方没有被修改。比如下面两个地方。application.yml修改type-aliases-package对应的包名,否则会出现找不到类的异常。如:Caused by: java.lang.ClassNotFoundException: Cannot find class:原创 2021-06-13 23:09:19 · 2639 阅读 · 1 评论 -
spring boot中thymeleaf配置说明
spring boot中thymeleaf配置说明原创 2021-06-13 22:52:25 · 1899 阅读 · 0 评论 -
简述128陷阱
简述128陷阱首先通过一个integer类型数据的例子来简单介绍一下128陷阱。public class Test { public static void main(String [] args) { Integer a = 127; Integer b = 127; if(a == b) { System.out.println("相等"); }else { System.out.println("不相等"); } }}结果是:相等public cla原创 2021-06-13 22:03:58 · 216 阅读 · 0 评论 -
简单实现一个数组、链表
数组、链表、冒泡排序数组链表(单链表)数组封装实现一个数组public class Array { private int[] arr = new int[12];//数组大小为12 private int flag = 0;//标志变量 public void add(int x) {//添加数据 arr[flag] = x; flag++; } public void show() {//遍历输出数组中的所有数据 for(int i = 0; i < flag; i原创 2021-06-10 20:39:05 · 208 阅读 · 0 评论 -
Git的基本操作
Git的基本操作状态模型仓库管理日志查看撤销和回退分支管理状态模型工作区(workplace)暂存区(index)本地仓库(local repository)远程仓库(remote repository)仓库管理工作区(workpace->暂存区(index)git add . #当前文件夹以及子文件夹git add fileName #某个文件暂存区(index)->本地仓库(local repository)git commit -m '备注提交内容原创 2021-06-07 20:59:58 · 90 阅读 · 0 评论 -
Java集合 ArrayList原理
Java集合 ArrayList原理ArrayList 类是一个可以动态修改的数组,与普通数组的区别就是它是没有固定大小的限制,我们可以添加或删除元素。ArrayList 继承了 AbstractList ,并实现了 List 接口。一、ArrayList 的定义定义一个ArrayList 数组//List<E> objectName = new ArrayList<>();List<String> list = new ArrayList<>原创 2021-06-07 17:19:36 · 101 阅读 · 0 评论 -
Java代码实现八大排序(冒泡、快排、选择、堆排、插入、希尔、归并、基数)
冒泡排序冒泡排序public class Test { public static void main(String[] args) { int[] arr = {34,32,12,2,45,65,77,36}; //调用方法 sort(arr); //遍历输出排序后的数组 for(int i : arr) { System.out.println(i); } } //冒泡排序方法 public static void sort(int[] x) { for(i原创 2021-05-14 15:32:02 · 200 阅读 · 0 评论