IO流(主要是记住四大类InputStream,OutputStream、Reader和Writer,其他都是他们的子类)

IO流

1、文件

(1)文件概念

文件就是保存数据的地方。例如word文档,txt文件,execl文件等等。

(2)文件流

文件在程序中是以流的形式来操作的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

  • 流:数据在数据源(文件)和程序(内存)之间经历的路径
  • 输入流:数据从数据源(文件)到程序(内存)的路径
  • 输出流:数据从程序(内存)到数据源(文件)的路径

2、常用的文件操作

(1)创建文件构造器的相关方法
new File(String pathname) 		//根据路径构建一个File对象
new File(File parent, String child)	//根据父目录文件+子路径构建
new File(String parent, String child) //根据父目录+子路径构建
createNewFile 创建新文件

举例:

方式一:

//方式1 new File(String pathname)
public void create01() throws IOException {//两个斜杠是防止一个变成转义字符String filePath = "d:\\news1.txt";File file = new File(filePath);     //这里file只是一个对象,并没有创建文件file.createNewFile();               //执行了createNewFile才会真正的,在磁盘创建文件System.out.println("创建文件成功!");
}

方式二:

//方式2 new File(File parent, String child) 根据父目录文件+子路径构建
public void create02() throws IOException {//两个斜杠是防止一个变成转义字符File parentFile = new File("d:\\");String fileName = "news2.txt";File file = new File(parentFile, fileName);file.createNewFile();System.out.println("创建文件成功!");
}

方式三:

//方式2 new File(File parent, String child) 根据父目录文件+子路径构建
public void create02() throws IOException {//两个斜杠是防止一个变成转义字符File parentFile = new File("d:\\");String fileName = "news2.txt";File file = new File(parentFile, fileName);file.createNewFile();System.out.println("创建文件成功!");
}
//IO流的四个抽象类:InputStream, OutputStream, Reader, Writer
(2)获取文件的相关信息
getName,getAbsolutePath,getParent,length,exists,isFile,isDirectory

举例:

public void info(){//先创建文件对象File file = new File("d:\\new1.txt");//调用对应的方法,获取相关信息System.out.println("文件名字="+file.getName());System.out.println("文件的绝对路径="+file.getAbsolutePath());System.out.println("文件父级目录="+file.getParent());System.out.println("文件大小(字节)="+file.length());System.out.println("文件是否存在="+file.exists());System.out.println("是不是一个文件="+file.isFile());//目录本质也是一个文件,一种特殊的文件System.out.println("是不是一个目录="+file.isDirectory());
}
(3) 目录的操作和文件删除
mkdir  	//创建一级目录
mkdirs 	//创建多级目录
delete  //删除空目录或文件

举例:

public void directoryMethod() throws IOException {String fileName1 = "d:\\new1.txt";      //删除文件File file = new File(fileName1);if(file.exists()){file.delete();System.out.println("文件已经删除"+(file.exists() == false));}String fileName2 = "d:\\demo02";        //删除空目录File file2 = new File(fileName2);if(file2.exists()){file2.delete();System.out.println("文件已经删除"+(file2.exists() == false));}else{System.out.println("文件不存在");}String fileName3 = "d:\\demo\\a\\b\\c"; //创建多级目录File file3 = new File(fileName3);if(file3.exists()){System.out.println("文件存在");}else{System.out.println("文件不存在,创建该文件");file3.mkdirs();}
}

3、IO流原理以及流的分类

(1)Java IO流原理
  • I/O 是Input/Output 的缩写,I/O 技术是非常实用的技术,用于处理传输数据。如读/x写文件,网络通讯等。
  • Java程序中,对于数据的输入/输出以“流(stream)“的方式进行
  • Java.io包提供了各种“流”类和接口,用于获取不同种类的数据,并通过方法输入或输出数据
  • 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
  • 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
(2)分类方法
按操作数据单位分为:字节流(8 bit)二进制文件字符流(按字符)文本文件
按数据流流向分为:输入流输出流
按流的角色分为:节点流处理流/包装流

四个抽象类:(IO流的40多个流都是由这个抽象基类派生的)

(抽象基类)字节流字符流
输入流InputStreamReader
输出流OutputStreamWriter

4、IO流体系图

(1)字节流

InputStream

在这里插入图片描述

OutputStream

在这里插入图片描述

(2)字符流

Reader:

在这里插入图片描述

Writer:

在这里插入图片描述

5、IO流类各类实践

(1)FileInputStream

函数接口:(只列举常用方法)

FileInputStream(File file)         // 构造函数1:创建“File对象”对应的“文件输入流”
FileInputStream(String path)       // 构造函数3:创建“文件(路径为path)”对应的“文件输入流”void     close()                 // 关闭“文件输入流”
int      read()                  // 返回“文件输入流”的下一个字节
int      read(byte[] b)          // 从该输入流读取最多 b.length个字节的数据为字节数组。 

方法举例:

public void readFile01(){//读取一个字节String filePath = "d:\\test.txt";int readData = 0;FileInputStream fileInputStream = null;try {fileInputStream = new FileInputStream(filePath);//read,读取一个字节,直到-1结束while((readData = fileInputStream.read()) != -1){System.out.print((char) readData);}} catch (IOException e) {e.printStackTrace();}finally {//关闭文件流,释放资源,文件流是一种资源,需要主动关闭try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}
}public void readFile02(){//读取多个字节String filePath = "d:\\test.txt";byte readData[] = new byte[16];     //一次读取16个字节int readLen = 0;FileInputStream fileInputStream = null;try {fileInputStream = new FileInputStream(filePath);//read(byte),返回实际读取的字符数while(((readLen = fileInputStream.read(readData)) != -1)){System.out.println(new String(readData, 0, readLen));}} catch (IOException e) {e.printStackTrace();}finally {//关闭文件流,释放资源,文件流是一种资源,需要主动关闭try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}
}
(2)FileOutputStream

功能:将数据写入到文件中,如果文件不存在,就会创建这个文件。

方法举例:

    public void FileOutput01() throws IOException {//如果文件不存在,就会创建这个文件String filePath = "d:\\test.txt";FileOutputStream fileOutputStream = null;fileOutputStream = new FileOutputStream(filePath);      //写入内容会覆盖原来的内容
//        fileOutputStream = new FileOutputStream(filePath,true);      //写入内容会增加到当前文件的末尾fileOutputStream.write('s');        //写一个字节String str = "hello, you are so beautiful";//str.getBytes() 可以将字符串转为字符数组fileOutputStream.write(str.getBytes());fileOutputStream.write(str.getBytes(), 0,3);        //off为偏移量,3为要写入的长度fileOutputStream.close();       //关闭文件流}
(3)FileReader

方法介绍:

  • new FileReader(File/String)
  • read() 每次读取单个字符,返回该字符,如果读到文件末尾返回-1
  • read(char[]) 批量读取多个字符到数组中能够,返回读取到字符数量,如果读到文件末尾返回-1

方法举例:

    public void FileRead01() throws IOException{String filePath = "d:\\test.txt";FileReader fileReader = new FileReader(filePath);int data;       //读取单个字符
//        while((data = fileReader.read()) != -1){
//            System.out.print((char)data);
//        }char read[] = new char[10]; //每次读取10个字符,注释是因为上次的流已经到文件末尾了,所以要么重新更新流的指向,要么注释掉,这里选择注释int readLen = 0;while((readLen = fileReader.read(read) )!= -1){System.out.println(new String(read));}fileReader.close();}
(4)FileWriter

方法介绍:

  • new FileReader(File/String) 覆盖模式,覆盖掉当前文件
  • new FileReader(File/String,true) 追加模式,流的指针在末尾
  • write() 写入单个字符
  • write(char[]),写入指定数组
  • write(char[], off, len) 写入指定数组的某个部分
  • write(string) 写入整个字符串
  • write(string, off, len) 写入字符串的指定部分

方法举例:

public void fileWrite01() throws IOException{String dest = "风雨之后,定见彩虹";String filePath = "d:\\test.txt";FileWriter fileWriter = new FileWriter(filePath);fileWriter.write(dest);                                 //写入字符串fileWriter.write(dest.toCharArray());                   //转换为字符数组写入fileWriter.write(dest.toCharArray(),0,4);       //从0开始写入字符fileWriter.close(); //close 等价于 flush() + 关闭,执行close的时候底层才执行写文件的操作}

5、节点流和处理流

(1)介绍
  • 节点流可以从一个特定的数据源读写数据,比如FilReader,FileWriter等
  • 处理流(包装流)是“连接”在已存在的流(节点流或处理流)之上,为程序提供更强大的读写功能,更加灵活。比如:BufferedReader,BufferedWriter,创建对象时,需要传入一个节点流进行实现

节点流与处理流分类:

在这里插入图片描述

节点流与处理流的区别与联系:

  1. 节点流是底层流/低级流,直接跟数据源相接
  2. 处理流(包装流)包装节点流,既可以消除不同节点之间的实现差异,也可以提供更方便的方法来完成输入输出
  3. 处理流(包装流)对节点流进行包装,使用了修饰器设计模式,不会直接与数据源相接。

处理流的功能主要体现在以下两个方面:

  1. 性能的提高,主要增加缓冲的方式来提高输入输出的效率
  2. 操作的便捷:处理流可能提供了一系列的方法来一次输入输出大量的数据,使用更急灵活方便
(2)处理流-BufferedReader和BufferedWriter

BufferedReader和BufferedWriter属于字符流,是按照字符来读取数据的

会创建一个内部缓冲区的数组,可以直接将多个字节写入底层输出流当中,不必对每次字节写入调用底层系统,提高了效率。

关闭时处理流,只需要关闭外层流即可。

举例:

//BufferedReader和BufferedWriter是安装字符操作,不能操作二进制文件[声音、视频、doc,pdf等等],可能造成文件损坏
public void ReaderAndWriter() throws IOException{String filePath = "d:\\FileReadStream01.java";//创建bufferedReader,里面要传一个与源文件直接相关的节点流BufferedReader br = new BufferedReader(new FileReader(filePath));String line;        //可以直接按行读取,效率较高while((line = br.readLine()) != null){  //readLine不会读取换行符System.out.println(line);}//关闭流只需要关闭外层流即可,底层会自动关闭节点流br.close();String writePath = "d:\\test.txt";BufferedWriter bw = new BufferedWriter(new FileWriter(writePath));bw.write("hello, how are you");bw.newLine();       //换行bw.write("hello2,how old are you");bw.close();     //底层自动关闭FileWriter
}
(3)处理流-BufferedInputStream和BufferedOutputStream

BufferedInputStream和BufferedOutputStream属于字节流,是按照字节来读取数据的,可以读取二进制文件,比如图像,声音,视频等

关闭时处理流,只需要关闭外层流即可。

举例:

   public void BufferedInputAndOutput() throws IOException{String src1 = "d:\\bp.jpg";String src2 = "d:\\FileReadStream01.java";String dest1 = "d:\\bp1.jpg";String dest2 = "d:\\FileReadStream02.java";//创建对象,因为 FileInputStream是InputStream的子类,所以可以传FileInputStreamBufferedInputStream bis = new BufferedInputStream(new FileInputStream(src1));BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(dest1));byte buf[] = new byte[1024];int readLen = 0;while((readLen = bis.read(buf)) != -1){
//            bos.write(buf, 0, readLen);bos.write(buf);}bis.close();bos.close();}
(4)对象流-ObjectInputStream和ObjectOutputStream

对象流在进行输入输出的过程中,可以保存数据的值和数据类型

序列化和反序列化:

  • 序列化就是在保存数据时,保存数据的值和数据类型
  • 反序列化就是在恢复数据时,恢复数据的值和数据类型
  • 需要让某个对象支持序列化机制,则必须让其类是可以序列化的,为了让某个类是可序列化的,该类必须实现两个接口
  - Serializable 	//这是一个标记接口,没有方法,不需要实现- Externalizable      //该接口有方法需要实现,**因为我们一般实现上面的 Serializable接口**

ObjectOutputStream 提供序列化功能

ObjectInputStream 提供反序列化功能

举例:

public class ObjectInputAndOutputStream {public static void main(String[] args) throws IOException, ClassNotFoundException {//序列化后,保存的文件格式,不是存文本,而是按照他的格式来保存//序列化String filePath = "d:\\data.dat";ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filePath));//序列化数据到 e:\data.datoos.writeInt(100);// int -> Integer (实现了 Serializable)oos.writeBoolean(true);// boolean -> Boolean (实现了 Serializable)oos.writeChar('a');// char -> Character (实现了 Serializable)oos.writeDouble(9.5);// double -> Double (实现了 Serializable)oos.writeUTF("韩顺平教育");//String//保存一个dog 对象oos.writeObject(new Dog("旺财", 10));oos.close();System.out.println("数据保存完毕(序列化形式)");//反序列化// 1.创建流对象ObjectInputStream ois = new ObjectInputStream(new FileInputStream("d:\\data.dat"));// 2.读取, 注意顺序,顺序与读取的顺序一致System.out.println(ois.readInt());System.out.println(ois.readBoolean());System.out.println(ois.readChar());System.out.println(ois.readDouble());System.out.println(ois.readUTF());System.out.println((Dog)ois.readObject());// 3.关闭ois.close();System.out.println("以反序列化的方式读取(恢复)ok~");}
}class Dog implements Serializable{  //必须实现序列化接口才能调用Object对象流String name;int age;public Dog(String name, int age) {this.name = name;this.age = age;}@Overridepublic String toString() {return "Dog{" +"name='" + name + '\'' +", age=" + age +'}';}
}

注意事项和细节说明

  • 读写顺序要一致
  • 要求序列化或反序列化对象,需要实现Serializable接口
  • 序列化的类建议添加SerialVersionUID,可以提高版本的兼容性
  • 序列化对象中,默认将里面所有属性都进行序列化,但除了static或transient修饰的成员
  • 序列化对象中,要求里面属性的类型也需要实现序列化接口
  • 序列化具备可继承性,如果某个类已经实现了序列化,则它的子类也默认实现了序列化
(5)标准输入输出流
类型默认设备
System.in 标准输入InputStream键盘
System.out 标准输入OutputStream显示器

案例:

传统的Scanner是从标准输入键盘中获取数据的

public static void main(String[] args) {// System.in 类为: public final static InputStream in = null;//编译类型:InputStream//运行类型:BufferedInputStream//表示标准输入:键盘System.out.println(System.in.getClass());// System.in 类为: public final static PrintStream out = null;//编译类型:PrintStream//运行类型:PrintStream//表示标准输出:显示屏System.out.println(System.out.getClass());Scanner scanner = new Scanner(System.in);	//传入的是BufferedInputStream
}
(6)转换流InputStreamReader和OutputStreamWriter

介绍:

  1. InputStreamReader:是Reader的子类,可以将InputStream(字节流)包装成(转换成)Reader(字符流)
  2. OutputStreamWriter:是Writer的子类,可以将OutputStream(字节流)包装成Writer(字符流)
  3. 当处理纯文本数据时,如果使用字符流的效率更高,并且可以有效解决中文问题,建议将字节流转换成字符流
  4. 可以在使用时指定编码格式(比如:UTF-8,gbk,gb2312,ISO8859-1等)

举例:

public static void main(String[] args) throws IOException {//InputStreamReader,可以将字节流转换为字符流,然后还可以指定编码,比较方便String filePath = "d:\\test.txt";//1、把FileInputStream转换为InputStreamReaderInputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");//2、把InputStreamReader 传入 BufferedReaderBufferedReader br = new BufferedReader(isr);//3、读取String s = br.readLine();System.out.println("读取内容:"+s);br.close();//OutputStreamWriter,写文件,可以指定编码方式//1、创建流对象OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), "gbk");//2、写入osw.write("hello,你好吗!");//3、关闭osw.close();
}
(7)打印流 PrintStream和PrintWriter

打印流只有输出流,没有输入流

举例:

public static void main(String[] args) throws IOException {PrintStream out = System.out;//默认情况下,输出数据的位置是标准输出,就是显示器out.println("hack,hello");//因为print 底层使用的是write , 所以我们可以直接调用write 进行打印/输出out.write("你好".getBytes());out.close();//我们可以去修改打印流输出的位置/设备System.setOut(new PrintStream("d:\\text1.txt"));System.out.println("hello, 你好哇");System.out.close();PrintWriter pw = new PrintWriter(System.out);   //这里是在显示屏中输出pw.print("hi,这里是PrintWriter");pw.close();PrintWriter pw1 = new PrintWriter(new FileWriter("d:\\text1.txt"));     //这里是在文件中输出pw1.println("hi,这里是PrintWriter");pw1.close();
}

6、PROPERTIES 类

(1)基本介绍
  • 专门用于读写配置文件的集合类
  • 配置文件的格式为:
    • 键=值
  • 键与值不需要空格,值不需要引号一起来。默认类型是String
(2)常见方法
  • load:加载配置文件的键值对到Properties对象
  • list:将数据显示到指定的设备
  • getProperty(key):根据键获取值
  • setProperty(key,value):设置键值对到Properties对象中
  • store:将Properties中的键值对存储到配置文件,在idea中,保存信息到配置文件,如果含有中文,会存储为unicode编码

举例:

public static void main(String[] args) throws IOException {//使用Properties类来读取mysql.properties文件//1、创建Properties对象Properties properties = new Properties();//2、加载指定配置文件properties.load(new FileReader("src\\mysql.properties"));//3、把k-v显示到控制台properties.list(System.out);//4、根据key获取对应的值String user = properties.getProperty("user");String pwd = properties.getProperty("pwd");System.out.println("用户名:"+user);System.out.println("密码:"+pwd);//使用Properties 类来创建 配置文件, 修改配置文件内容//创建//1.如果该文件没有key 就是创建//2.如果该文件有key ,就是修改properties.setProperty("charset", "utf8");properties.setProperty("user", "汤姆");//注意保存时,是中文的 unicode 码值properties.setProperty("pwd", "888888");//将k-v 存储文件中即可properties.store(new FileOutputStream("src\\mysql2.properties"), null);System.out.println("保存配置文件成功~");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】Python中的正则表达式

Python中的正则表达式 1.re模块使用入门 1.1 re.match 函数 函数定义: re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。 函数语法: re.match(pattern, string, flags0) …

二叉树【Java】

二叉树遍历 前序遍历 中序遍历 后续遍历 代码 前 中 后序遍历 package Trww;public class TreeTraversal {/*12 34 5 6*/public static void main(String[] args) {TreeNode tree new TreeNode(new TreeNode(new TreeNode(4),2,null),1,new TreeNode(new TreeNode(5),3,n…

maven私服搭建详细教程

1、为什么需要私服 如果在公司中多个项目模块中的的公共类用的都是一样的,那么不可能将这些一样的代码写两遍。所以将其中一个项目中的代码打包成私服,然后在另外一个模块中去进行引用。 除此之外,如果大公司中开发人员较多,大家同…

《ElementPlus 与 ElementUI 差异集合》icon 图标使用(包含:el-button,el-input和el-dropdown 差异对比)

安装 注意 ElementPlus 的 Icon 图标 要额外安装插件 element-plus/icons-vue. npm install element-plus/icons-vue注册 全局注册 定义一个文件 element-icon.js ,注意代码第 6 行。加上了前缀 ElIcon ,避免组件命名重复,且易于理解为 e…

TinTin Web3 动态精选:以太坊坎昆升级利好 Layer2,比特币减半进入倒计时

TinTin 快讯由 TinTinLand 开发者技术社区打造,旨在为开发者提供最新的 Web3 新闻、市场时讯和技术更新。TinTin 快讯将以周为单位, 汇集当周内的行业热点并以快讯的形式排列成文。掌握一手的技术资讯和市场动态,将有助于 TinTinLand 社区的开…

【每日力扣】235. 二叉搜索树的最近公共祖先与39. 组合总和问题描述

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害。 235. 二叉搜索树的最近公共祖先 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义…

硬件工程师入门基础知识(零)心法篇

硬件工程师入门基础知识(零)心法篇 1.为什么要当硬件工程师?2.什么是硬件工程师?3.怎么成为合格的硬件工程师?4.优秀的硬件工程师需要具备什么技能和品质?5.硬件工程师的成长路径?6.硬件工程师还有哪些职业可能?1.为什么要当硬件工程师? 很多快要毕业或者刚毕业的同学…

【2024年5月备考新增】《软考真题分章练习 - 5 项目进度管理(高项)》

1、( ) is a technique for estimating the duration or cost of an activity or a project using historical data from a similar activity or project. A.Analogous estimating B. parametric estimating C.Three-Point estimating D. Bottom estimating 2、下图中(单位:…

如何本地搭建hMailServer邮件服务

文章目录 前言1. 安装hMailServer2. 设置hMailServer3. 客户端安装添加账号4. 测试发送邮件5. 安装cpolar6. 创建公网地址7. 测试远程发送邮件8. 固定连接公网地址9. 测试固定远程地址发送邮件 前言 hMailServer 是一个邮件服务器,通过它我们可以搭建自己的邮件服务,通过cpola…

免密ssh密钥登录Linux该如何设置

我们在使用ssh客户端远程连接Linux服务器时,为了考虑安全方面的因素,通常使用密钥的方式来登录。密钥分为公钥和私钥,这两把密钥可以互为加解密。公钥是公开的,私钥是由个人自己持有,并且必须妥善保管和注意保密。 Li…

《圣斗士星矢》AI制作真人大电影宣传片

《圣斗士星矢》AI制作真人大电影宣传片 The ancient gods awaken, a battle of light and shadow unfolds.古神觉醒,光明与黑暗之战一触即发。 Heroes stand, facing the abyss of evil.英雄挺立,直面邪恶深渊。 The stars align, the chosen ones ris…

Linux:kubernetes(k8s)有状态的服务部署(14)

之前我都是对无状态进行的一个操作,我们想扩容就扩容,想缩容就缩容,根本不用去考虑他的一个网络环境,本地储存环境啥的一个状态 当我们做有状态的服务的操作,肯定要申请一个持久化的一个空间,以及网络&…

鸿蒙Harmony应用开发—ArkTS声明式开发(容器组件:GridItem)

网格容器中单项内容容器。 说明: 该组件从API Version 7开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。仅支持作为Grid组件的子组件使用。 子组件 可以包含单个子组件。 接口 GridItem GridItem(value?: GridItemOptions)…

【数据结构与算法】:选择排序与快速排序

🔥个人主页: Quitecoder 🔥专栏:数据结构与算法 我的博客即将同步至腾讯云开发者社区,邀请大家一同入驻:腾讯云 欢迎来到排序的第二个部分:选择排序与快速排序! 目录 1.选择排序1.…

鸿蒙原生应用元服务开发-WebGL网页图形库开发着色器绘制彩色三角形

着色器绘制彩色三角形 使用WebGL开发时&#xff0c;为保证界面图形显示效果&#xff0c;请使用真机运行。 此场景为使用WebGL绘制的彩色三角形图形&#xff08;GPU绘制&#xff09;。开发示例如下&#xff1a; 创建页面布局。index.hml示例如下&#xff1a; <div class&quo…

鸿蒙开发(五)-应用签名相关

鸿蒙开发(五)-应用签名相关 本篇文章主要介绍下鸿蒙应用下的应用签名的创建与配置。 根据之前的介绍&#xff0c;我们知道&#xff0c;在DevEco Studio默认创建的应用程序&#xff0c;是没有sign配置的。 默认输出的应用文件如下&#xff1a; build->default->output…

力扣面试150 两数之和 II - 输入有序数组 双指针 HashMap

Problem: 167. 两数之和 II - 输入有序数组 复杂度 时间复杂度: O ( n ) O(n) O(n) 空间复杂度: O ( 1 ) O(1) O(1) Code class Solution {public int[] twoSum(int[] numbers, int target) {int l 0;int r numbers.length-1;while(l < r){if(numbers[l] numbers[…

MySQL基础-----多表查询之子查询

目录 前言 子查询概述 1.概念 2.分类 一、标量子查询 二、列子查询 三、行子查询 四、表子查询 前言 上一期我们讲了内外连接查询以及自连接查询&#xff0c;那么本期我们就学习多表查询的子查询。本期会详细讲解什么是子查询&#xff0c;以及子查询的相关功能&#xf…

智慧公厕建设,助力打造宜居、韧性、可持续的智慧城市

公共厕所作为智慧城市的重要组成部分&#xff0c;对于城市的高质量发展起着至关重要的作用。智慧公厕建设旨在通过全面监测、控制和管理公共厕所&#xff0c;实现多方面功能&#xff0c;包括公共厕所环境监测与调控、厕位占用监测与引导、消耗品监测与缺失提示、安全防范与管理…

力扣78. 子集

Problem: 78. 子集 文章目录 题目描述思路及解法复杂度Code 题目描述 思路及解法 1.定义一维数组track用于记录决策路径&#xff0c;二维数组res用于存储所有的子集&#xff1b; 2.决策阶段&#xff1a;从0阶段起来&#xff08;0阶段决策路径中为空集&#xff09;&#xff0c;每…