JavaEE 初级篇
文章平均质量分 95
深入了解计算机是如何工作的
小扳
有一天,小扳手走进了一家五金店。它看到了各种各样的工具,有锤子、钳子、螺丝刀等等。小扳手觉得自己在这里太小了,不起眼,很容易被忽视。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
JavaEE 初阶篇-深入了解网络原理 TCP/IP 协议
TCP 协议在传输层,TCP 是传输层协议的一种,传输层中的协议不单单只有 TCP 或者 UDP。当应用层将数据打包后交给传输层时,如果选择使用 TCP 协议,传输层会在数据包上加上 TCP 报头;如果选择使用 UDP 协议,传输层会在数据包上加上 UDP 报头。1)MSL 是 TCP 报文的最大生存时间,因此 TIME_WAIT 持续存在 2 MSL 的话,就能保证在两个传输方向上的尚未接收或者迟到的报文都已经消息。原创 2024-05-14 21:13:05 · 2087 阅读 · 64 评论 -
JavaEE 初阶篇-深入了解 HTTP 协议
请求头:包含一系列的键值对,用于传递请求的元数据信息,如 User-Agent(用户代理)、Host(主机名)、Content-Type(内容类型)等。请求由请求行、请求头和请求体组成,响应由状态行、响应头和响应体组成。接着,服务端接收到来自客户端发送的请求,先验证发送的请求行是否正确,接着响应客户端请求的数据。状态行包含了响应的状态码和描述,响应头包含了响应的元数据信息,空行用于分隔响应头和响应体,响应体包含了实际的响应数据。1)请求行:包含请求方法、请求的 URL 和协议版本。原创 2024-05-09 14:49:37 · 2276 阅读 · 80 评论 -
JavaEE 初阶篇-深入了解 Junit 单元测试框架和 Java 中的反射机制(使用反射做一个简易版框架)
可以用来对方法进行测试,它是第三方公司开源出来的(很多开发工具已经集成了 Junit 框架,比如 IDEA)优点:1)可以灵活的编写测试代码,可以针对某个方法执行测试,也支持一键完成对全部方法的自动化测试,且各自独立。2)不需要程序员去分析测试结果,会自动生成测试报告出来。具体步骤:1)将 Junit 框架的 jar 包导入到项目中(注意:IDEA 集成了 Junit 框架,不需要我们手动导入)原创 2024-05-03 16:39:21 · 4959 阅读 · 111 评论 -
JavaEE 初阶篇-深入了解网络原理中传输层的端口号与 UDP 协议报文格式
如果一个进程绑定多个端口号,是否可行呢?除了 CRC 的算法还有 MD5 算法。如何确认在当前机器上,某个端口是否被其他进程使用了呢?在同一个机器上,同一个时刻内,端口号不能重复被绑定。UDP 数据报 = UDP 报头 + UDP 载荷。3)两个进程不能绑定同一个端口号。原创 2024-05-01 11:55:40 · 3474 阅读 · 66 评论 -
JavaEE 初阶篇-深入了解特殊文件(Properties 属性文件、XML)
Properties 属性文件是Java中一种常见的配置文件,用于存储键值对。它通常以“.properties”为后缀,采用“key=value”的格式来存储数据,其中“key”表示属性名,而“value”表示属性值。XML 可扩展标记语言,是一种用于存储和传输数据的标记语言。XML 被设计用来传输和存储数据,同时具有自我描述性和可扩展性的特点。XML 的语法规则比较严格,它使用标签来标记数据,标签可以自定义,从而使 XML 具有很强的灵活性。原创 2024-04-29 17:24:55 · 2684 阅读 · 81 评论 -
JavaEE 初阶篇-深入了解 I/O 高级流(缓冲流、交换流、数据流和序列化流)
缓冲流(Buffered Stream)来提高 I/O 操作的效率,缓冲流是对字节流和字符流的一种封装,通过缓冲区来减少 I/O 操作的次数,从而提高程序的运行效率。简单来说,InputStreamReader 将读取的字节流转化为字符流,并且如果读取的是用 GBK 编码集进行编码的,在 UTF 环境下进行编码时,则需要指定用 GBK 编码集进行编码。序列化流是 Java I/O 中的一种特殊流,用于将对象转换为字节序列以便存储或传输,或将字节序列转换回对象。主要是为了,方便取数据而不是给程序员看的。原创 2024-04-26 20:12:30 · 2763 阅读 · 69 评论 -
JavaEE 初阶篇-深入了解 UDP 通信与 TCP 通信(综合案例:实现 TCP 通信群聊)
先创建 ServerSocket 类,用有参构造器 ServerSocket(int port) 创建指定端口号的对象,再用 accept() 方法来等待接收来自客户端发送来的连接请求,客户端与服务端连接完毕之后,就会返回一个 Socket 对象给服务端,该 Socket 对象可以理解为管道的服务器的一端,客户端已经有 Socket 对象了,该对象就可以理解为管道的客户端的一端。用于创建客户端、服务端。由于 IP 的限制(IP 为内网),不能让其他的机器连接目前的机器,所以只能本机的程序连接本地的程序。原创 2024-04-25 15:34:53 · 2752 阅读 · 69 评论 -
JavaEE 初阶篇-深入了解网络通信相关的基本概念(三次握手建立连接、四次挥手断开连接)
第一次握手(SYN):客户端向服务器发送一个带有 SYN 标志的数据包,表示请求建立连接。此时客户端进入 SYN_SENT 状态。简单来说,第一次握手可以说明:客户端此时是否具备发消息的能力。第二次握手(SYN + ACK):服务器接收到客户端发送的 SYN 数据包后,向客户端发送一个带有 SYN 和 ACK 标志的数据包,表示确认收到请求,并同意建立连接。此时服务器进入 SYN_RECV 状态。简单来说,第二次握手可以说明:假设服务端收到了来自客原创 2024-04-24 15:06:06 · 1875 阅读 · 66 评论 -
JavaEE 初阶篇-深入了解 I/O 流(FileInputStream 与 FileOutputStream 、Reader 与 Writer)
如果文件已存在,会覆盖原有内容,也可以给构造器中再传入一个参数 true ,以支持继续追加,不会覆盖原有的内容。每次调用 read() 方法会读取一个字节,并返回读取的字节数据(以 int 类型表示,范围为 0 到 255),如果已到达文件末尾,则返回 -1。如果文件过大,创建的字节数组也会过大,可能引起内存溢出。字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效。定义一个与文件一样大小的字节数组,一次性读取完文件的全部字节。使用字节流读取中文,如何保证输出不乱码,怎么解决?原创 2024-04-21 22:31:12 · 2670 阅读 · 95 评论 -
JavaEE 初阶篇-深入了解 File 文件操作(实现文件搜索、非空文件夹删除)
在 Java 中,File 类是用于表示文件和目录路径的类,它提供了一组方法来操作文件系统中的文件和目录。File 类位于 java.io 包中,是 Java 中处理文件和目录的基本类之一。文件是非常重要的存储方式,在计算机硬盘中,即便断电,或者程序终止了,存储在硬盘文件中的数据也不会丢失。通过 File 类可以创建文件对象,从而获取文件信息(大小,文件名,修改时间),判断文件的类型,删除文件/文件夹等等。重点要注意的是:File 类只能文件本身进行操作,不能读写文件里面存储的数据。原创 2024-04-21 18:26:49 · 1720 阅读 · 37 评论 -
JavaEE 初阶篇-线程安全的集合类、多线程环境使用 ArrayList、队列、哈希表(HashMap 、ConCurrentHashMap 、HashTable 的区别)
只对写操作进行加锁,加锁的方式仍然是 synchronized ,但是不是锁整个对象,而是“锁桶”,每一个链表的头节点作为锁对象,大大降低了锁冲突的概率。由于哈希表是由数组与链表或者红黑树组成的,数组的长度很长,因此相对链表的长度来说,链表的长度就很短了,所以在多线程中,对数组中的某一个链表大概率是不会冲突的,因此即使每一个链表都上锁了,这个锁也大概率是偏向锁,大概率是没有加锁和解锁的开销。扩容期间,新老数组同时存在。是一个线程安全的集合类,所有对 HashTable 的操作都是同步的,即线程安全的。原创 2024-04-14 22:33:41 · 1837 阅读 · 24 评论 -
JavaEE 初阶篇-深入了解 CAS 机制中的 ABA 问题、synchronized 加锁过程、 ReentrantLock 与 synchronized 的区别、常见信号量操作等
举个例子讲述 ABA 的问题:假设:现在有两个线程 T1、T2 ,对共享变量 num 进行操作,num 的初识值为 A。接下来,T1 线程想要将 num 的值改为 Z ,根据 CAS 机制可知,首先将 num 从主内存中读取到 T1 线程的工作内存中,接着就是比较当前主内存的 num 中的值与工作内存中的值是否相同。如果主内存 num 的值还是 A 时,则默认会认为没有其他线程“动过”该变量,这时就可以将 num 的值改为 Z 后,交换到主内存中。原创 2024-04-14 20:38:22 · 1350 阅读 · 3 评论 -
JavaEE 初阶篇-深入了解 CAS 机制与12种锁的特征(如乐观锁和悲观锁、轻量级锁与重量级锁、自旋锁与挂起等待锁、可重入锁与不可重入锁等等)
轻量级锁和重量级锁是 Java 中用于实现同步的两种锁机制,用于保护共享资源在多线程环境下的访问。它们的设计目的是为了在不同情况下提供更高效的并发控制。synchronized 是轻量级锁也是重量级锁。自旋锁和挂起等待锁是两种不同的锁机制,它们在处理线程同步和互斥时有不同的实现方式和特点。synchronized 是自旋锁也是挂起锁。公平锁和非公平锁是两种不同的锁策略,它们主要影响了锁的获取顺序和公平性。synchronized 是非公平锁。原创 2024-04-12 22:04:08 · 2218 阅读 · 101 评论 -
JavaEE 初阶篇-深入了解定时器、工厂模式和比较器
定时器(Timer)是 Java 中用于执行定时任务的工具类,可以在指定的时间点执行某个任务,也可以按照一定的时间间隔重复执行任务。定时器提供了一种简单而有效的方式来安排任务的执行。定义一个任务类 MyTask ,成员变量有Runnable 类型 runnable 变量long 类型的 time 变量。利用构造方法获取值即可。其中换算成具体什么时间执行。该 Task 类需要实现Comparable 接口重写 compareTo() 方法。原创 2024-04-11 17:35:10 · 1828 阅读 · 59 评论 -
JavaEE 初阶篇-深入了解线程池(线程池创建、线程池如何处理任务)
假设用户发起一个请求,后台就需要创建一个新线程来处理,下次新任务来了肯定又要创建新线程处理的,而创建新线程的开销是很大的,并且请求过多时,肯定会产生大量的线程出来,这样会严重影响系统的性能。该方法创建出来的线程池特点为,当任务越多时候,线程池中的线程数量也会随之增加。很惊奇的发现,核心线程竟然是 0 个,而临时线程数量的最大值是非常非常大的,如果线程任务执行完毕且空闲了 60 s则会被回收掉。将 Runnable 类型的任务交给线程池,线程池就会自动创建线程,自动执行 run() 方法且自动启动线程。原创 2024-04-07 17:28:58 · 2550 阅读 · 101 评论 -
JavaEE 初阶篇-生产者与消费者模型(线程通信)
实现生产者,就是实现一个 put 方法,先判断数组中的 size 与 数组大小关系,若 size >= arr.length 时,先唤醒其他全部线程,然后当前线程则进入等待状态;生产者与消费者之间必须进行有效的同步和协调,以避免生产者在缓冲区满时继续生产物品,或消费者在缓冲区为空时尝试消费物品,从而导致竞争条件和数据不一致的问题。循环数组的实现思路,定义三个变量:当前存储的个数 size ,头队列的索引也是取出数据的索引:head 和 尾队列的索引也是放入数据的索引处:tail。原创 2024-04-06 20:38:21 · 1953 阅读 · 57 评论 -
JavaEE 初阶篇-深入了解单例模式(经典单例模式:饿汉模式、懒汉模式)
单例模式是一种常见的设计模式,其核心思想是确保一个类只有一个实例,并提供一个全局访问点来访问这个实例。单例模式通常用于需要全局访问点且只需要一个实例的情况。单例特点包括:1)一个类只有一个实例对象。2)提供全局访问点,允许其对象访问这个实例。3)通过静态方法或静态变量实现。常见的单例模式实现方法包括:1)饿汉式单例:在类加载时即创建实例。2)懒汉式单例:在第一次使用时创建实例。使用单例模式的好处:使用单例模式可以避免多次实例化对象,节省内存资源,并且提供一个统一的访问点,方便管理和维护。原创 2024-04-02 15:08:32 · 3411 阅读 · 80 评论 -
JavaEE 初阶篇-深入了解多线程安全问题(指令重排序、解决内存可见性与等待通知机制)
指令重排序是指编译器或处理器为了提高性能,在不改变程序执行结果的前提下,可以对指令序列进行重新排序的优化技术。这种优化技术可以使得计算机在执行指令时更高效地利用计算资源,提高程序的执行效率。在多线程编程中,由于线程之间的执行是并发的,每个线程有自己的工作内存,共享变量存储在主内存中,线程在执行过程中会将共享变量从主内存中拷贝到自己的工作内存中进行操作,操作完成后再将结果写回主内存。这里的工作内存指的是:寄存器或者是缓存。线程的等待通知机制是多线程编程中常用的一种同步机制,用于实现线程间的协作和通信。原创 2024-04-01 11:56:26 · 2002 阅读 · 57 评论 -
JavaEE 初阶篇-深入了解多线程安全问题(出现线程不安全的原因与解决线程不安全的方法)
死锁的四个必要条件:互斥条件、不可剥夺条件、请求保持条件、循环等待条件。何如避免死锁?对于不可剥夺条件来说:如果一个线程无法获取资源,那么释放线程所持有的资源;对于请求保持条件来说:一次性获取该线程所有资源;对于循环等待条件来说:按照顺序获取资源。原创 2024-03-30 19:31:40 · 2147 阅读 · 66 评论 -
JavaEE 初阶篇-深入了解多线程等待与多线程状态
t1.start() 立即创建 t1 线程,再 t2.start() 创建线程,t1 没有任何阻塞就会直接执行代码,而 t2 遇到了阻塞,需要等待 t1 执行完毕之后,t2 才会解除阻塞,同时由于 main 线程阻塞了,需要等待 t2 执行完毕,当 t2 执行完毕之后,main 线程解除阻塞了,执行 main 线程中的代码。main 线程调用 thread.join() ,就会阻塞 main 线程继续执行,会让 thread 线程执行完毕之后,main 线程解除阻塞,继续执行下去。原创 2024-03-29 16:20:35 · 2119 阅读 · 65 评论 -
JavaEE 初阶篇-多线程属性和方法
多线程中断1)会自动清除 Thread.currentThread().isInterrupted() 的布尔值改变为 false ,从而导致了代码中的循环继续运行。简单来说,在 Lambda 表达式或者在匿名内部类中要引用外部作用域的局部变量的话,要求该局部变量是常量或者从头到尾都没有修改的变量。在 Java 中,变量捕获通常指的是在 Lambda 表达式或匿名内部类中引用外部作用域中的局部变量。Thread 对象的生命周期与 PCB 的生命周期是不一定完全一样的。当所有的前台线程都结束时,程序就会退出。原创 2024-03-23 19:45:13 · 2126 阅读 · 34 评论 -
JavaEE 初阶篇-深入了解进程与线程(常见的面试题:进程与线程的区别)
线程是系统调度执行的基本单位。一个进程可以包含一个或多个线程,共享进程的资源,但每个线程有自己的栈空间和执行路径。线程特点:1)线程是进程中的执行单元,可以看作是轻量级的进程。2)同一进程中的线程共享进程的地址空间和资源,可以直接访问进程的全局变量和数据。线程共享进程的资源,减少资源的重复占用,提高资源的利用效率。3)线程之间的切换比进程之间的切换更快速,因为线程共享相同的地址空间。线程的状态:1)就绪态(Ready):进程已经准备好运行,等待系统分配处理器资源。原创 2024-03-22 15:58:36 · 2754 阅读 · 84 评论 -
JavaEE 初阶篇-深入了解操作系统中的进程与 PCB
操作系统(Operating System)是一种系统软件,操作系统既可以管理计算机硬件资源,也可以管理软件资源。操作系统在计算机系统中扮演着重要的角色,它负责管理和协调计算机系统中的各种资源,包括硬件资源和软件资源。1)管理硬件资源:操作系统管理计算机的硬件资源,包括中央处理器(CPU)、内存、硬盘、输入输出设备等。它通过调度算法来分配 CPU 时间片,管理内存的分配和回收,控制硬盘存储和文件系统等,以确保硬件资源能够被有效利用。原创 2024-03-21 16:35:46 · 2454 阅读 · 70 评论
分享