自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Java.多线程可能出的面试题(4)

工具类,提供创建不同类型线程池的静态方法,不过部分方法可能有资源耗尽风险,实际生产推荐手动创建。核心线程池实现类,可自定义线程池参数,如核心线程数、最大线程数等,灵活控制线程池行为。控制同时访问资源的线程数量,利用许可证机制,线程访问资源前需获取许可证,完成后释放。通过更细粒度的锁机制或无锁算法,减少了线程之间的竞争,提高了并发性能。线程安全的哈希表,采用分段锁或 CAS 机制,在多线程环境下有高效的并发读写性能。根据指定的键移除对应的键值对,并返回被移除的值,如果键不存在,则返回。

2025-03-04 21:05:34 256

原创 Java.多线程可能出的面试题(3)

但有时候为了节省时间,你可能会调整顺序,先洗漱,再穿衣服,最后吃早饭。投币,选择饮料,出货是三个操作,要么三个操作正常进行,要么机器故障饮料不出,你投的钱也会退回来,不会只完成其中一部分操作,比如投了币但没出货,钱也没退。存位置的值可能经历了从 A 变为 B,再从 B 变回 A 的过程,此时 CAS 操作会认为值没有发生变化而执行更新操作,但实际上值已经发生了改变,当锁升级为重量级锁后,线程在获取锁失败时会被阻塞,进入等待队列,当持有锁的线程释放锁后,会唤醒等待队列中的线程,让它们再次竞争锁。

2025-03-03 12:33:30 880

原创 Java.多线程可能出的面试题(2)

在单线程环境下,重排序不会影响程序的最终结果,但在多线程环境下,可能会导致线程安全问题。:在多线程环境中,每个线程可能有自己的本地缓存,当一个线程对共享变量进行修改时,其他线程可能无法及时看到最新的值,从而导致数据不一致的问题。:多个线程在访问和操作共享资源时,由于执行顺序的不确定性,导致最终的结果依赖于线程执行的相对顺序,从而产生错误的结果。,使用synchronized修饰方法,就意味着同一时刻只有一个线程可以执行这些方法,从而保证了变量操作的线程安全。,若未达到最大线程数,则创建非核心线程执行任务;

2025-02-28 18:24:22 339

原创 Java.多线程可能出的面试题(1)

常见的拒绝策略有AbortPolicy(抛出异常)、CallerRunsPolicy(由调用者线程处理)、DiscardPolicy(丢弃任务)、DiscardOldestPolicy(丢弃队列中最老的任务)。用于创建线程的工厂,然后返回一个新创建的线程对象,有点类似构造方法,但可以进行更灵活和复杂的设置,比如自定义线程的名称、优先级等属性,。线程池允许创建的最大线程数。当任务队列已满且活动线程数小于最大线程数时,线程池会创建新的线程来处理任务。当线程数超过核心线程数时,多余的空闲线程存活的最长时间。

2025-02-27 21:01:36 396

原创 Java.线程池

线程池是一种多线程处理技术,它可以在系统启动时创建一定数量的线程,并将这些线程存储在一个 “池” 中,以便在需要执行任务时可以直接从池中获取线程,而不需要每次都创建新的线程。1 线程池的作用1.提高性能避免了频繁创建和销毁线程所带来的开销。当有任务需要处理时,直接从线程池中获取已创建好的线程来执行任务,任务执行完毕后,线程并不销毁,而是返回线程池等待下一次任务分配,大大节省了线程创建和销毁的时间,提高了系统的响应速度和处理效率。2.资源管理。

2025-02-19 19:57:43 848

原创 Java.数据结构.HashSet

如果你要添加的 value 已经存在那么它将添加失败,返回False,反之返回 True,优点:快速查找(平均时间复杂度为O(1))、高效插入和删除操作。并不会像 HashMap 中的 put 一样后值覆盖前值。缺点:非线程安全、不保证顺序。它只能存储唯一元素,不允许存储重复的元素。方法来查找集合中指定的元素,但可以使用。HashSet不提供。判断HashSet中是否包含指定元素。方法来判断集合中是否包含指定元素。返回HashSet中元素的个数。向HashSet中添加元素。从HashSet中移除元素。

2024-10-05 20:08:50 504

原创 Java.数据结构.HashMap

1基本概念键值对(key-value)的方式存储数据插入顺序和遍历顺序可能不同2数据结构HashMap的底层实现优化为数组+链表或红黑树假如我们输入1,4,5,6,7,9这串数字,那么其内部就是这样的结构。3。

2024-10-05 19:45:04 1103

原创 Java.数据结构.TreeSet

TreeSet是Java集合框架中的一部分,是基于TreeMap实现的。TreeSet保证了集合中的元素按照自然顺序或者通过提供的Comparator进行排序。:TreeSet会根据元素的自然顺序进行排序,确保集合中的元素总是处于有序状态,和TreeMap一样,我们同样可以通过重写Comparator方法来进行排序。:TreeSet中的元素是唯一的,不能重复。如果有两个元素相等,则后插入的元素不会出现在集合中。:TreeSet基于TreeMap实现,其时间复杂度为O(log n)。

2024-10-03 21:40:01 383 1

原创 Java.数据结构.TreeMap

TreeMap是Java集合框架中的一部分,并且基于红黑树数据结构。这说明TreeMap能够高效地执行键值对的存储、检索、排序等操作。TreeMap会根据键的自然顺序进行排序,当然,你也可以通过重写Comparator自己来进行排序。TreeMap中的键是唯一的,不能重复。如果有两个键相等,则后插入的值会覆盖先前的值。TreeMap是基于红黑树实现的,其时间复杂度为O(log n)。判断是否包含Value。三、TreeMap的基本操作。一、什么是TreeMap。二、TreeMap的特点。

2024-10-03 20:28:12 361

原创 Java.数据结构---二叉树

1.二叉树的基本概念这种数据结构之所以被称为二叉树,是因为它长像一个倒立的树。1.1基本概念以上图二叉树为例,我们需要知道几个重要的概念。根:上图的每一个结点都可以被叫做根。子树:根延伸出去的两个结点就是子树,C和E就是F结点的子树。二叉树只有左子树和右子树。结点的度:指一个结点的子树个数,F的度就是2,A的度就是0。数的度:指一整颗树的结点的度的最大值,这这颗树就是2。叶子结点或终端结点:指没有子树的结点,A就是一个叶子结点。父结点与子结点。

2024-08-15 21:08:16 1061

原创 Java.利用接口实现图书管理系统

今天我们来利用接口来实现一个图书管理系统。主要就是实现上述功能。在正式写代码之前我们需要明白我们需要什么类,需要什么接口,类与类之前需不需要继承。创建各个类和接口。

2024-07-31 00:17:04 891

原创 Java.抽象类和接口

1.抽象类。

2024-07-25 06:00:07 710

原创 Java.继承和多态

父类,子类肯定是先有父再有子,所以在构造子类对象时候 ,先要调用父类的构造方法,将从父类继承下来的成员构造完整,然后再调用子类自己的构造方法,将子类自己新增加的成员初始化完整。其返回值,名字和形参都不能改变,改变的只有方法的内容,且重写的访问权限不能比父类中被重写的方法的访问权限更低,其中被static、private修饰的方法无法重写。:子类对父类中的方法进行重写,即子类可以提供一个特定签名的方法,该方法在父类中也有定义但具有不同的实现。super的作用很简单,就是在子类中访问父类的内容。

2024-07-23 21:36:49 604

原创 java.类与对象(2)

以电脑为例,我们都知道电脑主机内部是由很多电子元器件很多电路组成的,但我们只需要知道,怎么开机、怎么通过键盘和鼠标与计算机进行交互即可。以学生为例,我们有两个学生,每个学生都有自己的姓名和年龄,这是他们独有的成员变量。因此,它们不能访问类的非静态成员(变量和方法),静态方法可以通过类名直接调用,而不需要创建类的实例。构造块又叫实例代码块,是在类的方法之外但在类的任何构造函数之前定义的代码块。1. 不属于某个具体的对象,是类的属性,所有对象共享的,不存储在某个对象的空间中。,而不是类的某个特定对象。

2024-07-16 07:40:20 1061

原创 java.类与对象(1)

1.类与对象的定义类是一种抽象的数据类型,它描述了具有共同属性和行为的一组对象的集合。而对象是类的实例。在Java中,你使用关键字new来创建类的实例,即对象。每个对象都是类的一个具体实现,它拥有类中定义的所有属性和方法。这么讲可能有点难懂,我换个说法。拿我们人类为例,人类就是类,我们身为人类,每一个人都是“人”这个类的实例也就是对象,每个人都是“人”这个类的具体实现,每个人都有作为人的基本属性。2 .类与对象的创建2.1类的创建名字应当与类相同大部分类都是由class修饰的。

2024-07-15 14:34:57 771

原创 Java.数据类型与变量

byte 和 byte 都是相同类型, 但是出现编译报错. 原因是, 虽然 a 和 b 都是 byte, 但是计算 a + b 会先将 a 和 b 都提升成 int, 再进行计算, 得到的结果也是 int, 这是赋给 c, 就会出现上述错误.double 类型的内存布局遵守 IEEE 754 标准(和C语言一样), 尝试使用有限的内存空间表示可能无限的小数, 势 必会存在一定的精度误差,因此浮点数是个近似值,并不是精确值。1. 不同数字类型的变量之间赋值, 表示范围更小的类型能隐式转换成范围较大的类型。

2024-07-09 14:17:21 763

原创 编译和链接

一个C语言的项目可能会有多个 .c 的文件,这些文件经过编译器的编译形成各个 .obj 文件(Linux环境下⽬标⽂件的后缀是 .o),然后这些⽂件和链接库⼀起经过链接器处理⽣成最终的可执⾏程序。接器根据引⽤的符号 Add 在其他模块中查找 Add 函数的地址,然后将 test.c 中所有引⽤到 Add 的指令重新修正,让他们的⽬标地址为真正的 Add 函数的地址,• 处理#include预编译指令,将包含的头⽂件的内容插⼊到该预编译指令的位置。链接解决的是⼀个项⽬中多⽂件、多模块之间互相调⽤的问题。

2024-06-10 16:54:03 494

原创 C语言文件操作

1. 什么是⽂件?在程序设计中,我们⼀般谈的⽂件有两种:程序⽂件、数据⽂件1.1程序⽂件程序⽂件包括源程序⽂件(后缀为.c),⽬标⽂件(windows环境后缀为.obj),可执⾏程序(windows环境后缀为.exe)。1.2数据⽂件⽂件的内容不⼀定是程序,⽽是程序运⾏时读写的数据,⽐如程序运⾏需要从中读取数据的⽂件,或者输出内容的⽂件。其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使⽤,这⾥处理的就是磁盘上⽂件。1.3⽂件名。

2024-06-08 14:23:27 610

原创 深入理解指针(3)

我们回想一下二维数组,⼆维数组其实可以看做是每个元素是⼀维数组的一维数组,那么这个数组的⾸元素也就是第⼀⾏,是个⼀维数组。我们先看p1,p1先与 后面的[10]结合,p1[10],表示一个数组,而它的类型就是前面的int*,类型为指针,也就是说,经过前面的学习,我们可以很快的得出结论,函数指针是一个指向函数地址的指针,但函数有指针吗?就意味着⼆维数组传参本质上也是传递了地址,传递的是第⼀⾏这个⼀维数组的地址,那么形参也是可以写成指针形式的。parr1先和[]结合,说明parr1是数组,数组的内容是什么呢?

2024-06-03 19:34:55 818

原创 (结构体)

此时共用了九个字节,因为构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的 整数倍。在第1个字节8个比特位中,a先占用3个还剩5个,而b只需要4个因此b也可以放入第一个字节中,此时第1字节还剩1个比特位,而c需要5个,不够,因此开辟新的字节,第2字节还剩3个,不够4比特位的d,因此再开辟第3个字节存放d。.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构 体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

2024-05-27 18:58:29 711

原创 深入理解指针(2)

parr[i]是访问parr数组的元素,parr[i]找到的数组元素指向了整型⼀维数组,parr[i][j]就是整型⼀维数 组中的元素。上述的代码模拟出⼆维数组的效果,实际上并⾮完全是⼆维数组,因为每⼀⾏并⾮是连续的。这⾥我们发现&arr[0]和&arr[0]+1相差4个字节,arr和arr+1相差4个字节,是因为&arr[0]和arr都是 ⾸元素的地址,+1就是跳过⼀个元素。而*ppa也就是ppa的解引用操作,其结果其实就是pa的地址,那么再2进行一次解引用操作,也就是**ppa,其实就等于a等于10。

2024-05-26 20:48:46 257

原创 深入理解指针(1)

1. 内存和地址我们知道计算机在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中, 这其实是把内存划分为⼀个个的内存单元,每个内存单元的⼤⼩取1个字节。以学生宿舍为例,⼀ 个字节空间⾥⾯能放8个⽐特位,就好⽐同学们住 的⼋⼈间,每个⼈是⼀个⽐特位。而有宿舍就有门牌号,也就是地址,有了地址也就能快速找到对应的内存单元了。而在C语言中这类地址被称为了指针。可以理解为内存单元的编号==地址==指针。CPU就是通过地址才能在内存中找到对应的信息的。2. 指针变量和地址。

2024-05-23 20:03:01 634 1

原创 简易扫雷游戏(第一版)(C语言)

通过if语句判断输入坐标 周围8格有几个雷,若输入的为雷,则打印"很遗憾你猜错了"游戏结束,若不是则判断坐标周围8个坐标有几个雷并将对应arr2展示棋盘上的坐标修改并打印arr2。游戏还有许多地方不足,比如无法修改难度,目前只能进行9x9,10雷的游戏,也无法做到一下子消除一大片,只能一个个消除,需要进行90次才算游戏成功实在繁琐,若是实力进步,有时间我会继续优化改进。以上为我的主程序,在打开游戏的时候我们理所应当会看见游戏菜单,所以我们第一步便是打印游戏菜单,在这里我自定义函数mean。

2024-05-03 20:44:03 414

原创 C语言分支循环语句(for&do-while)

for循环与while循环可以实现互换,即for循环能实现的的while循环也能实现。循环类似,但不同之处在于它会先执行一次循环体,然后再检查条件。循环用于重复执行一段代码,直到满足某个条件为止。循环也是用于重复执行一段代码,但其语法与。是每次循环结束后的更新操作。循环也会至少执行一次循环体。是循环开始前的初始化操作,循环就会一直执行循环体。在第一次检查时为假,

2024-04-13 16:04:06 288 1

原创 C语言分支循环语句(if&switch)

语句用于根据表达式的值来选择执行多个代码块中的一个。语句用于根据指定的条件来执行相应的代码块。语句结合使用,当条件不满足时执行。若只有一行可以不加{},程序会继续执行下一个。标签后的代码,直到遇到。

2024-04-13 15:53:20 233 1

空空如也

空空如也

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

TA关注的人

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