自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 软件测试工具——Junit单元测试

JUnit是一个开源的Java语言的单元测试框架,专门针对Java设计,使用最广泛。JUnit是事实上的单元测试的标准框架,任何Java开发者都应当学习并使用JUnit编写单元测试。使用JUnit编写单元测试的好处在于,我们可以非常简单地组织测试代码,并随时运行它们,JUnit就会给出成功的测试和失败的测试,还可以生成测试报告,不仅包含测试的成功率,还可以统计测试的代码覆盖率,即被测试的代码本身有多少经过了测试。对于高质量的代码来说,测试覆盖率应该在80%以上。

2024-09-04 09:14:51 759

原创 设计模式——工厂模式

从上到下的优化来看,工厂方法模式并不复杂,甚至这样的开发结构在你有所理解后,会发现更加简单了。那么这样的开发的好处道后,也可以总结出来它的优点;避免创建者与具体的产品逻辑耦合、满⾜足单⼀一职责,每⼀一个业务逻辑实现都在所属⾃自⼰己的类中完成、满⾜足开闭原则,无需更更改使⽤用调⽤用⽅方就可以在程序中引入新的产品类型。但这样也会带来一些问题,比如有非常多的奖品类型,那么实现的子类会极速扩张。因此也需要使用其他的模式进行优化,这些在后续的设计模式中会逐步涉及到。

2024-08-20 16:50:31 568

原创 单例模式:确保唯一实例的设计模式

在学习框架和大型项目开发时,我们常常会遇到“单例模式”这个词。虽然它时常被提及,但往往没有详细讲解。为了搞懂单例模式的真正意义以及它在开发中的应用,我查阅了一些资料并总结了这篇博客。希望通过这篇文章,能够帮助大家更好地理解单例模式,并在实际开发中得心应手地运用它。单例模式是一种创建型设计模式,其目的是确保一个类只有一个实例,并且提供一个全局的访问点。简单来说,就是一个类的实例是唯一的,所有请求这个实例的地方都得到相同的对象。可以将单例模式比作家庭中的家庭医生:全家只有一个医生,所有的健康问题都由他来处理。

2024-08-07 10:06:08 839

原创 什么是设计模式?一文理解,通俗易懂!

设计模式是软件开发中一些经过验证的、可重复使用的解决方案,它们帮助程序员解决常见的编程问题。其实在了解了它的来历后,对涉及模式就有一定理解了,顾名思义,就是模式,什么模式,开发设计的模式。可以把设计模式想象成在烹饪中的食谱:它提供了一种做菜的方式,虽然你可以想怎么做就怎么做,但使用经典的食谱可以让你更快地做出美味的菜肴。

2024-08-07 01:29:04 900

原创 Java中的原子类

原子类提供了一种高效且线程安全的方式来处理共享数据,避免了传统锁机制的性能开销。它们通过底层的 CAS 操作实现原子性,并提供了一些常用的原子操作方法。原子类适用于需要高并发且不需要复杂同步的场景,是多线程编程中的一种重要工具。

2024-07-31 16:23:06 3647

原创 CountDownLatch

CountDownLatch 是一个用于协调多个线程的同步工具。它通过一个计数器来管理线程的等待和通知机制。

2024-07-31 16:05:44 3581

原创 ReentrantLock

ReentrantLock 是一个可重入的互斥锁,它提供了比 synchronized 关键字更灵活的锁机制。它属于 java.util.concurrent.locks 包。

2024-07-31 16:04:58 3675

原创 什么是公平锁和非公平锁?

公平锁(Fair Lock)确保线程按照请求锁的顺序获得锁。也就是说,先请求锁的线程会优先获得锁,而后请求的线程则需要等待前面线程释放锁。

2024-07-31 16:03:01 3396

原创 线程池的种类使用场景

CPU 密集型任务是指主要消耗计算资源的任务,任务的执行时间主要消耗在 CPU 上的计算操作,而不是等待 I/O 操作。这类任务对 CPU 的计算能力要求较高,通常涉及大量的计算、数据处理、复杂的算法等。

2024-07-31 16:01:18 3837

原创 线程池总结

线程池是一种用于管理和复用线程的技术,它可以提高系统性能和资源利用率。线程池的核心原理是预先创建一定数量的线程,并将这些线程用于执行任务,从而避免了频繁创建和销毁线程的开销。

2024-07-31 15:59:34 3606

原创 并发编程之线程池技术

/执行一个job,这个job需要实现runnable//关闭线程池//增加工作者线程//减少工作者线程//得到正在等待执行得任务数量客户端可以通过execute(Job)方法将Job提交入线程池执行,而客户端自身不用等待Job的执行完成。除了execute(Job)方法以外,线程池接口提供了增大/减少工作者线程以及关闭线程池的方法。这里工作者线程代表着一个重复执行Job的线程,而每个由客户端提交的Job都将进入到一个工作队列中等待工作者线程的处理。

2024-07-30 17:58:06 3676

原创 一个简单的数据库连接池示例

通过构造函数初始化连接的最大上限,通过一个双向队列 、来维护连接,调用方需要先调用fetchConnection(long)方法来指定在多少毫秒内超时获取连接, 当连接使用完成后,需要调用releaseConnection(Connection)方法将连接放回线程池。

2024-07-30 16:56:25 3752

原创 Java中的反射是怎么回事?

Java核心技术》中的定义是这样的:能够分析类能力的程序,就是反射这就是一个概念,跟java中经常提的问题:对象是什么?一类问题,简单来说就是将类创建对象的逻辑反过来,由对象获得其所属类型的信息。它允许程序在运行时查询和操作类、方法、字段等信息。

2024-07-30 00:01:36 3858

原创 Java中的异常总结

你可以创建自己的异常类,通常继承自。

2024-07-29 22:52:55 3534

原创 LinkedList 实现 LRU 缓存

先定义了大小为3的缓存,然后存1,2,3,此时的访问顺序1-2-3,list头部是最早访问的,尾部是最晚访问的,此时缓存已满,然后访问了1,则现在的顺序是2-3-1,可见,2是那个最久没被访问的,我再添加新元素4时,需要删除的是2,顺序变成3-1-4。LRU(Least Recently Used,最近最少使用)缓存是一种缓存淘汰策略,用于在缓存满时淘汰最久未使用的元素。

2024-07-25 17:08:21 4025

原创 Java开发绊脚石——Javabean

在学框架时,一直说bean,写Java程序时很少听说,所以就查了一下,并总结了下来,其实很简单,就是个名字,本质还是类。说简单些就是有标准的类。下面就是一个标准的Javabean类。

2024-07-25 15:04:48 3462

原创 Java中常见的操作符和控制结构

对两个数的每一位进行逻辑与运算。:将变量的值增加 1。:将变量的值减少 1。

2024-07-25 11:25:00 4075

原创 Java中Object类的基本方法

Object类提供了一组基础方法,这些方法在Java中扮演着重要的角色。正确理解和重写这些方法对于编写健壮和可维护的代码非常重要。特别是equals和hashCode方法,在涉及对象比较和哈希表操作时,重写它们显得尤为关键。

2024-07-24 16:43:10 3590

原创 为什么重写equals要重写hashcode

一致性要求equals相等的对象必须具有相同的hashCode,以确保哈希表的正确性。哈希表工作原理:哈希码用于快速定位对象的存储位置,equals用于精确比较对象。重写hashCode:重写equals方法后,必须重写hashCode方法,以保证对象在基于哈希的数据结构中的正确行为和性能。所以,亲爱的开发者们,请记住:重写equals方法之后,一定不要忘了给hashCode方法也补上。否则,哈希表中的对象就像迷路的小孩,你永远找不到它们。

2024-07-24 14:51:15 3642

原创 equals方法和==运算符的区别

=运算符:比较两个引用是否指向同一个对象(引用比较)。equals方法:比较两个对象的内容是否相同(内容比较),可以通过重写实现自定义比较逻辑。使用equals方法进行内容比较时,记得重写hashCode方法,以确保在使用哈希集合(如HashMapHashSet)时保持一致性。

2024-07-24 14:42:10 3567

原创 面向对象编程的特点

面向对象编程的特点。

2024-07-24 14:21:14 3415

原创 Java中的接口和抽象类

抽象类是一种不能实例化的类,可以包含抽象方法(没有实现的方法)和具体方法(有实现的方法)。抽象类主要用于定义一组相关的类的共同行为,并提供部分实现。

2024-07-24 14:14:45 3899

原创 Java中的数组

数组是一种数据结构,用于存储相同类型的数据。数组在内存中是连续分配的,因此访问数组元素的速度很快。

2024-07-22 23:53:25 3445

原创 Java中的字符串类型——String

为了优化性能,Java 在内存中维护了一个字符串池。当使用字符串字面值创建字符串时,Java 会先检查池中是否存在相同的字符串,如果存在则返回池中的字符串对象,而不会创建新的对象。这使得相同的字符串字面值在内存中只有一个副本。

2024-07-22 23:48:16 3691

原创 什么是128陷阱?

Java包装类提供了基本数据类型与对象之间的转换机制,拆装箱是编译器行为,通过相应的方法实现。在使用包装类时,特别是Integer类型时,要注意自动装箱的128陷阱,推荐使用equals()方法进行比较,而非==。通过合理使用包装类,可以在Java编程中更好地处理对象与基本数据类型之间的转换问题。

2024-07-22 23:28:31 3501

原创 基于停等机制实现的阻塞队列

等待/通知机制,是指一个线程A调用了对象O的wait()方法进入等待状态,而另一个线程B调用了对象O的notify()或者notifyAll()方法,线程A收到通知后从对象O的wait()方法返回,进而执行后续操作。上述两个线程通过对象O来完成交互,而对象上的wait()和notify/notifyAll()的关系就如同开关信号一样,用来完成等待方和通知方之间的交互工作。

2024-07-22 22:11:16 3598

原创 并发编程--线程间如何通信?

碎碎念首先,让我们来认识一下 volatile。这位修饰词先生,是个很注重信息共享的家伙。它修饰的字段或变量,就像是办公室里的公告板,任何人对它的修改,都会立刻被所有人看到。这就是 volatile 的魅力——保证了线程间变量的可见性。不管哪个线程去读取这个变量,都能得到最新的值。接下来是 synchronized,这位修饰词小姐,则是个讲究排他性的角色。她修饰的方法或代码块,就像是一个会议室,一次只能有一个线程进去“开会”。

2024-07-22 16:30:20 3970

原创 触发类初始化的六种情况

在某些情况下,当类中定义了静态常量,并在其他类中被引用时,可能会触发该类的初始化。特别是当常量在其他类中被直接引用时,JVM 可能会在编译时将其替换为常量值,从而触发类的初始化。

2024-07-21 15:59:32 3570

原创 内存屏障:程序员的“隐形护盾”

在编程的世界里,我们常常要面对各种奇妙的挑战。其中之一,就是在多线程环境中确保数据的一致性。没错,这就是内存屏障的“舞台”!就像你在超级英雄电影中看到的隐形护盾一样,内存屏障能帮助我们保护数据的“安全”,确保一切正常运转。那么,让我们一起来了解一下这四种“超级护盾”吧!

2024-07-21 15:26:11 3510

原创 学并发编程前需要明确的一些基础知识

首先,进程是操作系统分配资源的基本单位。每当我们启动一个程序时,操作系统就会为这个程序创建一个进程。进程有自己独立的内存空间和资源,操作系统会负责管理这些资源,并确保进程能够正常运行。与进程不同,线程是操作系统调度的基本单位。线程是在进程中执行的最小单位,一个进程可以包含多个线程,这些线程共享进程的资源。这种设计允许多个线程同时在一个进程内运行,提高了程序的效率和响应速度。

2024-07-21 14:44:13 3529

原创 多线程之上下文切换

上下文切换(Context Switch)是指计算机系统在多任务处理时,将当前正在执行的任务的状态保存下来,然后将另一个任务的状态加载并开始执行的过程。简单来说,就是线程之间的切换。在多线程编程中,CPU需要在多个线程之间切换,以实现并发执行。上下文切换的过程涉及到保存和恢复线程的执行状态,包括寄存器、程序计数器和内存映射等信息。这一过程是有开销的,频繁的上下文切换会导致性能下降,因为保存和恢复状态需要时间,并且可能导致缓存失效,从而降低系统的整体效率。

2024-07-19 21:59:06 3432

原创 一文搞懂Java中的双亲委派

在Java中,类加载器(ClassLoader)是一个非常重要的组件,用于在运行时动态加载类文件。而双亲委派模型则是类加载器的一种重要机制,它规定了类加载请求的传递顺序,从而确保了Java类加载过程的安全性和稳定性。

2024-07-19 21:48:46 3785

原创 JVM思维导图

2024-07-18 17:53:33 3334

原创 线程的终止

标志位属性,表示能否中断,外部线程能根据这个标识位属性来对线程进行中断操作。b调用interrupt()中断a,a通过isinterrupted()方法是否被中断。

2024-07-18 10:07:29 3379

原创 Java中的修饰符

最近在复习Java基础时,复习到了Java修饰符。这也是我最开始学习Java时感到疑惑的地方,不同于C,Java程序动不动就public,private,这次系统学习完后,我总结了一下。

2024-07-18 09:00:22 3485

原创 面试官——如果给你一台64G内存的电脑,处理大量日志数据你会怎么做?

根据不同性能的电脑,我们可以选择合适的方案来处理100G用户日志数据。高性能计算集群可以最大化利用分布式计算资源,单台高性能服务器可以通过多线程并行处理高效完成任务,而普通台式机则需要更细致的分块和外部存储方案来应对内存限制。

2024-07-18 00:58:16 3579

原创 MySQL为什么使用B+树而不是跳表?

B+树的设计能够减少磁盘I/O操作,通过一次磁盘读取获取尽可能多的数据。跳表搜索级别越高,IO的操作越多。

2024-07-18 00:03:04 3878

原创 很多logn级别的数据结构,为什么选择B+树?

B+树在进行插入和删除操作时,会自动调整以保持平衡,这些操作的时间复杂度也是O(log n),并且不会导致树的高度剧烈变化。节点包含多个子节点指针,这减少了树的高度,从而减少了访问磁盘的次数。B+树的内部节点只存储索引信息,而不存储实际数据,数据都存储在叶节点中。B+树的所有叶节点在同一层,查找任何一个数据的路径长度都相同,保证了查找操作的时间复杂度为O(log n)。B+树的叶节点按顺序链接,可以很方便地进行范围查询。与B树不同,B+树的所有叶节点都包含在一个链表中,这使得范围查询和顺序访问非常高效。

2024-07-18 00:00:20 4052

原创 一文搞懂银行家算法

死锁是指在计算机系统中,多个进程或线程因竞争资源或互相等待而陷入的一种永久阻塞的状态。互斥条件:某些资源在同一时间只能被一个进程使用。如果其他进程请求该资源,则必须等待。占有且等待条件:一个进程已经持有至少一个资源,但又请求新的资源,而新的资源正被其他进程持有,因此进程必须等待。不剥夺条件:资源不能被强行从一个进程中剥夺,必须由持有它的进程主动释放。循环等待条件:存在一个进程链,使得每个进程都在等待链中的下一个进程所持有的资源,形成一个环形等待链。

2024-07-17 23:40:39 4314

原创 多线程一定快吗?-- 不一定

在现代计算机编程中,多线程编程是一种常见的技术,被广泛认为能提高程序的执行效率。然而,?答案是否定的。多线程编程虽然有其显著的优点,但也存在一些潜在的缺陷和复杂性。下面我将深入探讨多线程编程的优缺点,以及在什么情况下多线程不一定能带来性能提升。

2024-07-16 22:34:07 3985

JVM思维导图,简要总结JVM重点

JVM思维导图,简要总结JVM重点

2024-07-18

软件工程知识点整理 - 思维导图

软件工程知识点整理 - 思维导图

2024-07-16

计算机网络复习 - 运输层思维导图

计算机网络复习 - 运输层思维导图

2024-07-16

计算机网络复习 - 网络层思维导图

计算机网络复习 - 网络层思维导图

2024-07-16

计算机网络复习-数据链路层思维导图

计算机网络复习-数据链路层思维导图

2024-07-16

计算机网络复习 - 物理层思维导图

计算机网络复习 - 物理层思维导图

2024-07-16

计算机网络复习 - 第一章 思维导图

Xmind文件

2024-07-16

空空如也

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

TA关注的人

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