自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 97- 反射

反射允许对成员变量,成员方法和构造方法的信息进行编程访问。反射(reflection)是一种能够在运行时检查、解析和修改程序结构(例如类、接口、方法和属性等)的能力。它是许多现代编程语言中提供的一种功能,使得程序能够动态地获取和操作它们自身的信息。通过反射,程序可以在运行时获取对象的类型信息,检查类的成员(如字段、方法和构造函数),调用方法和访问/修改属性。它允许程序以一种通用的方式与对象进行交互,而不需要提前了解对象的具体类型和结构。

2023-09-19 16:18:51 203

原创 96- TCP 三次握手和四次挥手

第二步(SYN+ACK):服务器接收到客户端的请求后,会发送一个带有SYN和ACK标志位的数据包作为响应。第四步(ACK):发送方收到接收方的关闭请求后,会回复一个带有ACK标志位的数据包作为确认,表示已经接收到关闭请求。第二步(ACK):接收到FIN的一方(通常是服务器)会回复一个带有ACK标志位的数据包作为确认,表示已经接收到关闭请求。需要注意的是,四次挥手中的各个步骤可能会因为网络延迟、丢包或重复数据包等原因出现异常情况,因此TCP协议在设计上也具有一定的容错和恢复机制,以确保连接的可靠关闭。

2023-09-19 16:18:38 202

原创 95- 网络编程三要素

IPv4地址的不足之一是地址空间有限,只有约42亿个可分配的地址,随着互联网的快速发展,IPv4地址耗尽的问题逐渐凸显。虽然IPv4仍然广泛使用,但随着IPv4地址耗尽,IPv6被认为是未来互联网的发展趋势,能够支持更多设备的连接和更广阔的互联网应用场景。广播地址:以网络地址的所有主机位都设置为1来表示该网络上所有主机的地址,例如192.168.0.255是一个广播地址,用于向同一网络中的所有主机发送数据。简化的报头:IPv6的报头相比IPv4更加简洁,减少了路由器进行处理的负担,并提高了网络传输效率。

2023-09-19 16:17:41 286

原创 94- 悲观锁、乐观锁、CAS

在悲观锁中,当一个线程要访问共享资源时,它会先获取锁,其他线程需要等待该线程释放锁才能继续执行。乐观锁是一种并发控制机制,与悲观锁相反,它假设在多线程环境下并发冲突的情况很少发生,因此采取乐观的态度,在访问共享资源时不加锁,而是在更新时检查是否有其他线程同时修改了该数据。当一个线程要更新资源时,先读取当前版本号,然后执行更新操作,并将新的版本号写回。悲观锁是一种并发控制机制,它假设在多线程环境下会有并发冲突的情况发生,因此采取悲观的态度,在访问共享资源之前先将其锁住,以防止其他线程对其进行修改。

2023-09-19 16:17:24 86

原创 93- JMM 内存模型

原子性:JMM 保证所有的变量(除了 long 和 double 类型的变量)的读取和赋值操作都是原子性的。JMM 主要任务是定义了 JVM 如何在内存中存储和操作数据,以及各个线程如何访问这些共享数据。有序性:JMM 规定了在单线程内操作的执行顺序按照程序编写的顺序来执行,但在多线程之间无法保证操作指令的顺序,可能会出现指令重排的情况。JMM 是建立在计算机硬件内存模型之上的一种抽象模型,它规定了程序中所有对共享变量的读写都必须遵循一定的规则,以保证多线程环境下共享数据的正确性和可见性。

2023-09-18 18:45:53 51

原创 92- volatile 关键字

原子性是指一个操作是不可中断的,要么全部执行成功并且对其他线程可见,要么不执行。换句话说,原子性保证了一个操作在多线程环境下要么完全执行,要么不执行,不存在执行一部分的情况。在并发编程中,原子性是确保多线程操作共享数据的一致性和正确性的重要概念。如果一个操作是原子的,那么无论多少个线程并发执行该操作,其结果都是符合预期的,不会出现数据异常或不一致的情况。原子操作是不可分割的:原子操作是不可被中断或分割的,要么全部执行成功,要么不执行。在执行原子操作期间,不会有其他线程能够看到中间状态的结果。

2023-09-18 18:42:16 66

原创 92- 线程池

线程池(Thread Pool)是一种用于管理和重用线程的技术,它可以在需要执行任务的时候,从线程池中获取空闲线程来执行任务,而无需频繁地创建和销毁线程。线程池可以提高应用程序的性能和资源利用率。

2023-09-18 14:34:08 63

原创 91- 等待唤醒机制(阻塞队列)

阻塞是指线程在某些条件下被暂停执行,进入等待状态,直到满足特定条件才能继续执行的一种机制。在多线程编程中,当一个线程需要访问共享资源或等待某个事件发生时,可能会发生阻塞。线程可以通过调用阻塞方法来实现阻塞,例如等待锁、等待某个条件满足、等待输入输出等。在阻塞的过程中,线程会暂停执行,不占用CPU资源,并且会释放掉它占有的某些资源(如锁),以便其他线程可以获取这些资源并继续执行。当满足特定条件时,线程将被唤醒,重新获得资源,并继续执行。阻塞可以用于实现线程间的同步和协作。

2023-09-18 13:22:50 181

原创 90- 死锁和生产者和消费者

循环等待条件:存在循环等待的资源关系,即线程A等待线程B占有的资源,线程B又在等待线程C占有的资源,以此类推,最后线程N又在等待线程A占有的资源。设置超时时间:在获取锁时设置超时时间,在一定的等待时间后如果没有成功获取到锁,则释放已经持有的锁,避免无限等待。按顺序获取锁:规定线程获取锁的顺序,确保所有线程按照相同的顺序获取锁,减少发生死锁的可能性。不可剥夺条件:已经分配给一个线程的资源不能被其他线程强行抢占,只能由持有该资源的线程释放。例如,一把锁同一时间只能被一个线程获取。

2023-09-18 13:04:24 171

原创 89- lock 锁

Lock锁是Java提供的一种高级线程同步机制,相比于synchronized关键字,它提供了更多的功能和灵活性。

2023-09-18 12:27:51 42

原创 88- 同步代码块和同步方法

synchronized (锁对象) {// 需要同步执行的代码块其中,锁对象是用来进行同步的对象。锁对象,一定要是唯一的。同步代码块内的代码在执行时,只能由一个线程获得锁对象的锁,其他线程会被阻塞,直到该线程释放锁。count++;// 需要同步的操作同步代码块的使用可以确保多个线程对共享资源的访问是同步的,避免了线程安全问题。通过控制同步代码块的访问,可以保证在同一时间只有一个线程能够访问临界区,从而避免数据竞争和不一致的情况发生。

2023-09-18 12:10:33 303

原创 87- 线程的安全问题

线程安全问题是指多个线程同时访问共享的资源时可能导致的数据不一致、竞态条件或其他不可预期的错误情况。在多线程编程中,如果不正确地处理线程间共享数据的访问,就会出现线程安全问题。

2023-09-18 11:38:40 46

原创 86- 线程的生命周期

在阻塞状态下,线程不会占用CPU时间,直到等待的条件满足时,它会重新进入就绪状态,等待CPU分配时间片。线程在3秒后完成任务,并释放锁,主线程得到锁并执行后续代码,线程进入死亡状态。在运行状态下,线程通过synchronized关键字得到了一个对象锁,然后调用wait()方法进入阻塞状态,等待其他线程释放锁。死亡状态:当线程退出run()方法后,线程就进入死亡状态。在上述示例中,线程首先进入新建状态,然后调用start()方法进入就绪状态,并开始执行run()方法中的代码,进入运行状态。

2023-09-18 11:10:08 58

原创 85- 多线程中常见的成员方法

我们通过运行这段代码,可以观察到线程1的运行次数较少,而线程2的运行次数较多。实际上,线程的调度顺序是由操作系统决定的,并且受到多个因素的影响,如线程的优先级、线程的状态、调度算法等。在多线程编程中,礼让线程是一种线程间的合作机制,它允许一个线程主动放弃当前的CPU执行权,让其他线程有机会执行。线程的优先级是指在多线程环境下,操作系统对线程调度的一种依据,用于确定线程获得 CPU 执行时间的相对权重。当一个线程调用另一个线程的join()方法时,它会暂停自己的执行,并等待被调用线程执行完成后再继续执行。

2023-09-18 11:02:32 43

原创 84- 多线程概述和三种实现方式

多线程是指在一个程序中同时运行多个独立的执行线程。线程是计算机进行调度和执行任务的最小单位,一个进程可以包含多个线程,每个线程可以独立执行不同的任务。在单线程的程序中,代码是按照顺序依次执行的。而在多线程的程序中,不同的线程可以并发地执行不同的代码片段,从而可以同时处理多个任务,提高程序的性能和并发处理能力。// 线程任务逻辑i

2023-09-18 02:44:20 157

原创 83- commons-io 工具包

1.IOUtils(数据相关)拷贝方法:copy(InputStream input, OutputStream output): 将输入流的内容拷贝到输出流。 copyLarge(InputStream input, OutputStream output): 将输入流的内容拷贝到输出流,适用于大文件或大量数据。 copy(Reader input, Writer output): 将字符输入流的内容拷贝到字符输出流。 copyLarge(Reader input, Writer outpu

2023-09-18 02:02:17 74

原创 82- IO解压缩流、压缩流

解压缩流和压缩流是用于处理文件压缩和解压缩的类。在Java中,主要使用 java.util.zip 包提供的类进行压缩和解压缩操作。

2023-09-18 01:34:39 158

原创 81- IO打印流

IO打印流是Java中用于进行格式化输出的类,主要有PrintStream和PrintWriter两个子类。它们提供了一系列方法来将数据以可读的文本形式输出到指定的目标,例如控制台、文件或网络流。

2023-09-18 00:54:25 54

原创 80- IO序列化流

IO序列化流是Java IO中用于对象的序列化和反序列化的流。它主要包括ObjectOutputStream和ObjectInputStream两个类。使用IO序列化流可以方便地将对象转换为字节流进行网络传输、保存到文件或通过其他方式进行持久化存储。当需要将对象恢复为原始的Java对象时,可以使用反序列化操作。在上述代码中,我们创建了一个名为MyObject的简单自定义类,并实现了Serializable接口,这允许该类的对象可以被序列化。

2023-09-18 00:24:14 66

原创 79- IO转换流

IO转换流(InputStreamReader 和 OutputStreamWriter)是在处理文本数据时,字符流更为方便,而字节流则适合处理二进制数据。但是,有些情况下,我们可能需要将字节流转换为字符流或将字符流转换为字节流。这时就可以使用IO转换流。IO转换流通过将输入的字节流转换成字符流,或将输出的字符流转换成字节流,以实现字符和字节之间的相互转换。使用IO转换流的好处是可以灵活地处理文本数据,通过提供不同的字符集编码参数,可以处理多种编码格式的数据。

2023-09-17 21:46:43 73

原创 78- IO字符缓冲流

3.读取数据:通过调用字符缓冲输入流的 readLine() 方法读取数据。该方法会一次读取一行数据,并返回一个字符串。6.写入数据:通过调用字符缓冲输出流的 write() 方法写入数据。4.创建字符输出流:同样地,需要创建一个字符输出流,可以是文件输出流或其他字符输出流。8.关闭流:使用完字符缓冲流后,需要关闭它们以释放相关资源。1.创建字符输入流:首先,需要创建一个字符输入流,可以是文件输入流或其他字符输入流。

2023-09-17 19:22:06 62

原创 77- IO字节缓冲流

字节缓冲流(Byte Buffered Stream)是Java中用于提高字节输入输出效率的流类。它们是字节输入流和字节输出流的装饰器,通过内部缓冲区的机制来减少对底层资源的频繁访问,从而提高读写性能。

2023-09-17 18:36:08 72

原创 76- IO字符输出流基本用法

在Java中,使用Reader和Writer类来表示字符流,它们是InputStreamReader和OutputStreamWriter的子类,因此也包含了对字节流的支持。

2023-09-17 16:20:36 59

原创 75- IO字符输入流基本用法

字符流是Java中处理字符输入输出的一种抽象,以字符为单位进行输入输出,可以用于读写文本文件、网络通信等操作。与字节流不同,字符流直接操作字符数据而不是原始字节,更方便地处理文本数据,并且可以避免编码和解码的麻烦。在Java中,使用Reader和Writer类来表示字符流,它们是InputStreamReader和OutputStreamWriter的子类,因此也包含了对字节流的支持。此外,字符流还具有一些其他优点,如操作字符串数组、字符串切片、自动缓冲等,因此在处理文本数据时非常方便和实用。

2023-09-17 15:44:15 70

原创 74- 字符集详解(ASCII、GBK、Unicode)

GBK编码使用了一个高字节和低字节的组合来表示一个字符,其中高字节位于0x81-0xFE的范围内,低字节在0x40-0x7E和0x80-0xFE之间。Unicode与具体的编码方案有所区别,最常用的编码方案是UTF-8、UTF-16和UTF-32。GBK(GuoBiao Kuozhan)是中华人民共和国国家标准GB 2312的扩展编码形式,它采用双字节编码方案,提供对汉字、拉丁字母、符号和其他特殊字符的支持。Unicode的目标是提供一个全球通用的字符编码标准,以解决不同语言和文化之间的字符表示问题。

2023-09-17 15:21:18 173

原创 73- IO 字节输入流基本用法

在上述代码中,首先创建了一个 FileInputStream 对象,然后定义了一个缓冲区 buffer,用于存储一次读取的字节数据。在示例代码中,我们简单地将字节数据转换为字符串,并打印输出。注意,在使用 read(byte[] buffer) 方法时,需要确保提供的字节数组足够大以容纳实际读取的字节数据,否则可能会截断部分字节。另外,由于读取操作是阻塞的,如果在读取时没有数据可用,程序将会等待,直到有数据可读或遇到异常。这个方法会将指定长度的字节数据读取到提供的字节数组中,并返回实际读取的字节数。

2023-09-17 14:33:47 100

原创 72- IO 字节输出流基本用法

Java中的IO字节流是用于读取和写入字节数据的流。

2023-09-17 03:52:03 57

原创 71- IO流概述及分类

I/O(Input/Output)流是用于数据输入和输出的机制。它是计算机程序与外部世界(文件、网络连接、设备等)进行交互的一种方式。在计算机中,数据通常以流的形式进行传输。I/O 流提供了一种流式传输数据的方式,程序可以从流中读取数据(输入)或向流中写入数据(输出)。I/O 流可以连接到不同的数据源和目标,如文件、网络套接字、内存、控制台等。I/O 流提供了一组类和接口用于实现不同的输入和输出需求。

2023-09-17 00:21:22 41

原创 70- File 练习(创建\查找\删除\统计)递归思想

System.out.println("该文件夹中存在以 .avi 结尾的文件。");} else {System.out.println("该文件夹中不存在以 .avi 结尾的文件。");if (files!= null) {

2023-09-16 22:50:14 61

原创 69- File 常见的成员方法

【代码】69- File 常见的成员方法。

2023-09-16 18:48:55 45

原创 68- File 概述和三种构造方法

File 是一个在Java中表示文件和目录路径名的抽象表示。它不仅可以用于操作实际的文件系统中的文件和目录,还可以在Java程序中进行文件和目录的访问、操作和查询。File 类提供了一系列方法来处理文件和目录,包括创建、删除、重命名、复制、移动等。它也可以查询文件和目录的属性,比如文件大小、最后修改时间等。在Java的标准库中,File 类被广泛应用于文件和目录的处理。

2023-09-16 17:00:09 166

原创 67- 自定义异常

使用class关键字创建一个新的类,并继承现有的异常类。// 添加构造函数和其他需要的方法在需要抛出自定义异常的地方,使用throw关键字手动抛出自定义异常对象。// ... 一些代码 ...throw new MyCustomException("这是一个自定义异常");当程序执行到throw语句时,将抛出自定义异常对象,并中断当前方法的执行。该异常可以被上层调用者捕获和处理。try {// 可能抛出自定义异常// 处理自定义异常。

2023-09-16 13:18:36 58

原创 66- 异常的常见方法及throw、throws 抛出异常处理

2.getCause():获取引发当前异常的原因(即导致当前异常的异常)。3.printStackTrace():将异常的跟踪栈信息输出到标准错误流。4.getStackTrace():获取异常的跟踪栈信息,返回一个表示栈轨迹元素的数组。5.toString():返回异常的字符串表示,通常包括异常类的名称和简短描述。二、抛出处理1、throwsthrows关键字用于在方法签名中声明可能抛出的异常,从而将异常的处理责任交给调用该方法的代码。当一个方法声明了thr

2023-09-16 13:05:50 159

原创 65- 异常及异常捕获(try/catch)

Java 异常是在程序运行期间发生的非正常情况,例如输入错误、网络故障等,这些异常会导致程序运行出现问题或停止运行。在 Java 中,异常是以类的形式存在的,它们都继承自 Throwable 类。在这个异常体系结构中,Error 表示系统级别的错误,一般由 JVM 抛出,程序无法处理。例如:OutOfMemoryError、StackOverflowError 等。Exception 是可检查的异常的父类,表示程序运行时发生的异常情况。它有许多子类和继承层次,其中包括 RuntimeException。

2023-09-16 02:33:45 217

原创 64- 方法引用

方法引用是Java 8中Lambda表达式的一个重要特性,它可以直接引用现有的方法作为Lambda表达式的实现。使用方法引用可以简化Lambda表达式,并且使代码更加简洁易懂。

2023-09-15 23:39:37 57

原创 63- Stream流

Stream流思想是一种函数式编程的思想,它提供了一种流式处理集合数据的方式。它的核心思想是将操作集合的过程抽象为一系列的中间操作和终止操作,并通过方法链的方式来组合这些操作。Stream是Java 8引入的一个用于处理集合数据的API。它提供了一种声明式的编程方式,可以对集合数据进行各种操作,如过滤、映射、排序、聚合等。是对Stream对象进行处理的过程,在中间操作之后可以继续执行其他中间操作或者执行终止操作。

2023-09-15 23:10:09 40

原创 62- 不可变集合

62- 不可变集合。

2023-09-15 18:24:38 70

原创 61- Collections 工具类

java.util.Collections 是 Java 提供的一个工具类,它包含了各种用于操作集合(Collection)和数组的静态方法。Collections 类提供了一系列的方法,用于对集合进行排序、查找、替换等操作,以及创建线程安全的集合。

2023-09-15 16:58:57 41

原创 60- 可变参数

可变参数(Variable Arguments),也称为可变长度参数或不定参数,是一种特殊的方法参数类型,用于接受数量可变的参数。需要注意的是,可变参数本质上是一个数组,因此可以传递一个整数数组给可变参数方法。

2023-09-15 14:48:43 42

原创 59- TreeMap

TreeMap 是 Java 中的一种集合类,它实现了 SortedMap 接口,提供了基于红黑树的有序映射。与普通的 HashMap 不同,TreeMap 中的键值对是按照键的顺序进行排序的。

2023-09-15 14:17:03 53

空空如也

空空如也

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

TA关注的人

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