自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2021-06-01.给CSDN博客搬个家!

新家地址:.idea | Blogs欢迎一起学习交流O(∩_∩)O哈哈

2021-06-01 08:48:26 356

原创 春招预备备(十)数据结构与算法刷题总结.上.持续更新

互联网的广大朋友们,国庆快乐!持续更新于个人博客网站:.idea | Blogs.欢迎访问数组 && 链表数组数组最突出的特点是有索引,不同于其他的数据结构,数组问题不必借助哈希表就能达到O(1)的访问时间复杂度。数组问题常用的套路无非就是遍历,双指针、三指针、从左往右、从右往左遍历。另外看数组是否有序,如果有序的话一般可以考虑结合分治算法来提高效率。下面结合一些代表性题目总结一些常规的思考方向:Demo 01:双指针技巧遍历demo 01数组/链表有序然后合并的问题,直接

2021-10-01 14:25:50 531 1

原创 春招预备备(二)JVM

目录Java程序的执行流程类加载机制Java类加载过程类加载器双亲委派模型双亲委派模型机制的破坏Java内存区域对象在HotSpot虚拟机中的创建、布局与定位Java垃圾回收(GC)GC对象的判定方法常见的垃圾收集算法垃圾收集器CMS收集器G1收集器内存分配策略细节补充System.gc()和Runtime.gc()会做什么事情finalize方法与finalization方法分布式垃圾收集(DGC)Java内存泄露方法区的垃圾回收同步更新于:.idea | BlogsJava程序的执行流程一段J

2021-06-04 19:15:56 247 1

原创 春招预备备(一)Java语言基础

该系列博客仅针对复习过程中的重难点和反复遗忘的地方做总结加强(知识点太多太多啦!)目录面向对象三大特征(重点:多态)自动装箱、拆箱短路运算equals()与hashCode()方法值传递与引用传递String字符串相关面向对象三大特征(重点:多态)自动装箱、拆箱短路运算equals()与hashCode()方法值传递与引用传递String字符串相关...

2021-05-24 12:57:25 211 1

原创 八大排序算法思想与代码实现

要求:掌握排序算法的基本思想和时空复杂度的计算,同时在理解的基础上能够熟练默写目录冒泡排序选择排序堆排序(做为选择排序算法的优化)归并排序插入排序希尔排序(底层排序算法基于插入排序)快速排序非比较排序——计数排序冒泡排序实现步骤:(以下描述均假设待排序数组长度为length,默认从小到大排序)从index = 1开始,与index前一个位置的元素比较大小,如果indexEle < (index - 1)Ele,就交换它们的值。不管indexEle是否小于(index - 1)Ele,判.

2021-04-16 22:28:56 140

原创 造轮子系列(四)手写HashMap的一个简单实现理解HashMap实现原理

该博客是根据小码哥编程《恋上数据结构与算法》及查看JDK HashMap源码所写,理解不当之处请路过滴大佬们斧正!通过手写HashMap部分源码实现我们将知道:哈希表原理是什么?哈希冲突如何解决?为了减少哈希冲突,HashMap中的哈希值如何计算?HashMap的底层数据结构HashMap内部的存取逻辑HashMap的扩容机制:装填因子是多少?扩容时是直接将元素复制过去吗?初始化桶数组大小是多少?为什么一定是2的幂次方?为什么要求自定义key对象时最好同时重写equals()与hashC.

2021-04-07 20:32:12 1484 14

原创 造轮子系列(三)模仿ArrayList、LinkedList的简单实现

ArrayList && LinkedList定义抽象接口Listpackage com.firework.collection.list;/** * @author .idea * @date 2021/4/2 */public interface List<E> { /** * 元素没有找到 */ int ELE_NOT_FOUND = -1; /** * 获取集合元素长度 * *

2021-04-04 10:01:40 150

原创 Java设计模式思想及其在源码中的应用实例(持续更新...)

目录一. 重点掌握单例模式工厂模式策略模式代理模式模板方法模式观察者模式装饰者模式适配器模式建造者模式责任链模式访问者模式二. 源码中的应用一. 重点掌握单例模式定义:保证一个类有且仅有一个实例,并提供一个访问它的全局访问点。实现:饿汉式:public class Singleton { private static Singleton instance = new Singleton(); //私有化构造器 private Singlet

2021-03-27 15:28:44 1201

原创 造轮子系列(二)自定义一个Java独占锁理解ReentrantLock锁原理

一.自定义MyLock锁ReentrantLock锁的同步控制基础来自于AbstractQueuedSynchronizer类(AQS)。通过维护state状态位来控制锁的占用情况。设计了一个FIFO特点的队列实现对尝试获取锁的线程的缓冲。创建condition条件变量完成对等待线程的阻塞与唤醒。首先创建一个继承自AbstractQueuedSynchronizer类的同步器类:package mylock;import java.util.concurrent.locks.Abstra

2021-03-08 11:57:21 282 4

原创 造轮子系列(一)自定义Java线程池的简单实现理解ThreadPoolExecutor

一.概述“池化”思想的设计减少了线程创建与销毁的资源损耗,提高了任务的响应速度,同时还可以提供一些额外的功能,例如定制线程池和阻塞队列都已满时的拒绝策略。ThreadPoolExecutor做为Java线程池的核心实现类,继承关系如下:顶层接口Executor提供了将任务提交与任务执行解耦的思想,下面的接口与实现类在此基础上进行完善,提供线程池自身状态的维护和线程与任务的管理。二.基本设计思想Java线程池运用生产者消费者的设计模式,设计用于缓存任务的阻塞队列。用户发起任务提交,如果在核心线程池

2021-03-06 14:33:09 211 1

原创 对黑马视频synchronized原理进阶与优化实验结果的一点疑惑与解释

前置理解:Java对象头中Mark Word组成轻量级锁、CAS(Compare and Swap)偏向锁(锁重入下轻量级锁对CAS的优化)重量级锁(锁膨胀下轻量级锁的选择)代码: /** * @author 24208 */public class Main01 { static Thread t1, t2, t3; public static void main(String[] args) throws InterruptedException {

2021-02-16 20:02:16 201

原创 从面向对象设计思想出发理解Spring AOP编程

关于面向切面编程(AOP)的理解网上已经有很多博客了,但是…emm。自己也看了很多相关博客,也理解了很久,最后终于在一个巨佬前辈处给搞明白了!都说AOP是OOP(面向对象)的继承与延续,我觉得理解AOP还是得从OOP出发,经历从暴露问题到解决问题的过程。目录一. 面向对象设计思想(OOP)(1)概述(2)OOP编程存在的问题二. 面向切面编程(AOP)(1)问题的解决——AOP1. 横向抽取,何为横向?2. AOP与OOP的关系是怎样的?(2)Spring AOP 相关术语的理解(3)Spring .

2021-01-27 13:46:17 259 1

原创 Java虚拟机执行子系统(class文件结构与字节码指令、类加载机制、执行引擎)

目录一.Class文件结构(1)概述(2)Class文件的首八字节(3)常量池一.Class文件结构(1)概述Java虚拟机从严格意义上讲不应该只叫做Java虚拟机。虚拟机不关心是用什么语言生成的class文件,它只关心class文件本身,即语言无关性。而实现语言无关性的基础是虚拟机和字节码存储格式。一个Java对全世界做出的霸气承诺:“Write once,Run anywhere!”class文件是一组以8个字节为基础单位的二进制流,无添加任何分隔符,因此class文件中存储的数据几乎全

2021-01-22 14:40:11 1840 5

原创 Java虚拟机自动内存管理机制——理论篇

目录一.内存区域的划分(1)运行时数据区一.内存区域的划分(1)运行时数据区JVM在执行的时候会将自己所管理的内存区域划分为不同的区域,这些内存区域有着各自的用途和生命周期。注意:下面给出的内存模型只是java虚拟机规范给出的概念模型,具体的如何实现将由具体的虚拟机完成。1.程序计数器程序计数器又叫做PC寄存器,这是在...

2020-12-10 18:35:30 208

原创 leetcode刷题总结系列(一)动态规划

一.知识储备正如前面一篇博客所提到的那样,首先我们应知道什么是动态规划?动态规划问题的本质是什么?实际上,dp问题的本质仍然在于穷举,通过遍历和状态转移方程由底向上求出问题的最优解。一般来说,dp问题有着三个最核心的要素:重叠子问题、最优子结构和状态转移方程。只要满足这三个特征的问题基本上都可以归结为dp动态规划问题。在实际的题目当中,动态规划一般用来求解最值,做题步骤可分为三到四步:1.特殊情况下的考虑。比如考虑是否为空等,这种情况一般是直接返回结果。2.确定dp数组所代表的含义和大小,创建

2020-10-18 21:01:17 2898 6

原创 C语言二维数组中的指针问题

以一个二维数组a[3][2]为例简单介绍二维数组中关于指j针的问题一.基本含义1.a[3][2]表示的一个三行二列的二维数组,a[0]、a[1]、a[2]分别代表第零行、第一行、第二行首元素的地址。2.数组名a本质上是一个指向一维数组的指针(数组指针),在本例中指向a数组的第零行。注意:数组名a代表的含义也等价于&a[0]二.&a[0]和a[0]的区别:两者所代表的地址值都是相同的,但是它们的类型和含义是不同的。&a[0]和a[0]都指向a数组的第零行第零列元素的首.

2020-10-07 19:41:25 767 3

原创 引入虚拟内存的实际内存管理及其实现基础

在前一段时间分别学习了面向开发人员的分段载入思想和面向内存的分页思想。在计算机实际的内存管理中,往往是两者兼具,联系它们之间的桥梁就是虚拟内存,而虚拟内存的实现离不开内存的换入换出。因此,以虚拟内存为桥梁,同时实现程序分段和内存分页思想便构成了操作系统的内存管理图像。一.段页结合的内存管理机制在实际的操作系统中,用户将程序分段载入虚拟内存,系统将代码中的逻辑地址映射成虚拟地址(32位机中虚拟内存大小为2^32=4G),再将虚拟地址进行分割,查询相应页表,映射到实际的物理地址。二.内存换入在实际.

2020-09-02 10:02:42 211

原创 程序的分段载入与内存分页

目录一.重定位载入内存二.程序的分段载入三.内存分页管理机制(1)内存可变分区的局限性(2)内存分页管理(3)分页管理策略的问题与折衷处理办法一.重定位载入内存我们知道,程序代码中所指向的地址是以0为基址的相对地址,也叫做逻辑地址。而在程序运行过程中我们需要将程序的逻辑地址指向实际的物理地址,即需要对逻辑地址进行重定位。按照进行重定位时刻的不同可分为编译时重定位、载入时重定位和执行时重定位三种。编译时重定位程序只能放在内存的固定位置,载入时重定位一旦将程序载入内存就不能再二次移动了,这在日常使用的PC

2020-08-26 18:35:13 559

原创 死锁的产生与处理

目录一.死锁的概念二.死锁产生的必要条件(1)互斥条件(2)不可抢占条件(3)请求保持条件(4)环路条件三.死锁处理(1)死锁预防(2)死锁避免(3)死锁检测与恢复(4)死锁忽略一.死锁的概念在生产者-消费者模型中可能出现的问题:在该模型中,我们设置了两组信号量,一组用来表示可调用资源的个数,另一组用来保证进程互斥。如果我们将互斥信号量mutex和资源信号量empty,full按照图示顺序编写,就可能导致死锁的产生。我们不妨设当前资源信号量为0,那么我就说执行生产者进程时,mutex变为0,emp

2020-08-24 12:25:58 603

原创 进程同步与信号量

目录一.信号量的定义与简单应用(1)什么是信号量(2)信号量解决生产者-消费者问题一.信号量的定义与简单应用(1)什么是信号量信号量是用来记录可用资源或等待线程数目的一种特殊的整形变量。通过对信号量的修改,使得各个进程得以有序推进,完成进程同步。信号量的代码定义:struct semaphore { int value;//记录资源个数 PCB *queue; //记录等待线程}两种基本操作:/*当进程申请消费资源时执行P函数。首先将资源数目value减一,然后判断value是

2020-08-22 19:14:42 478 3

原创 CPU调度(进程调度)策略

目录一.引言一.引言

2020-08-20 10:58:35 1353

原创 操作系统接口的定义与实现

一.什么是操作系统接口做为计算机的使用者,一般情况下我们有三种方式来操作计算机:1.命令行:即通过命令程序,linux系统中常用此种方式2.图形化界面:通过鼠标点击等操作实现对计算机的操控。windows系统在这方面做的就非常优秀。这种方式通过消息框架程序和消息处理程序实现3.应用程序不管采用何种方式,我们都需要让操作系统和应用程序之间建立联系。如何建立连接?这就要用到操作系统接口。操作系统接口就是由C语言代码和由操作系统提供的一些重要函数组成。操作系统接口又叫做系统调用。我们通过系统调用就

2020-08-19 10:15:09 2213

原创 计算机操作系统的启动过程

目录一.引导扇区之前二.bootsect.s三.setup.s(1)获取操作系统启动前所需要的信息(2)完成实模式向保护模式的过渡四.system模块一.引导扇区之前以x86 PC(32位系统)为例:实模式(16位模式):对应于保护模式,实模式下的寻址方式与保护模式不同,保护模式的最大寻址能力是4G,同时16位汇编指令和32位汇编指令也不相同。计算机是通过取指执行这样的过程来进行一步步操作的。即不断通过读取内存指令来不断确定下一步所要执行的事件。计算机开机之后,CPU默认进入实模式,CS:IP指

2020-08-17 20:25:42 897

原创 8086CPU对指令的执行过程

一.两个基础(1)CPU是怎样获得内存地址的8086CPU的地址总线宽度是20,但数据总线宽度是16(即意味着算术逻辑运算单元的大小是16位)。在这里就出现了问题,CPU的最大寻址能力(1MB)并不能得到充分的发挥。为了解决这个问题,8086CPU采用段地址 * 16 + 偏移地址的方式,将两个16位地址传入地址加法器,确定最终的物理地址。我们将段地址和偏移地址都用十六进制表示,段地址乘以16即相当于16进制数向左移动一位,末尾补0。然后再加上偏移地址,得出十六进制表示的20位数据。(2)CPU是

2020-08-04 08:00:47 3046 1

原创 十六进制与二进制之间的快速转换

生活中我们常常采用的是十进制,但计算机却习惯于二进制数。为了避免面对繁杂的01串,展现给程序猿操作的常常是十六进制数。一.十进制数与十六进制、二进制数的快速转换常见的进制转换方法是除二取余法,从下往上取余数。这里记录另外一种快速实现进制转换的方法:以十进制转二进制为例,例如80转二进制:80可以分为64+16,那么二进制数轴上64和16上面是1,其余位补0计算器验证:再以70为例:同样的,十进制转十六进制也是一样的道理。二.十六进制与二进制之间的快速转换十六进制与二进制之间存在特.

2020-08-02 12:39:37 7196 1

原创 并发工具类的使用

目录一.CountDownLatch(1)概述(2)实例代码二.CyclicBarrier(1)概述(2)CyclicBarrier与CountDownLatch的区别1.判断线程拦截的计数方式不同2.是否可重用3.扩展功能性不同(3)实例代码一.CountDownLatch(1)概述CountDownLatch用来等待多个线程或线程步骤完成后再统一进行下一步操作。构造函数传入参数count,基于AQS框架,将count设为AQS内部的状态值。链接: AQS的原理及应用执行countDown(

2020-07-26 21:18:03 191

原创 Java线程池

目录一.线程池的引入1.存在的问题2.线程池的概念与优势二.Java线程池的执行机制1.总体概述一.线程池的引入1.存在的问题在多线程并发的环境下,由于系统不能确定任意时刻线程的并发数量,如果每一次需要执行任务的时候都创建新的线程,然后用完立刻销毁的话,这对系统而言是一笔巨大的资源开销甚至导致资源耗尽的风险。2.线程池的概念与优势概念:线程池采用池化的思想,预先创建一定数量的线程并将线程资源集中到一起,统一监督,统一调配。类似的设计还包括数据库连接池等。优势:线程池通过对资源的统一调配,降低了系

2020-07-24 17:23:38 139

原创 原子类的使用

一.概述java.util.concurrent.atomic包为我们提供了一系列线程安全,用法简单的用于更新变量的原子操作类。原子类基于CAS算法实现线程安全,无需加锁,性能高效。以AtomicInteger原子类与int类进行效果比较:package package05_atomic;import java.util.concurrent.atomic.AtomicInteger;class Compare { //默认初始值为1 private AtomicInteger

2020-07-20 14:03:13 713

原创 Java并发容器

目录一.并发容器的由来二.常用的Java并发容器1.ConcurrentHashMap2.CopyOnWriteArrayList3.CopyOnWriteArraySet4.ConcurrentLinkedQueue5.ConcurrentLinkedDeque一.并发容器的由来在java的集合容器体系中,常用的ArrayList、LinkedList、HashMap等都属于线程不安全的容器。为了适应多线程开发,java首先为我们提供了同步容器:即通过synchronized关键字修饰整个代码块来保证

2020-07-18 22:07:03 157

原创 初识动态规划算法思想

一.问题引入二.总结

2020-07-18 10:43:44 208 3

原创 Java并发编程的三大特性

一.原子性概念:一个操作或多个操作做为一个整体,要么全部执行并且必定成功执行,要么不执行。简单理解就是程序的执行是一步到位的,而不是分布式的。在java当中,直接的读取操作和赋值(常量)属于原子性操作。对于原本不具有原子性的操作我们可以通过synchronized关键字或者Lock接口来保证同一时间只有一个线程执行同一串代码,从而也具有了原子性。二.有序性概念:程序的执行是存在一定顺序的。在Java内存模型中,为了提高性能,编译器和处理器会对程序指令做重排序。在单线程中,重排序不会影响程序的正确性,

2020-07-16 23:06:45 635

原创 Java内存模型(JMM)

一.概述JMM定义了java并发编程中各个线程之间如何通信、如何同步的规范。java并发采用的是共享内存模型,通过读写内存当中的公共部分来实现线程之间的通信和同步。JMM的抽象模型可表示为:如上图所示,每一个线程都对应着一个特有的本地内存,这里面存放着来自主内存的共享变量(实例域、静态域和数组元素等)的副本。如果要在不同线程之间进行通信和同步,就必须通过主内存才能实现。注意:本地内存只是JMM的一个抽象概念,实际上并不存在。二.实现JVM的内存区域划分:堆:堆中数据可被多线程共享,java

2020-07-16 17:56:40 114

原创 java集合类——HashMap部分源码实现

HashMapHashMap的key和value值都允许为null,线程不安全,同时不能保证元素的内部顺序不改变。底层数据结构采用数组+单向链表/红黑树,以bucket(桶)数组做为HashMap的主体,以链表或红黑树解决哈希冲突。接下来结合JDK源码学习:HashMap的初始容量值为16,构造函数中默认的负载因子为0.75,当达到这个值时数组将进行2倍的扩容。也可自己传入容量和负载因子参数:扩容机制:1.首先判断当前容量是否已经达到最大容量,如果达到了,就不再扩容。2.如果当前容量

2020-07-11 14:37:14 143

原创 java集合类(三)Set集合的常用实现类

一.HashSetHashSet底层数据结构采用的是哈希表,元素无序(即不保证元素的排列顺序不会发生改变)且不可重复,增删操作的时间复杂度都是O(1),元素可以且只可以存在一个null值。另外,HashSet集合判断两个元素是否相等的标准是equals()方法返回值为true且hashCode()方法返回值也相等。事实上,当一个元素存入HashSet集合中的时候会调用hashCode方法获得其hashCode值,然后根据hashCode值来决定元素在内存中的存储位置。二.LinkedHashSet

2020-07-10 18:33:42 1832

原创 java集合类(二)List集合的常用实现类

一.ArrayListArrayList底层数据结构是动态数组,查询快,增删慢。当调用无参构造方法创建ArrayList对象时,默认大小为10。当后期数组需要扩容时,会产生一个新的数组,该数组大小为原来数组大小的1.5倍,然后再把原数组元素复制到新数组中。常用方法:get(int index)、set(int index, E e)、add(E e)、remove(E e)、remove(int index)等。二.LinkList底层数据结构基于双向链表,增删快,顺序方法效率高,随机访问效率低,线

2020-07-10 15:12:45 518

原创 java集合类(一)集合体系概述

一.整体概述java集合体系分为两大部分:Collection和Map。-Collection接口下常见的子接口有List、Set接口。-List接口下有ArrayList、LinkedList、Vector等实现类;-Set接口下有HashSet、LinkedHashSet、TreeSet等实现类;-而Map接口下有HashMap、TreeMap、HashTable等实现类。具体可参见JavaSE帮助文档二.Collection接口1.List特点:元素有序且可重复-ArrayLi

2020-07-09 20:57:51 638

原创 线程安全问题

一.问题引入多线程提高了程序对CPU的使用率,但同时也带来了线程安全问题。当共享数据被多个线程同时操作时,就有可能因为一个线程代码还未执行完成就有其他线程参与了运算而导致程序数据出现错误。以买票问题演示一个简单的线程安全问题:package package03_thread;public class ThreadSafety implements Runnable{ private int tickets = 10; @Override public void run()

2020-07-09 13:08:11 104

原创 初识java多线程技术

一.进程与线程概述进程可以直接理解为运行的程序,一个进程可以执行多个线程,线程依赖于进程。注意:多进程计算机并不意味着CPU可以同时执行多个任务。事实上,多进程计算机是通过对程序的不断高效切换来让我们感觉CPU是在同时执行多个任务的。线程分为单线程和多线程。多线程即意味着程序有多条路径去执行同一个任务。多线程的本质其实就是为了有更多的机会去获得CPU的执行权。也正是因为这个特点,多线程会存在线程安全问题。多线程的存在,不是为了提高程序的执行速度,而是为了提高应用程序的使用率。二.多线程的实现方式1

2020-07-08 22:30:53 146

原创 java对象的序列化与反序列化

一.序列化与反序列化是什么在java当中,我们创建出来的对象都是存在于JVM当中的,一旦JVM停止运行,同时也就意味着对象的消失。如果我们想要获取对象的完整信息并对其进行传输,就需要对java对象进行序列化过程。同样的,如果我们想通过读取字节流文件来获取对象信息,就需要反序列化过程。序列化:将java对象转换为有序字节流(二进制数据)的过程,以便于进行网络传输或者以文件形式进行保存。反序列化:通过读取对象有序字节流来获取对象信息,重建java对象。二.序列化与反序列化的特点1.可以实现分布式对象

2020-07-07 21:01:47 185

原创 java设计模式(二)单例模式

java单例模式意为在整个系统运行过程中确保某个类只有一个实例并向全局提供这个实例。主要实现方式:一.即时加载不管有没有调用对象,加载类文件时立即就创建类对象。(饿汉式)优点:获取对象速度较快,线程安全。缺点:类加载速度慢,耗费系统不必要的资源。package package01_single;public class Eager { //静态私有成员对象 该类所有对象共用一份(单例) private static Eager instance = new Eager(.

2020-06-18 12:10:19 96

空空如也

空空如也

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

TA关注的人

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