自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(100)
  • 收藏
  • 关注

原创 Java线程池

我们之前学习过的数据库连接池,在某种程度上和Java线程池是思路一致的。因为频繁的创建数据库的连接对象,又销毁,在时间上开销较大。数据库连接池、线程池 意思都是类似的;

2023-08-21 08:00:00 351 4

原创 ThreadLocal内存泄漏问题

ThreadLocal很好地解决了线程之间需要数据隔离的问题,同时也引入了另一个问题,在应用程序中通常会使用线程池来管理线程,那么线程的生命周期与应用程序的生命周期基本保持一致,如果线程的数量很多,随着程序的运行,时间的推移,ThreadLocal类型的变量会越来越多,将会占用非常大的内存空间,从而产生内存泄漏,如果这些对象一直不被释放的话,可能会导致内存溢出。从图中可以看出,ThreadLocal对象存在于堆中,有栈中的强引用指向它,也有ThreadLocalMap中的entry的弱引用键指向他。

2023-08-17 12:21:02 877 4

原创 ThreadLocal(超详细介绍!!)

我们每个线程都会存储ThreadLocal对象的备份,那么存储在哪里呢,答案就是在ThreadLocalMap中,ThreadLocalMap为 ThreadLocal的一个静态内部类,里面定义了Entry来保存数据,那么既然是map,就会有键值对的结构,键的位置存的就是我们的ThreadLocal对象,而值存储的就是通过set方法存入的那个值,例如这一句代码:local.set( i);那么存到这个线程中的ThreadLocalMap的一个entry中,键和值就分别是 local:i。

2023-08-15 20:10:18 1092 6

原创 Redis的数据结构(详解)

Redis是一个key-value的数据库,key一般是String类型,不过value的类型多种多样,以下的类型一般我们都指的是value的类型,键多是String,可能最多只会有什么层级结构;而value是多样的,比如value是set类型,那么存进去的就是多个set元素,相当于value就是一个set集合;再比如value类型是hash类型,就相当于与value中也进行键值对存储,而且可以有多对。

2023-08-13 18:29:20 456 5

原创 SQL与NoSQL概念(详细介绍!!)

SQL全称为Structured query language ,即结构化查询语言,可以把他理解为一门特殊的编程语言。那么nosql是什么意思呢?这里的no并不仅是not,而是not only的意思,所以nosql全称应该是Not Only Structured query language,即不仅仅是sql。

2023-08-03 10:52:43 4543 4

原创 Java集合数组相互转换

(1)集合a通过toArray()方法进行转换为数组,可以转换成为指定类型的数组,但是这些类型都必须是object类型的子类,基本类型不可以。必要时我们使用,转成我们需要的类型。(2)通过stream中的集合的toArray操作(终端操作)将流转化成数组。(4)使用遍历的方式将数据导入数组。

2023-08-02 21:55:03 769 2

原创 HashMap的扩容机制

类比于数组,数组一旦初始化后大小就无法改变了,所以就有了ArrayList这种动态数组,可以自动扩容。HashMap的底层用的也是数组。向HashMap里不停地添加元素,当数组无法装载更多元素时,就需要对数组进行扩容,以便装入更多的元素;除此之外,容量的提升也会相应地提高查询效率,因为“桶(坑)更多了嘛,原来需要通过链表存储的(查询的时候需要遍历),扩容后可能就有自己专属的“坑位了(直接就能查出来)即通过数组查询。

2023-07-31 08:00:00 458 2

原创 HashMap中hash方法的作用(详解)

在搞清楚原理之前,我们先站在巨人的肩膀浅浅了解一下hash方法的本质作用。实质上,它的作用很朴素,而且这个hash码我们后面要用来计算key存在底层数组的下标,所以它必须保持一定的随机性,让计算出的数组元素下标更加均衡分布,减少碰撞,其实就是更大程度上的避免hash冲突。注:保持随机性这一性质,只有在hash方法计算hash值这一步会有所体现,后面的取模运算只是单独的为了取到余数,与保证随机性没有关系。

2023-07-29 08:00:00 459 4

原创 Spring的控制翻转(IOC)与依赖注入(DI)

id: 生成的对象名class 全类名name: 对象别名,可以为多个,用空格或“,”或”;“隔开即可,但是我们还是建议使用idscope: 定义创建的bean有几个singleton(默认值):在 Spring 中只存在一个 bean 实例, 单例模式.

2023-07-14 12:00:00 100

原创 Spring框架概括

IOC:Inversion Of Control 反转控制/控制反转,以前我们使用java对象,在哪使用就在哪里new,IOC思想就是对所有我们需要使用的对象进行封装管理(创建,功能增强,销毁),在哪使用我们就在哪里注入,它是一个底层的框架,是一个设计型的框架,其他的spring实现都可以放在它上面运行,例如springboot、springclode等等。Spring是2003年兴起的,它是一个轻量级的,非侵入式的IOC和AOP的一站式框架,为简化企业级应用开发。轻量级:指的是核心jar包比较小的。

2023-06-26 12:15:00 182

原创 递归的浅浅应用

首先,这里是一道简单题目,浅浅地验证了我之前发过的这篇文章,我结合它来讲解一下这道题的思路:剑指 Offer 27 和 method 226.翻转二叉树给你一棵二叉树的根节点root,翻转这棵二叉树,并返回其根节点。

2023-06-23 12:00:00 210

原创 Java并发中的原子性、可见性和有序性

原子性(Atomic)就是不可分割的意思,是指在进行一系列操作的时候这些操作要么全部执行要么全部不执行,不存在只执行一部分的情况。可见性是指一个线程修改的共享变量的值可以被其他线程及时地看到。当一个线程修改了共享变量的值而其他线程还在使用这个值时,如果其他线程看到的仍然是修改之前的旧值,就会导致程序出错或者运行出现异常。有序性指的是程序按照代码的先后顺序执行

2023-06-22 12:00:00 321

原创 验证栈的压入、弹出序列

是对栈的出栈规则,即先进先出的一个考验,要求我们对它十分熟悉,同时需要换个角度思考,通过再创建一个栈,模拟出栈的流程来判断poped是否符合出栈规则

2023-06-21 11:30:00 66

原创 螺旋矩阵(顺时针遍历矩阵)

首先我们需要先定义四个变量,分别是上右下左,它们分别代表遍历的当前这个圈的上右下左四个边所处的位置,每遍历一次,就对应的缩小一个位置(这里可以实现左开右闭或者左闭右开),直到我们左和右相遇,或者上和下相遇,这是就意味着每个数已经遍历完成,就是终止条件。思路:既然是顺时针遍历一圈,那么我们就分别从上边,右边,下边,左边依次遍历,一圈完后在遍历下一圈,直到符合终止条件,停止循环,过程中将遍历到的值存入集合中,返回集合即可;1.保证边界的取值是正确的,不会出现数组越界。,返回矩阵中的所有元素。

2023-06-20 17:23:21 837

原创 JVM中方法区、永久代、元空间详解以及关系?

我们经常说的方法区只是java虚拟机规范的一个概念,就像是一个接口;那么接口总要有人实现吧,所以永久代和元空间就起着这样的作用,它们实际上都是方法区,是方法区在不同jdk版本的实现....

2023-06-12 17:37:34 2472 6

原创 写递归题目的思路

第一个问题,什么时候对数据进行操作?第二个问题,我们的递归函数中到底需要return什么?第三个问题,决定好终止条件的判断以及我们应该返回什么?

2023-06-03 17:59:05 588

原创 使用scope自定义element-ui中表格中数据的表示

scope就像是tableData的一个元素,对应的就是表格中的这一行数据,我们可以通过scope.元素名 的方式拿到数据,就可以用这个数据做完成想实现的功能,例如我上面的例子,通过scope拿到studentid,然后就可以通过这个id删除这个学生。这就意味着传来的数据是什么,我们就只能通过prop显示什么,而无法进行一些其他操作(当然正常的显示数据就是表格要实现的,但某些情况下我们会有一些特殊要求需要实现)首先先说一下为什么需要自定义表格中数据展现的方式?那么如何实现自定义呢?

2023-04-05 08:00:00 709 1

原创 Mysql事务详细介绍

本篇讲了事务是什么?详细介绍了事务的四种特性,以及四种特性如何实现?还有特性之一的隔离性中的隔离级别都有什么?几种隔离级别依靠什么原理实现?如MVCC和版本链

2023-03-13 12:00:00 639

原创 Mysql架构以及Mysql引擎

存储引擎是具体的操作数据的方式;这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平、并且最终提供广泛的不同的功能和能力,这些不同的技术以及配套的相关功能在MYSQL中被称作存储引擎。:支持事务,支持行级锁(一个事务对某一行数据操作时,只会锁定某一行数据,而不锁定其他行,效率高,支持高并发的操作)支持外键约束,支持缓存,支持全文索引,不会存储表中的总行数,创建表时默认是innodb;不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。

2023-03-11 12:00:00 325

原创 Mysql索引

对于少量的数据,查询 的速度会很快,但是,当随着数据量的增加,性能会急剧下降。Mysql 索引使用的是 B+树,因为索引是用来加快查询的,而 B+树通过对数据进行排序所以是可以提高查询速度的,然后通过一个节点中可以存储多个元素,从而可以使得 B+树的高度不会太高.并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等 SQL 语句。Mysql的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是了解聚簇索引和非聚簇索引的前提。

2023-03-09 12:00:00 332

原创 Mysql中的函数和触发器

当对表中的数据执行 INSERT、UPDATE 或 DELETE 操作时,如果对表上的这个特定操作定义了触发器,该触发器自动执行,这是不可撤销的。是一种特殊的存储过程,不需要用户直接调用,而是在对表增加,修改,删除,没有查询,操作之前或之后触发自动执行的存储过程。触发器是行级触发 FOR EACH ROW -- 行级触发 ,就是每操作表中的一行数据,就会调用一次触发器。old可以表示删除操作时你要删除的那一条数据,以及修改操作中修改前的数据;与存储过程不同,触发器不能被直接调用,也不能传递或接受参数。

2023-03-06 11:00:00 527

原创 mysql视图和存储过程

存储过程也就是将逻辑处理的过程是放在数据库中,而不放在java后端代码中,就类似于java语言中的方法,需要先定义,使用时调用。将一些逻辑处理的代码可以事先存储在数据库中,然后使用时直接调用即可。SELECT 语句所查询的表称为视图的基表,而查询的结果集称为虚拟表,视图本身并不存储具体的数据,视图的数据存在于视图的基表中,基本表数据发生了改变,视图的数据也会跟着改变,因为查询语句时不变的,使用视图时会将sql语句。存储过程事先需要创建好(包含逻辑),存储过程中可以传入参数。创建存储过程,完成一个逻辑实现。

2023-03-04 12:00:00 892

原创 Spring中Bean生命周期及循环依赖

controller、service 和 dao 层本身并不是线程安全的,只是如果只是调用里面的方法,而且多线程调用一个实例的方法,会在内存中复制变量,这是自己的线程的工作内存,是安全的。如果是纯粹的java语言,即不考虑spring,自己new对象时,是没有任何问题的,因为对象之间相互关联是很常见的事,我们直接将关联在内的对象初始化赋值为null,然后相互赋值即可,如下。即原型的 多例 是线程安全的,一个请求到来,创建一个对象,bean之间不存在Bean共享,自然不会出现线程安全问题。

2023-03-02 12:00:00 389

原创 Spring中常用注解

Spring中常用注解

2023-02-28 12:00:00 403

原创 spring中BeanFactory 和ApplicationContext

spring是轻量级的,指核心jar包时很小的;非侵入式的一站式框架(数据持久层,web层,核心aop),为了简化企业级开发。核心是IOC,AOPIOC:控制翻转 把创建对象交给spring框架管理(创建对象与使用对象分离),管理对象的生命周期。DI:依赖注入 创建对象后,把对象属性赋值,将关联的对象注入AOP:面向切面编程(对面向对象编程的一个补充,并不是所特有的),通过一个代理对象,在不修改原来代码的情况下,对目标类进行功能的增强;例如事务管理、日志等。

2023-02-26 18:00:00 397

原创 Java中ThreadLocal类详解

过程:先拿出调用set方法的线程,然后取出这个线程内部的副本变量,由ThreadLocalMap存储,如果不为空,说明之前已经加过值,通过ThreadLocalMap的set方法进行赋值,将原来的value换成新的即可。对象引用一般有五种状态:强引用(即对象是有引用指向的)、软引用、弱引用、虚引用、普通的失去引用的对象(与虚引用的区别是少了被回收时的系统通知)以这个类创建的变量,在多个线程都用到这个变量时,可以为每一个线程创建一个变量副本,使得多个线程之间这个变量相互隔离,不影响。

2023-02-17 12:00:00 531

原创 Java线程池

任务来了后,当核心线程池也满了,且队列满了后,但线程池还没满,此时就可以创建非核心线程执行任务,创建非核心线程;核心线程池,默认线程池创建之初,核心线程池数量是0,来一个任务创建一个线程,执行完后不销毁或者创建之初调用prestartAllCoreThreads()或者 prestartCoreThread()方法来创建线程。拒绝策略,核心线程池、阻塞队列、非核心线程池都已满,继续有任务来,我们需要采取的就是以下拒绝策略。线程和任务的关系:有任务来时,我们创建线程执行这个任务,即线程是用来执行任务的。

2023-02-15 12:00:00 287

原创 Java中的锁概述

底层实现也是通过AQS实现的,创建一个CountDownLatch对象后时构造方法中传入一个值,就是state的值,每当一个线程执行完毕,state就-1,直到所有线程都执行完,state等于0时,暂停的线程就可以回复工作了。当线程创建后,先判断state值,为0,没有线程使用,把state=1,执行完成后,将state=0,期间如果有其他的线程访问,state若等于1,将其他线程放入类中的队列中。:当锁状态为轻量级锁时,线程自旋达到一定的次数时,进入阻塞状态,锁状态升级为重量级,等待操作系统调度。

2023-02-13 12:00:00 416

原创 并发编程出现的问题以及解决方式

概念:即每次判断我的预期值A和内存中的值V是不是相同,如果不相同则说明该内存值已经被其他线程更新过了,因此需要拿到该最新值B作为预期值,重新判断。volatile修饰的内存变量添加内存屏障之外,还要通过缓存一致性协议(MESI)将数据写回到主内存,其他工作内存嗅探后把自己工作内存数据过期,重新从主内存读取最新的数据。在写入之前需要做一个判断,用预期值与主内存中的值进行比较,如果预期值与主内存中值一致,说明这个变量没有其他线程修改,则将更新后的值,写入到主内存;操作完写会主内存,有可能出现问题。

2023-02-12 12:00:00 406

原创 Java集合中的Map

当我们向hashMap集合中添加元素时,判断重复后(与hashSet去重方法一致,因为其底层也是用hashmap存储的),根据key值调用hash方法(并不是hashcode方法,它是hashMap类中的一个方法)计算出此key在数组中的位置,如果这个位置没有元素,则直接添加,若已经有了元素,此时会有三种情况,一是此位置存储的这个元素与新加的元素键相同,但值不相同,我们选择替换值;三是此位置的元素已经转为红黑树,底层以树的方式添加(注:二三种情况也会有一出现,具体也是要替换值,在底层都有实现)。

2023-02-11 17:00:00 586

原创 Java中的Set集合

Set不能存储重复元素,元素无序(指的是不按照添加的顺序,List集合是按照添加顺序存储的);hashSet源码底层是hashMap实现的,因为hashMap是双列的,其中键是不能重复的,而hashSet是单列集合,所以就将键单独运用,实现了我们的hashSet

2023-02-10 17:00:00 432

原创 Java并发编程概述

出现线程安全的问题,所以需要通过编程来控制解决让多个线程一次访问资源,解决线程安全问题,称为并发编程。变量数据存储在主内存中,线程在操作变量时,会将主内存中的数据复制一份到工作内存,在工作内存中操作完成后,在写回到主内存中。1.访问(读、写)某个共享变量的操作从其他线程来看,该操作要么已经执行要么尚未发生,即其他线程看不到当前操作中的中间结果。多个线程访问同一个资源。线程:是cpu执行的单位,进程可再分为线程,是程序处理的基本最小单位。进程:运行中的程序,被加载在内存中,是操作系统分配内存的基本单位。

2023-02-09 12:00:00 432

原创 Java中的List集合

什么是集合?为什么需要有集合?lis集合包括?

2023-02-08 17:00:00 1556

原创 JVM垃圾回收器

注:这些指令是为每个方法设置的,点击编程工具的Run选项的Edit Configurations,在其中的VM options中输入命令,应用后,我们再次运行此方法即可。2.多线程垃圾回收器:多线程垃圾回收器内部提供多个线程进行垃圾回收,在多 cpu 情况下大大提升垃圾回收效率,但同样也是会暂停其他用户线程。3.此时不再遍历黑色,而再次遍历灰色,灰色变为黑色,若灰色下面有关联的对象,则关联的对象变为灰色。白色:与黑色、灰色对象无关联的,垃圾收集算法不可达的对象,成为垃圾,被回收。

2023-02-08 12:00:00 316

原创 JVM垃圾回收

产生背景:复制算法的高效性是建立在存活对象少,垃圾对象多的前提,是十分适用于堆中的新生代的,但是老年区中大部分都是存活对象,如果一味地使用复制算法,由于存活对象很多,复制的成本也会很高。为了兼顾速率,空间开销,是否移动对象这三个指标,标记--压缩算法算的上是中规中矩,单缺点就是效率太慢,因为它相比较标记--清除算法,多了一步内存碎片的整理,这也使得它不会产生内存碎片。:从一些为根对象(GCRoots)的对象出发去查找搜索,与根对象直接或间接连接的对象就是存活对象,不与根对象引用链连接的对象就是垃圾对象,

2023-02-07 11:00:00 304

原创 Comparable接口与Comparator接口

Comparable是排序接口。若一个类实现了Comparable接口,就意味着该类支持排序。Comparator是比较接口,我们如果需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口),那么我们就可以建立一个“该类的比较器”来进行排序,这个“比较器”只需要实现Comparator接口即可。两种方式最终的目的是一致的,都是需要比较排序,但是实现的方式是不一样的,比如有些如TreeSet,TreeMap存储的类都需要实现Comparable接口,具体问题具体分析,选择适合的方式。

2023-02-06 20:17:56 122

原创 jvm运行时数据区

jvm运行时数据区,分为程序计数器(是线程私有的,记录每个线程运行到哪一行),本地方法栈(运行本地方法),java虚拟机栈(管理方法的调用和运行,每个线程都拥有一个虚拟机栈),堆(用来存储实例对象,是线程共享的),方法区(用来存储类的信息,是线程共享的)。

2023-02-06 17:00:00 346

原创 Java多线程相关问题

synchronized修饰方法时,并没有显式的让我们添加锁对象,在修饰非静态方法时,锁对象默认是this,所以不同的线程就有着不同的锁对象,锁对象不同,我们就无法实现同步。多线程是指程序中包含多个执行单位,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。锁对象可以是任何对象,但对于多个线程必须是同一个锁对象,可以用static修饰创建的这个锁对象就可以实现。(线程之间对共享资源的访问会相互影响,所以我们必须解决竞用共享资源的问题)

2023-02-05 12:00:00 396

原创 Java线程概述

在上面的三大件中,我们的程序文件就存储在硬盘中,当我们运行某个app(如qq程序),这时就由操作系统将qq进程调入内存中,当然一个进程会有多个线程,哪些线程需要进入cpu执行,也需要操作系统进行调度。这个类可以成为线程任务类,这个类并不能直接创建线程,而是通过Thread类的构造方法创建Thread类的对象,这个类只是用来在run方法中提供任务。创建好我们自定义的线程类后,我们就可以创建线程了,注意,多次方法的调用并不是多线程,只是一个线程的多个任务;实现runnable接口:这个类可以继承其他类。

2023-02-04 12:00:00 378

原创 JVM类加载

作用:负责从硬盘/网络中加载字节码信息,加载到内存中(运行时数据区的方法区中)使用IO读取字节码文件,转换并存储为每个类创建一个Class类的对象存储在方法区中(验证,准备,解析)对字节码文件格式进行验证,文件是否被污染对基本的语法格式进行验证为静态的变量进行内存分配value 在准备阶段后的初始值是 0,而不是 123.静态变量在编译期间就初始化将符号引用转为直接引用将字节码中的表现形式转为内存中表现(内存地址)类的初始化,为类中的定义的静态变量进行赋值。

2023-02-03 12:00:00 262

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除