!!! note 目录
并发(Concurrency)和并行(Parallelism)并发(Concurrency)和并行(Parallelism)是计算机科学中两个重要的概念,它们在多任务处理和提高程序效率方面起着至关重要的作用。
一、并发(Concurrency)定义:并发是指在一个时间段内处理多个任务的能力。并发系统能够让多个任务(线程、进程等)交替进行执行,从而使得这些任务看起来是同时进行的,即使在单核处理器上也是如此。
特点:
任务切换:并发通过在不同任务之间快速切换来实现表面的“同时”执行。操作系统调度器负责管理这种切换。
共享资源:并发任务通常共享资源(如内存、文件),需要使用同步机制(如锁、信号量)来避免竞争条件和死锁等问题。
例子:一个用户界面程序同时处理用户输入和后台数据处理;Web服务器同时处理多个客户端请求。
实现方式:
线程:同一进程内的多个线程共享进程资源,可以并发执行。
协程:一种比线程更轻量级的并发单元,常见于一些现代编程语言(如Go、Python的asyncio)。
事件驱动:基于事件循环和回调函数的并发模型,如JavaScript中的N ...
!!! note 目录
进程与线程的概述在Java编程中,进程和线程是两个基本的概念,它们在并发编程和多任务处理方面起着至关重要的作用。
一、进程(Process)
定义: 进程是一个正在执行的程序的实例。每个进程都有自己的内存空间和资源,例如文件句柄、网络连接等。
特点:
独立性: 进程之间是相互独立的,一个进程崩溃不会影响其他进程。
资源隔离: 每个进程有自己独立的地址空间和资源,进程间的数据共享需要通过进程间通信(IPC)机制,比如管道、消息队列、共享内存等。
开销较大: 创建和销毁进程的开销较大,因为需要分配和回收大量的资源。
二、线程(Thread)
定义: 线程是进程中的一个执行单元,一个进程可以包含多个线程。线程共享进程的内存空间和资源。
特点:
共享性: 同一进程内的线程共享相同的内存空间和资源,能够方便地共享数据。
轻量级: 线程的创建和销毁开销相对较小,因为线程间可以共享进程的资源。
协作性: 多个线程可以并发执行,提升程序的执行效率。
三、进程和线程的区别
内存空间和资源:
进程: 每个进程有独立的内存空间和资源,进程间的资源不共享。
线程: ...
!!! note 目录
对象的克隆对象的克隆在Java中可以通过几种不同的方式来实现,每种方法有其适用的场景和限制。以下是几种常见的方法来进行对象克隆:
1. 使用 Object 类的 clone 方法在Java中,每个对象都有一个clone()方法,这个方法默认是protected,并且执行的是浅克隆。浅克隆创建了一个新对象,但字段值仍然指向原始对象中的相同对象。如果需要实现深克隆(即克隆对象时也克隆对象引用的所有对象),通常需要重写clone()方法。
实现步骤:
实现Cloneable接口。
重写clone()方法。
示例代码:
123456789101112131415161718192021222324252627class Person implements Cloneable { String name; int age; public Person(String name, int age) { this.name = name; this.age = age; } @O ...
!!! note 目录
ByteArrayInputStream和ByteArrayOutputStreamByteArrayInputStream和ByteArrayOutputStream是Java中用于处理字节数据的流类,这些类位于java.io包中。它们主要用于在内存中读取和写入字节数据,不涉及实际的文件I/O操作。这使得它们非常适合在处理数据时临时存储数据,例如在进行数据传输或转换时。
一、ByteArrayInputStreamByteArrayInputStream是一个字节输入流,用于从字节数组读取数据。它允许你将字节数组作为输入源,将字节数据读入程序中。
主要特点:
从字节数组读取数据:你可以从一个字节数组中读取数据,而不需要从文件或网络流中读取。
方便数据处理:在进行数据处理或转换时,首先可以将数据加载到一个字节数组中,然后使用ByteArrayInputStream来读取这些数据。
限制:一旦创建了ByteArrayInputStream对象,其内部使用的字节数组大小是固定的,并且在ByteArrayInputStream对象生命周期内,这个数 ...
!!! note 目录
装饰器设计模式一、为何提出装饰器设计模式?在我们完成业务之后可能要求添加新的行为,如果直接在类本身改的话不符合OCP原则。还有一种方式就是对我的类再实现子类,在子类中实现要添加的新功能,但是会引起类爆炸。
1234package com.camellia.io.decorator.package01;public interface Flyable { void fly();}
1234567package com.camellia.io.decorator.package01;public class Cat implements Flyable{ @Override public void fly() { System.out.println("Cat fly"); }}
1234567package com.camellia.io.decorator.package01;public class Bird implements Fl ...
!!! note 目录
加载属性配置文件一、使用 Properties 类加载属性配置文件
Properties 类:
Properties 是一个表示一组持久属性的类。属性列表中每个键及其对应值都是字符串。
用途:用于存储和管理配置信息,例如数据库连接配置。
加载配置文件:
使用 Properties 类的 load(Reader reader) 方法,可以将配置文件的内容加载到 Properties 对象中。
例:properties.load(new FileReader("config.properties"));
获取文件路径:
使用 Thread.currentThread().getContextClassLoader().getResource("path").getPath() 获取配置文件的绝对路径。
例:String path = Thread.currentThread().getContextClassLoader().getResource("config.properties" ...
!!! note 目录
压缩与解压缩的流一、.gz压缩与解压缩流1.1 GZIPInputStream描述:GZIPInputStream用于读取GZIP格式的压缩数据,它解压从一个基础输入流读取的字节。
构造方法:
构造方法
描述
GZIPInputStream(InputStream in)
创建一个使用默认缓冲区大小的GZIP输入流。
GZIPInputStream(InputStream in, int size)
创建一个使用指定缓冲区大小的GZIP输入流。
常用方法:
方法
描述
int read(byte[] buf, int off, int len)
从GZIP输入流中读取解压后的数据到缓冲区中。
void close()
关闭GZIP输入流并释放所有相关的系统资源。
1.2 GZIPOutputStream描述:GZIPOutputStream用于将数据压缩成GZIP格式,并写入到一个基础输出流中。
构造方法:
构造方法
描述
GZIPOutputStream(OutputStream out)
创建一个使 ...
Java SE
未读!!! note 目录
System.out 标准输出流在Java编程语言中,System.out是一个非常重要的对象,它代表标准输出流。标准输出流通常用于将信息输出到控制台或其他输出设备。System.out是java.io.PrintStream类的一个实例,这个类提供了多种方法来格式化输出数据。
一、System.out 的主要特性和用途:
输出目的地:
默认情况下,System.out流会将输出信息发送到控制台。这意味着当你调用System.out.println("Hello, world!");时,”Hello, world!”将被显示在你的命令行或控制台窗口上。
PrintStream 类:
System.out是PrintStream类的实例,PrintStream类提供了丰富的方法来打印信息,如print(), println(), printf()等。这些方法允许你格式化输出,输出不同类型的数据(如字符串、整数、浮点数等)。
重定向输出:
你可以将System.out重定向到文件、网络流或其他输出设备。这可以通过创建一个新的 ...
Java SE
未读!!! note 目录
System.in标准输入流在Java编程语言中,System.in是一个标准输入流,通常用于从控制台读取用户输入。它是java.lang.System类的一个静态字段,并且是一个InputStream对象。
一、基本概念
类型:System.in是一个InputStream对象。
用途:主要用于读取用户从键盘输入的数据。
默认行为:通过控制台读取输入流,直到遇到输入的结束标志(通常是Enter键)。
二、使用方式
由于System.in是一个InputStream,它只能读取字节数据。因此,为了方便读取文本数据,通常会将System.in包装在更高级的流中,如BufferedReader或Scanner。
标准输入流 System.in 不需要显式关闭。这是因为 System.in 是一个全局的、由 JVM 管理的输入流。手动关闭它可能会导致程序的其他部分无法再读取输入,从而引发意外行为或错误。
三、示例代码12345678910111213141516171819202122232425262728293031323334353637383940 ...
Java SE
未读!!! note 目录
PrintStream打印流PrintStream是一个打印流,主要用于打印操作,支持以字节形式输出数据。它提供了一些便捷的方法和格式化功能,主要用于将内容打印到文件或控制台。
具体可以查看帮助文档
一、主要用途
打印各种数据类型到输出流(如文件、控制台)。
二、常用方法
print(Type x): 打印数据类型x。
println(Type x): 打印数据类型x,并在输出后自动添加一个换行符。
printf(String format, Object... args): 格式化输出,根据格式字符串和参数输出相应的格式。
三、便捷特性
直接输出各种数据类型:可以轻松输出布尔值、字符、字符串、整数、浮点数等。
自动刷新和自动换行:println方法会在输出后自动添加换行符,同时可以结合流的刷新机制确保数据被写入输出目标。
支持字符串转义:可以直接打印包含特殊字符的字符串,例如\n、\t等。
自动编码:根据操作系统的默认编码或指定的编码方式自动处理字符编码,简化编码处理过程。
格式化输出:通过printf方法,可以使用格式字符串来格式化输出数据。 ...