- 博客(70)
- 收藏
- 关注
原创 JavaEE学习导读
随着技术的发展,⽆论是后端开发还是前端开发,开发的时候都很少使⽤原⽣的代码,⽐如:JDBC、JS等,取⽽代之的是各种开发框架,如:后端框架(Spring、SpringBoot、Mybatis 等)、前端框架( Vue、Node 等)。这些框架都有⼀个共同的特点,就是简单、⾼效,这极⼤的提⾼了我们的开发效率。那什么是框架呢?框架(Framework),意思是框架、机制、准则。最早是源于建筑⾏业,是⼀个框⼦——指其约束性,也是⼀个架⼦——指其⽀撑性,是⼀个基本概念上的结构,⽤于去解决或者处理复杂的问题。
2025-02-25 22:41:18
639
原创 Java 中操作文件
修饰符及类型属性说明依赖于系统的路径分隔符,String类型的表示staticchar依赖于系统的路径分隔符,char类型的表示是 Java 标准库中的一个抽象类,位于java.io包中。它是所有字节输入流的超类,用于从输入源(如文件、网络连接、内存等)读取字节数据。它定义了基本的输入流操作方法,具体的实现类(如等)提供了实际的功能。是 Java 中java.io包的一个类,它是的一个子类,专门用于从文件中读取字节数据。通过,可以逐字节。
2025-02-17 14:34:37
943
原创 线程安全的集合类
是线程不安全的(多线程环境下可能会存在问题)。为了保证数据的安全性,我们可以使用。进行读写操作(尤其是写操作),可能会导致数据不一致或抛出异常(如。在单线程环境下不涉及线程安全问题,但是,在多线程环境中直接使用。做出了⼀系列的改进和优化,既能保证线程安全,又能提升效率。是线程安全的,但不建议⽤,其他的集合类不是线程安全的。,但是Hashtable的效率低下。”的机制保证线程安全**。是比较常用的集合对象,但是。只是简单的把关键⽅法加上了。包装为线程安全的集合。包中提供的线程安全的。
2025-02-15 10:41:04
1040
原创 JUC的常⻅类
如果某个线程不再使⽤了,并不是真正把线程释放,⽽是放到⼀个“池⼦”中,下次如果需要⽤到线程就直接从池⼦中取,不必通过系统来创建了。Callable 接口是⼀个泛型接口,相当于把线程封装了⼀个“返回值”,并且可以抛出异常,⽅便程序猿借助多线程的⽅式计算结果。可以看到,上述代码需要⼀个辅助类 Result,还需要使⽤⼀系列的加锁和 wait、notify 操作,代码复杂,容易出错。可以看到,使⽤ Callable 和 FutureTask 之后,代码简化了很多,也不必⼿动写线程同步代码了。
2025-02-15 10:40:32
930
原创 CAS比较并交换
再执⾏ CAS 操作,第⼀次 CAS 的时候发现 oldValue 和 value 不相等,不能进⾏赋值,因此需要进⼊循环,在循环⾥重新读取 value 的值赋给 oldValue。ABA问题是指在多线程环境下,一个变量的值可能在CAS操作期间被其他线程修改多次,导致CAS操作误认为变量的值没有发生变化,从而引发错误。这里的代码不是原⼦的,真实的 CAS 是⼀个原⼦的硬件指令完成的,这个伪代码只是辅助理解 CAS 的⼯作流程。CAS 可以视为是⼀种乐观锁,或者可以理解成 CAS 是乐观锁的⼀种实现⽅式。
2025-02-15 10:14:28
1198
原创 常见的锁策略
当线程尝试获取锁时,如果锁被其他线程占用,它不会进入阻塞状态,而是通过循环不断尝试获取锁。如果不做任何额外的限制,锁就是⾮公平锁,如果要想实现公平锁,就需要依赖额外的数据结构,来记录线程们的先后顺序。如果锁当前可用,线程可以直接获取锁,即使队列中已经有其他线程在等待。它通过维护一个计数器来记录锁被获取的次数,每次获取锁时计数器加1,每次释放锁时计数器减1,当计数器为0时,锁才真正释放。当一个线程请求获取重量级锁时,如果该锁已经被其他线程持有,则请求线程会被挂起并放入等待队列,直到锁被释放。
2025-02-15 10:11:20
1032
原创 双指针算法
因此只需要将每个数字看作⼀个节点, 数字变换的过程看作从⼀个节点移动到另⼀个节点的过程。定义快慢指针,慢指针每次移动一步,快指针每次移动两步。判断快慢指针相遇时所指向的数是否为 1,如果是 1,则是快乐数,否则,不是。此时,将最后一个元素置为 0,cur 向前移动一个位置,dest 向前移动两个位置。如果不是 0,则 dest 先向后移动一位,再交换 cur 和 dest 指向的元素;两边的指针向中间移动,则(right - left)一定是单调递减的。【就地操作】【双指针算法】【单调性 + 双指针】
2024-11-04 20:51:54
784
原创 计算机的一些基础知识
进程是操作系统进行资源分配的最小单位,这意味着各个进程互相之间是无法感受到对方存在的,这就是操作系统抽象出进程这一概念的初衷,这样便带来了进程之间互相具备**“隔离性(Isolation)”**。但现代的应用,要完成一个复杂的业务需求,往往无法通过一个进程独立完成,总是需要进程和进程进行配合地达到应用的目的,如此,进程之间就需要有进行“信息交换”的需求。一个逻辑处理器,并不是一次就把一个进程执行完,而是一个进程执行一会儿就休息一会儿,再去执行另一个进程,不停的轮换执行。
2024-11-03 23:59:52
1095
原创 第六章 LinkedList与链表
LinkedList 的官方文档LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。LinkedList实现了List接口;LinkedList的底层使用了双向链表;LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问;LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1);
2023-05-26 11:53:55
826
原创 第五章 ArrayList与顺序表
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下:说明ArrayList是以泛型方式实现的,使用时必须要先实例化;ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问;ArrayList实现了Cloneable接口,表明ArrayList是可以clone的;ArrayList实现了Serializable接口,表明ArrayList是支持序列化的;和Vector不同,ArrayList不是线程安全的。
2023-05-26 11:52:23
1109
原创 向上转移和向下转型
向上转型其中,fatherClass 是父类名称或接口名称,obj 是创建的对象,sonClass 是子类名称。向上转型就是把子类对象直接赋给父类引用,不用强制转换。使用向上转型可以调用父类类型中的所有成员,不能调用子类类型中特有成员,最终运行效果看子类的具体实现。向下转型其中,fatherClass 是父类名称,obj 是创建的对象,sonClass 是子类名称。
2023-05-15 08:58:30
426
原创 StringBuilder和StringBuffer
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的。// 追加:即尾插-->字符、字符串、整形数字 sb1 . append(' ');// 获取0号位上的字符:h System . out . println(sb1 . length());// 获取字符串的有效长度:14 System . out . println(sb1 . capacity());
2023-05-15 08:56:41
596
原创 抽象类和接口的区别
如之前写的 Animal 例子,此处的 Animal 中包含一个 name 这样的属性, 这个属性在任何子类中都是存在的,因此,此处的Animal 只能作为一个抽象类,而不应该成为一个接口。抽象类存在的意义是为了让编译器更好的校验,像 Animal 这样的类我们并不会直接使用,而是使用它的子类。抽象类中可以包含普通方法和普通字段,这样的普通方法和字段可以被子类直接使用(不必重写);抽象类和接口都是 Java 中多态的常见使用方式。接口中不能包含普通方法,子类必须重写所有的抽象方法。
2023-05-15 08:52:22
83
原创 深拷贝和浅拷贝
如上代码,我们可以看到,通过clone,我们只是拷贝了 Student 对象,但是 Student 对象中的 Money 对象并没有拷贝。通过 student2 这个引用修改了 money 的值后,student2 这个引用访问 money 的时候,值也发生了改变。创建一个新对象/新数组,将原对象/原数组的各项属性的“值”(数组的所有元素)拷贝过来,是“值”而不是“引用”。(修改新对象/新数组。将原对象/原数组的引用直接赋给新对象/新数组,新对象/新数组只是原对象/原数组的一个引用。(修改新对象/新数组。
2023-05-15 08:50:43
87
原创 重写和重载的区别
在自然语言中,一个词语如果有多重含义,那么就说该词语被重载了,具体代表什么含义需要结合具体的场景。在Java中方法也是可以重载的。最好的方式是:重新定义一个新的类,来重复利用其中共性的内容,并且添加或者改动新的内容。重写是子类对父类非静态、非private修饰、非final修饰、非构造方法等的实现过程进行重新编写,重写的好处在于子类可以根据需要,定义特定于自己的行为,也就是说子类能够根据需要实现父类的方法。方法重载是一个类的多态性表现,而方法重写是子类与父类的一种多态性表现。
2023-05-15 08:49:30
634
原创 第十一章 异常
Java 中虽然已经内置了丰富的异常类,但是并不能完全表示实际开发中所遇到的一些异常,此时就需要维护符合我们实际情况的异常结构。例如, 我们实现一个用户登陆功能if(!} if(!} System . out . println("登陆成功");} }此时我们在处理用户名密码错误的时候可能就需要抛出两种异常。我们可以基于已有的异常类进行扩展(继承),创建和我们业务相关的异常类。自定义异常类,然后继承自Exception 或者 RunTimeException。
2023-05-14 19:01:55
649
原创 第十章 String 类
由于String的不可更改特性,为了方便字符串的修改,Java中又提供StringBuilder和StringBuffer类。这两个类大部分功能是相同的。**方法 **说明str)在尾部追加,相当于String的+=,可以追加:boolean、char、char[]、double、float、int、long、Object、String、StringBuff的变量获取index位置的字符获取字符串的长度获取底层保存字符串空间总的大小扩容char ch)将index位置的字符设置为ch。
2023-05-14 19:01:01
822
原创 第四章 List接口
在集合框架中,List是一个接口,继承自Collection。Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。List中提供了好的方法,具体如下:**方法 **解释尾插 e将 e 插入到 index 位置尾插 c 中的元素。
2023-05-13 21:27:35
843
原创 第三章 包装类&泛型
JAVA 推出泛型以前,程序员可以构建一个元素类型为Object的集合,该集合能够存储任意的数据类型对象,而在使用该集合的过程中,需要程序员明确知道存储每个元素的数据类型,否则很容易引发异常。方法限定符 < 类型形参列表 > 返回值类型 方法名称(形参列表) {. . . }
2023-05-13 21:26:45
529
原创 第二章 时间和空间复杂度
一个算法执行所耗费的时间,从理论上说,是不能算出来的,只有你把你的程序放在机器上跑起来,才能知道。实例4基本操作执行最好N次,最坏执行了(N*(N-1))/2次,通过推导大O阶方法+时间复杂度一般看最坏,时间。时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。实例1基本操作执行了2N+10次,通过推导大O阶方法知道,时间复杂度为 O(N)。实例2基本操作执行了M+N次,有两个未知数M和N,时间复杂度为 O(N+M)实例6执行了N次,每次执行1此,时间复杂度为O(N)。
2023-05-13 21:25:11
587
原创 第一章 集合框架
官方教程Java 集合框架,又被称为容器container,是定义在java.util包下的一组接口 interfaces和其实现类 classes。其主要表现为将多个元素 element 置于一个单元中,用于对这些元素进行快速、便捷的存储 store 、检索 retrieve 、管理 manipulate ,即平时我们俗称的增删查改CRUD。例如,一副扑克牌(一组牌的集合)、一个邮箱(一组邮件的集合)、一个通讯录(一组姓名和电话的映射关系)等等。
2023-05-13 21:22:46
653
原创 this和super
this引用指向当前对象(成员方法运行时调用该成员方法的对象),在成员方法中所有成员变量的操作,都是通过该引用去访问。只不过所有的操作对用户是透明的,即用户不需要来传递,编译器自动完成。this引用的是调用成员方法的对象。
2023-05-10 11:32:03
682
原创 第八章 继承和多态
成员方法没有同名时,在子类方法中或者通过子类对象访问方法时,则优先访问自己的,自己没有时再到父类中找,如果父类中也没有则报错。
2023-04-28 08:09:10
1148
原创 第七章 类和对象
Java是一门纯面向对象的语言(Object Oriented Program,简称OOP),在面向对象的世界里,一切皆为对象。面向对象是解决问题的一种思想,主要依靠对象之间的交互完成一件事情。用面向对象的思想来涉及程序,更符合人们对事物的认知,对于大型程序的设计、扩展以及维护都非常友好。面相对象程序设计关注的是对象,而对象是现实生活中的实体,比如:洗衣机。但是洗衣机计算机并不认识,需要开发人员告诉给计算机什么是洗衣机。上图左侧就是对洗衣机简单的描述,该过程称为对洗衣机对象实体进行抽象。
2023-04-23 10:59:12
1460
原创 第六章 数组的定义与使用
数组:是相同类型元素的一个集合。在内存中是一段连续的空间。比如现实中的车库:1. 数组中存放的元素其**类型相同**2. 数组的空间是**连续存放**的3. 每个空间有自己的编号,其实位置的编号为0,即数组的**下标**
2023-04-18 12:37:20
684
原创 第五章 方法
就是一个代码片段,类似于 C 语言中的 “函数”。是能够模块化的组织代码(当代码规模比较复杂的时候).做到代码被重复使用, 一份代码可以在多个位置使用.让代码更好理解更简单.直接调用现有方法开发, 不必重复造轮子.方法语法格式// 方法定义 修饰符 返回值类型 方法名称([ 参数类型 形参 . . . ]) {方法体代码;[ return 返回值 ];**示例:**实现一个函数,检测一个年份是否为闰年。
2023-04-17 10:58:31
306
原创 第四章 逻辑控制
①②④③—>②④③—>②④③—>②④③—>②④③—>②④③—>…—>②为false,循环结束。if-else语句如果不加大括号{},则只能写一条语句,且else与最近的if匹配。如果布尔表达式结果为true,则执行if中语句,否则执行else中语句。表达式1成立,执行语句1,否则表达式2成立,执行语句2,否则执行语句3。先执行循环语句, 再判定循环条件,循环条件成立则继续执行,否则循环结束。如果布尔表达式结果为true,执行if中的语句,否则不执行。循环条件为 true,则执行循环语句;
2023-04-15 18:47:24
723
原创 第三章 运算符
int a = 10;int b = 20;a + b;a < b;上述 + 和 < 等就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量。Java中运算符可分为以下:算术运算符(+ - * /)、关系运算符(< > ==)、逻辑运算符、位运算符、移位运算符以及条件运算符等。
2023-04-13 12:46:01
626
原创 第二章 数据类型与变量
常量即程序运行期间,固定不变的量称为常量。以上:100、3.14、A、true、false都是常量,将其称为字面常量。字面常量的分类:注意:字符串、整形、浮点型、字符型以及布尔型,在Java中都称为数据类型。在Java中数据类型主要分为两类:基本数据类型和引用数据类型。基本数据类型有四类八种:注意:在程序中,除了有始终不变的常量外,有些内容可能会经常改变,比如:人的年龄、身高、成绩分数、数学函数的计算结果等,对于这些经常改变的内容,在Java程序中,称为变量。而数据类型就是用来定义不同种类变量的。定义变量
2023-04-13 12:43:52
510
原创 第一章 初始Java
Java 是一种优秀的程序设计语言,它具有令人赏心悦目的语法和易于理解的语义。不仅如此,Java还是一个有一系列计算机软件和规范形成的技术体系,这个技术体系提供了完整的用于软件开发和跨平台部署的支持环境,并广泛应用于嵌入式系统、移动终端、企业服务器、大型机等各种场合。
2022-05-30 21:06:50
632
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人