自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络温习

一 OSI 与 TCP/IP 各层的结构与功能, 都有哪些协议?学习计算机网络时我们一般采用折中的办法,也就是中和 OSI 和 TCP/IP 的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚。结合互联网的情况,自上而下地,非常简要的介绍一下各层的作用。1.1 应用层应用层(application-layer)的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程(进程:主机中正在运行的程序)间的通信和交互的规则。对于不同的网络应用需要不同的应用层协

2022-01-13 16:19:07 115

原创 ​三种常用的缓存读写策略​

Cache Aside Pattern(旁路缓存模式)Cache Aside Pattern 是我们平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场景。Cache Aside Pattern 中服务端需要同时维系 DB 和 cache,并且是以 DB 的结果为准。下面我们来看一下这个策略模式下的缓存读写步骤。写:先更新 DB 然后直接删除 cache 。简单画了一张图可以帮助理解写的步骤。读:从 cache 中读取数据,读取到就直接返回 cache中...

2022-01-12 15:09:29 199

原创 Redis温习

简单来说 Redis 就是一个使用 C 语言开发的数据库,不过与传统数据库不同的是 Redis 的数据是存在内存中的 ,也就是它是内存数据库,所以读写速度非常快,因此 Redis 被广泛应用于缓存方向。另外,Redis 除了做缓存之外,也经常用来做分布式锁,甚至是消息队列。Redis 提供了多种数据类型来支持不同的业务场景。Redis 还支持事务 、持久化、Lua 脚本、多种集群方案。缓存数据的处理流程是怎样的?可以用个草图先了解一下:简单来说就是:如果用户请求的数据在缓存中就直

2022-01-12 14:58:15 105

原创 MySql存储引擎

存储引擎MySQL 当前默认的存储引擎是 InnoDB,并且在 5.7 版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务MyISAM 和 InnoDB 的区别MySQL 5.5 之前,MyISAM 引擎是 MySQL 的默认存储引擎。虽然,MyISAM 的性能还行,各种特性也还不错(比如全文索引、压缩、空间函数等)。但是,MyISAM 不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。5.5 版本之后,MySQL 引入了 InnoDB

2022-01-10 16:27:20 637

原创 数据结构温习4(图结构)

何为图呢?简单来说,图就是由顶点的有穷非空集合和顶点之间的边组成的集合。通常表示为:**G(V,E)**,其中,G表示一个图,V表示顶点的集合,E表示边的集合。下图所展示的就是图这种数据结构,并且还是一张有向图。图的基本概念顶点图中的数据元素,我们称之为顶点,图至少有一个顶点(非空有穷集合)对应到好友关系图,每一个用户就代表一个顶点。边顶点之间的关系用边表示。对应到好友关系图,两个用户是好友的话,那两者之间就存在一条边。度度表示一个顶点包含多少条边,在有向图.

2022-01-10 13:58:46 75

原创 数据结构温习3(堆结构)

什么是堆堆是一种满足以下条件的树:堆中的每一个节点值都大于等于(或小于等于)子树中所有节点的值。或者说,任意一个节点的值都大于等于(或小于等于)所有子节点的值。例如:第1个和第2个是堆。第1个是最大堆,每个节点都比子树中所有节点大。第2个是最小堆,每个节点都比子树中所有节点小。第3个不是,第三个中,根结点1比2和15小,而15却比3大,19比5大,不满足堆的性质。堆的用途相对于有序数组而言,堆的主要优势在于更新数据效率较高堆的存储之前介绍树的时候说过,由于完全二.

2022-01-10 10:56:44 272

原创 数据结构温习2(树结构)

树树就是一种类似现实生活中的树的数据结构(倒置的树)。任何一颗非空树只有一个根节点。一棵树具有以下特点:一棵树中的任意两个结点有且仅有唯一的一条路径连通。 一棵树如果有 n 个结点,那么它一定恰好有 n-1 条边。 一棵树不包含回路。 下图就是一颗树,并且是一颗二叉树。如上图所示,通过上面这张图说明一下树中的常用概念:节点:树中的每个元素都可以统称为节点。 根节点:顶层节点或者说没有父节点的节点。上图中 A 节点就是根节点。 父节点:若一个节点含有子节点,则这个节点称...

2022-01-10 10:35:00 296

原创 数据结构温习1(线性数据结构)

线性数据结构 :数组、链表、栈、队列1.数组数组(Array)是一种很常见的数据结构。它由相同类型的元素(element)组成,并且是使用一块连续的内存来存储。我们直接可以利用元素的索引(index)可以计算出该元素对应的存储地址。数组的特点是:提供随机访问并且容量有限。数组时间复杂度:假如数组的长度为 n。访问:O(1)//访问特定位置的元素插入:O(n )//最坏的情况发生在插入发生在数组的首部并需要移动所有元素时删除:O(n)//最坏的情况发生在删除数组的开头...

2022-01-10 09:38:09 63

原创 java并发梳理(3)

1.ThreadLocal1.1. ThreadLocal 简介通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。如果想实现每一个线程都有自己的专属本地变量该如何解决呢?JDK 中提供的ThreadLocal类正是为了解决这样的问题。ThreadLocal类主要解决的就是让每个线程绑定自己的值,可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会有这个变量的本地副本,这..

2022-01-06 17:32:24 185

原创 java并发梳理(2)

synchronized 关键字synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。synchronized 关键字的使用:1.修饰实例方法:作用于当前对象实例加锁,进入同步代码前要获得当前对象实例的锁synchronized void method() { //业务代码}2.修饰静态方法:也就是给当前类加锁,会作用于类的所有对象实例 ,进入同步代码前要...

2022-01-06 10:50:57 398

原创 java并发梳理(1)

何为进程?进程是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。在 Java 中,当我们启动 main 函数时其实就是启动了一个 JVM 的进程,而 main 函数所在的线程就是这个进程中的一个线程,也称主线程。何为线程?线程与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系

2022-01-06 09:55:09 52

原创 HashMap 的底层实现

JDK1.8 之前JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。所谓扰动函数指的就是 HashMap 的 hash 方法。

2022-01-06 08:58:38 89

原创 Java集合知识汇总(5)​

Map 接口HashMap 和 Hashtable 的区别线程是否安全:HashMap是非线程安全的,Hashtable是线程安全的,因为Hashtable内部的方法基本都经过synchronized修饰。(如果你要保证线程安全的话就使用ConcurrentHashMap吧!); 效率:因为线程安全的问题,HashMap要比Hashtable效率高一点。另外,Hashtable基本被淘汰,不要在代码中使用它; 对 Null key 和 Null value 的支持:H...

2022-01-05 17:57:11 41

原创 Java集合知识汇总(4)​

Collection 子接口之 QueueQueue 与 Deque 的区别Queue是单端队列,只能从一端插入元素,另一端删除元素,实现上一般遵循先进先出(FIFO)规则。Queue扩展了Collection的接口,根据因为容量问题而导致操作失败后处理方式的不同可以分为两类方法: 一种在操作失败后会抛出异常,另一种则会返回特殊值。Deque是双端队列,在队列的两端均可以插入或删除元素。Deque扩展了Queue的接口, 增加了在队首和队尾进行插入和删除的...

2022-01-05 17:28:35 210

原创 Java集合知识汇总(3)​

Collection 子接口之 Setcomparable 和 Comparator 的区别comparable接口实际上是出自java.lang包 它有一个compareTo(Object obj)方法用来排序 comparator接口实际上是出自 java.util 包它有一个compare(Object obj1, Object obj2)方法用来排序一般我们需要对一个集合使用自定义排序时,我们就要重写compareTo()方法或compare()方法。当我们需要对某一个集合实现两..

2022-01-05 17:16:29 63

原创 ​Java集合知识汇总(2)​

Collection 子接口之 ListArraylist 和 Vector 的区别?ArrayList是List的主要实现类,底层使用Object[ ]存储,适用于频繁的查找工作,线程不安全 ; Vector是List的古老实现类,底层使用Object[ ]存储,线程安全的。Arraylist 与 LinkedList 区别?是否保证线程安全:ArrayList和LinkedList都是不同步的,也就是不保证线程安全; 底层数据结构:Arraylist底层使用...

2022-01-05 16:33:13 47

原创 Java集合知识汇总(1)

Java 集合概览Java 集合, 也叫作容器,主要是由两大接口派生而来:一个是 Collection接口,主要用于存放单一元素;另一个是 Map 接口,主要用于存放键值对。对于Collection 接口,下面又有三个主要的子接口:List、Set 和 Queue。List, Set, Queue, Map 四者的区别?List(对付顺序的好帮手): 存储的元素是有序的、可重复的。 Set(注重独一无二的性质): 存储的元素是无序的、不可重复的。 Queue(实现排队功能的叫号机).

2022-01-05 15:58:11 48

原创 BigDecimal解决浮点数运算精度丢失问题

BigDecimal 介绍BigDecimal可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过BigDecimal来做的。为什么浮点数float或double运算的时候会有精度丢失的风险呢?这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用...

2022-01-05 15:15:35 1223

原创 IO模型详解

何为 I/O?I/O(Input/Outpu) 即输入/输出 。根据冯.诺依曼结构,计算机结构分为 5 大部分:运算器、控制器、存储器、输入设备、输出设备。我们再先从应用程序的角度来解读一下 I/O:为了保证操作系统的稳定性和安全性,一个进程的地址空间划分为用户空间(User space)和内核空间(Kernel space )。从应用程序的视角来看的话,我们的应用程序对操作系统的内核发起 IO 调用(系统调用),操作系统负责的内核执行具体的 IO 操作。也就是说,我们的应用程序...

2022-01-05 15:01:08 86

原创 代理模式详解

代理模式是一种比较好理解的设计模式。简单来说就是 我们使用代理对象来代替对真实对象(real object)的访问,这样就可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功能。代理模式有静态代理和动态代理两种实现方式,我们 先来看一下静态代理模式的实现。1. 静态代理静态代理中,我们对目标对象的每个方法的增强都是手动完成的.静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件静态代理实现步骤:定义一个接口及其实现类; 创建一个代理类.

2022-01-05 14:33:48 73

原创 为什么 Java 中只有值传递?

开始之前,我们需要搞懂下面这两个概念:形参&实参:实参(实际参数):用于传递给函数/方法的参数,必须有确定的值。 形参(形式参数):用于定义函数/方法,接收实参,不需要有确定的值。值传递&引用传递:传递:方法接收的是实参值的拷贝,会创建副本。 引用传递:方法接收的直接是实参所引用的对象在堆中的地址,不会创建副本,对形参的修改将影响到实参。案例1:传递基本类型参数public static void main(String[] args) { int ...

2022-01-05 13:48:49 228

原创 线程池中的线程是怎么创建的?是一开始就随着线程池的启动创建好的吗?

显然不是的。线程池默认初始化后不启动Worker,等待有请求时才启动。每当我们调用execute()方法添加一个任务时,线程池会做如下判断:·如果正在运行的线程数量小于corePoolSize,那么马上创建线程运行这个任务;·如果正在运行的线程数量大于或等于corePoolSize,那么将这个任务放入队列;·如果这时候队列满了,而且正在运行的线程数量小于maximumPoolSize,那么还是要创建非核心线程立刻运行这个任务;·如果队列满了,而且正在运行的线程数量大于或等于maximumPoolS

2021-11-19 10:13:03 2572 7

原创 JVM加载Class文件的原理机制

Java语言是一种具有动态性的解释型语言,类(Class)只有被加载到JVM后才能运行。当运行指定程序时,JVM会将编译生成的.class文件按照需求和一定的规则加载到内存中,并组织成为一个完整的Java应用程序。这个加载过程是由类加载器完成,具体来说,就是由ClassLoader和它的子类来实现的。类加载器本身也是一个类,其实质是把类文件从硬盘读取到内存中。类的加载方式分为隐式加载和显示加载。隐式加载指的是程序在使用new等方式创建对象时,会隐式地调用类的加载器把对应的类加载到JVM中。显示加载指的是

2021-11-19 10:01:00 52

空空如也

空空如也

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

TA关注的人

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