10 2023 档案
摘要:
阅读全文
摘要:代码示例: public interface UserDao {} public class UserDaoImpl implements UserDao {} public interface UserService {} public class UserServiceImpl implemen
阅读全文
摘要:代码示例: public static void main(String[] args) { //创建一个工厂对象 DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); //创建一个读取器(读xml文件)
阅读全文
摘要:对象有什么方法想被代理,代理就一定要有对应的方法 这个newProxyInstance方法的返回值就是代理对象 代码示例: public interface Star { String sing(String name); void dance();} public class BigStar im
阅读全文
摘要:代码示例: public static void main(String[] args) throws Exception { //获取class字节码文件对象 Class clazz = Class.forName("pojo.Student"); //获取所有的方法(getMethods()还能
阅读全文
摘要:代码示例: public static void main(String[] args) throws Exception { //获取class字节码文件的对象 Class clazz = Class.forName("pojo.Student"); //获取到成员变量的对象 Field[] fi
阅读全文
摘要:在 Java 中,万物皆对象。比如,字节码文件 可以看作是 Class这个类的对象; Constructor 这个类是用来描述 构造方法的,所以这个类的对象就表示构造方法的对象; Field 这个类是用来描述成员变量的,所以这个类的对象就表示成员变量的对象; Method 这个类是用来描述成员方法的
阅读全文
摘要:① Class.forName ( "全类名" ) → 最为常用 全类名:包名 + 类名 Class 的首字母是大写的,所以是一个类名,是用来描述字节码文件的。 这个类里面有一个静态方法叫 forName,参数可以传递一个类的全类名,可以获取到参数的字节码文件对象 ② 类名.class → 这种方式
阅读全文
摘要:反射允许对封装类的字段(成员变量)、方法(成员方法)和构造函数(构造方法)的信息进行编程访问 获取字段(成员变量)、成员方法 和 构造方法的时候,我们不是从 Java 文件中获取的,而是从 class 字节码文件当中获取的 所以我们首先要先学习如何获取 class 字节码文件的对象
阅读全文
摘要:InetAddress表示互联网协议IP地址它有两个子类,一个是Inet4Address,一个是Inet6Address。所以我们在获取InetAddress类对象的时候,它底层会先判断你当前系统用的是4版本的还是6版本的,如果用的是4版本的,那么会创建子类Inet4Address对象给你返回。那我
阅读全文
摘要:协议:计算机网络中,连接和通信的规则被称为网络通信协议 UDP协议(用户数据报协议): UDP是面向无连接通信协议。速度快,有大小限制,一次只能发送64KB,数据不安全,易丢失数据 TCP协议(传输控制协议): TCP协议是面向连接的通信协议。速度慢,没有大小限制,数据安全
阅读全文
摘要:什么是网络编程? 答:在网络通信协议下,不同计算机上运行的程序,进行的数据传输 Java 中可以使用 java.net 包下的技术轻松开发出常见的网络应用程序 常见的软件架构:BS、CS CS:Client / Server(客户端 / 服务器)用户本地需要下载安装客户端程序,在远程有一个服务器端程
阅读全文
摘要:代码示例: package pojo.xc01;public class MyRunnable implements Runnable { @Override public void run() { //编写线程锁执行的代码 for (int i = 1; i <= 3; i++) { System
阅读全文
摘要:线程池 主要核心原理: ① 创建一个池子,池子中是空的 ② 提交任务时,池子会创建新的线程对象来执行任务,当任务执行完毕,线程会还给池子,下回再次提交任务时,不需要创建新的线程,直接复用已有的线程即可 ③ 但是如果提交任务时,池子中没有空闲线程,并且也无法创建新的线程的时候,任务就会排队等待 线程池
阅读全文
摘要:Java 的虚拟机当中没有定义运行状态,因为当线程抢夺到 CPU 执行权的时候,虚拟机会把当前线程交给操作系统管理,虚拟机就不管了。
阅读全文
摘要:Java的阻塞队列(Blocking Queue)可以用来实现等待唤醒机制,其中等待和唤醒的操作在队列的不同方法中体现: 1.等待: 在阻塞队列中,等待通常发生在以下情况: 2.当队列为空时,消费者线程试图从队列中取出元素时,它会被阻塞,直到队列中有元素可供消费。这种等待是通过阻塞队列的take()
阅读全文
摘要:等待唤醒机制还可以用 阻塞队列的方式进行实现 练习:利用阻塞队列完成生产者和消费者(等待唤醒机制)的代码 细节:生产者和消费者必须使用同一个阻塞队列 阻塞队列的创建方式(泛型:队列里面数据的类型):ArrayBlockingQueue<String> queue = new ArrayBlockin
阅读全文
摘要:在Java中,"生产者-消费者"(Producer-Consumer)是一种常见的并发编程模型,用于协调多个线程之间的工作,其中一些线程充当生产者,而其他线程充当消费者。这模型通常用于处理共享数据的情况,其中生产者线程生成数据并将其放入共享缓冲区,而消费者线程则从缓冲区中取出数据并进行处理。主要特点
阅读全文
摘要:在Java中,wait()和notify()方法必须在同步块或同步方法内部使用,通常在锁对象上调用,有以下原因: 1.互斥性: 当你在同步块内部使用wait()和notify()方法时,它们与锁对象紧密相关,确保在调用wait()和notify()时能够维持互斥性。这意味着在调用wait()时,当前
阅读全文
摘要:package pojo.xc01;public class Cook extends Thread{ @Override public void run() { while (true) { synchronized (Desk.lock) { if (Desk.count == 0) break
阅读全文
摘要:等待唤醒机制的三个角色:生产者、消费者、控制生产者和消费者的第三者 代码: package pojo.xc01;//用来控制生产者和消费者的执行public class Desk { //桌子上是否有面条(0:没有面条 1:有面条) //用布尔类型表示的话有一个小弊端,因为布尔类型只有两个值,只能控
阅读全文
摘要:生产者和消费者完整的执行过程: 等待唤醒机制: 在Java中,等待唤醒机制是通过Object类的wait()、notify()和notifyAll()方法来实现的。这种机制通常用于多线程之间的协作,允许线程在某个条件满足或者发生变化之前等待,并在条件满足时被唤醒。 1.wait()方法: 当一个线程
阅读全文
摘要:当一个线程尝试获取一个已经被其他线程锁住的锁时,它的行为取决于所使用的编程语言和锁的类型。一般情况下,有以下几种可能的行为: 1.阻塞等待:线程会被阻塞,直到锁变为可用。这是最常见的情况,通常用于互斥锁。在Java中,可以使用synchronized关键字或ReentrantLock类来实现这种行为
阅读全文
摘要:死锁就是在程序当中出现了 锁的嵌套,外面一个锁,里面一个锁,就形成了死锁 死锁不是一个知识点,而是一个错误
阅读全文
摘要:代码示例: package pojo;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class Ticket extends Thread{ public s
阅读全文
摘要:同步代码块 就是 把一段代码给锁起来,这样就可以解决多线程操作共享数据时带来的数据安全问题 但是如果我们想要把一个方法里面所有的代码全都锁起来,就没有必要用同步代码块了,我们可以直接把 synchronized 加在方法上,这个方法就叫做同步方法 同步方法的格式: 修饰符 synchronized
阅读全文
摘要:同步代码块: 利用同步代码块把操作共享数据的代码给锁起来,让同步代码块里面的代码是轮流去执行的 格式: synchronized (锁对象) { 操作共享数据的代码 } 细节: 1. 在最初,锁的状态是默认打开的,如果有一个线程进去了,锁就会自动关闭 2. 当锁里面全部代码都执行完毕了,线程出来了,
阅读全文
摘要:1. 当创建线程对象的时候,是新建状态 2. 新建完之后 调用 start()方法 就变成了就绪状态(是在调用完了 start() 方法之后才变成了就绪状态)。在就绪状态下,线程开始抢夺 CPU 的执行权。注意是正在抢,还没有抢到,没抢到就无法执行代码。所以就绪状态 有执行资格,但没有执行权(有执行
阅读全文
摘要:Java 中线程的优先级 最小是 1,最大是 10,默认是 5;优先级越大,抢占到 CPU 的概率越高 String getName()、void setName (String name): 如果我们没有给线程设置名字,线程的默认名字是 Thread-序号,序号是从 0 开始的,例如:Thread
阅读全文
摘要:继承Thread类 和 实现Runnable接口 的这两种方式 无法获取到多线程的结果 实现Callable接口 的方式 可以获取到多线程运行的结果
阅读全文
摘要:利用 Callable 接口 和 Future 接口方式实现:这种实现方式可以获取到多线程运行的结果 步骤: 1. 创建一个类,类名比如叫 MyCallable,并实现 Callable 接口 注:Callable 接口有一个泛型,因为这种方式可以获取到多线程运行的结果,泛型就表示结果的类型 2.
阅读全文
摘要:实现 Runnable 接口的方式进行实现: 1. 定义一个类 实现 Runnable 接口,并实现 run 方法 2. 在 run 方法里面书写该线程要执行的代码 3. 然后创建这个 实现 Runnable 接口的类的实例化对象,这个对象其实就表示 多线程要执行的任务 4. 再去创建一个 Thre
阅读全文
摘要:多线程的三种实现方式: 1. 继承 Thread 类的方式进行实现 2. 实现 Runnable 接口的方式进行实现 3. 利用 Callable 接口 和 Future 接口方式实现 一、继承 Thread 类的方式: 将类声明为 Thread 的子类,该子类应重写 Thread 类的 run 方
阅读全文
摘要:并发:在同一时刻,有多个指令在 单个 CPU 上 交替 执行(CPU在多个线程之间交替执行) 并行:在同一时刻,有多个指令在 多个 CPU 上 同时 执行
阅读全文
摘要:进程:进程是程序的基本执行实体(简单理解就是,一个软件运行之后,它就是一个进程) 线程:线程是操作系统能够进行运算调度的最小单位。它被包含在 进程 之中,是进程中的实际运作单位。 简单说,线程 就是 应用软件中互相独立的、又可以同时运行的功能。如果这样的功能比较多,就形成了多线程 以 360 软件为
阅读全文
摘要:Commons-io 是 apache 开源基金组织提供的一组有关 IO 操作的开源工具包,是用来提高 IO 流的开发效率的
阅读全文
摘要:解压缩流 就是读取压缩包中的文件,所以它是读,属于输入流 压缩流 就是把文件中的数据 写到压缩包中,所以它是写,属于输出流 压缩包 里面的 每一个文件或文件夹 在 Java 当中都是一个 ZipEntry 对象 所以 解压 的本质其实就是 把压缩包里面的每一个 ZipEntry 对象按照 层级结构
阅读全文
摘要:字符流底层有缓冲区,所以效率更高,想自动刷新需要手动开启 字符打印流的构造方法: 字符打印流的成员方法: 代码示例: PrintWriter pw = new PrintWriter(new FileWriter("E:\\Java基础资料\\b.txt"), true);pw.println("黑
阅读全文
摘要:打印流是高级流,也是用来包装基本流的 但是打印流不能读,只能写,所以打印流只有输出流 打印流分为两种:PrintStream、PrintWriter两个类 1. PrintStream → 字节打印流 2. PrintWriter → 字符打印流 打印流的特点: 1. 打印流只能操作文件目的地,不能
阅读全文
摘要:细节一: 如果说 一个类实现了 Serializable 接口,表示这个类的对象是可被序列化的,Java 底层会根据这个类里面所有的内容进行计算,计算出一个 long 类型的序列号(或版本号)。假设计算出来的版本号是 1,当我创建了一个这个类的对象的时候,在对象里面就包含了 版本号 1,用序列化流写
阅读全文
摘要:序列化流是高级流,也是用来包装基本流的 序列化流属于 字节流 的一种,负责输出数据;反序列化流负责输入数据 序列化流 可以把 Java 中的 对象 写到本地文件中。但是写到文件中的数据我们看不懂,可以通过反序列化流把数据正确读取出来 序列化流 也叫 对象操作输出流 序列化流: 构造方法:public
阅读全文
摘要:InputStreamReader 的 read() 方法是用于从字符输入流中读取一个字符的方法。它的底层原理涉及字符编码、字节流转换为字符流以及字符输入的过程。下面是对 read() 方法的超详细底层原理解释: 读取字节数据:InputStreamReader 本质上是一个字符流,它依赖于字节流来
阅读全文
摘要:转换流属于字符流的一员,本身也是一种高级流,用来包装基本流的。 转换流是 字符流 和 字节流 之间的桥梁 转换流的作用: 1. 指定字符集读写数据(JDK11开始被淘汰) 2. 字节流想要使用字符流中的方法 字符转换输入流 InputStreamReader 的作用是可以把 字节流 转换成 字符流
阅读全文
摘要:缓冲流为什么能提高性能? 知识点:1 个字节 = 1B 缓冲流自带长度为 8192 的缓冲区,字节缓冲流的缓冲区是 byte 类型的,是长度为 8192 的字节数组,为 8K;而字符缓冲流的缓冲区是 char 类型的,是长度为 8192 的字符数组,为 16K,因为 Java 中一个字符占两个字节
阅读全文
摘要:在 Java 当中,一个字符,它的底层占两个字节
阅读全文
摘要:字符流的基本流本身其实已经有缓冲区了,所以字符缓冲流提高的效率不是很明显。 字符缓冲流的构造方法: 字符缓冲输入流:public BufferedReader (Reader r) → 把基本流变成高级流 字符缓冲输出流:public BufferedWriter (Writer r) → 把基本流
阅读全文
摘要:缓冲流真正从文件当中读写数据的还是 InputStream 和 OutputStream 这两个基本流。 FileInputStream 会从文件中读取数据,放到缓冲输入流的缓冲区当中。因为缓冲区的默认大小为 8192,所以会一次性读取 8192 个字节。 FileOutputStream 会把缓冲
阅读全文
摘要:字节缓冲流: 原理:底层自带了长度为 8192 的缓冲区。利用缓冲区可以一次读写 8192 个字节,从而提高性能 public BufferedInputStream (InputStream is) → 把基本流包装成高级流,提高读取数据的性能 public BufferedOutputStrea
阅读全文
摘要:缓冲流是高级流,它对 基本流 做了一个包装,所以在底层,真正读写数据的还是 InputStream 和 OutputStream 这两个基本流,只不过有了缓冲流的加持,读写的效率更高而已
阅读全文
摘要:一个数 异或 另一个数两次,结果不变 例如:100 ^ 10 = 110 110 ^ 10 = 100 (即 100 ^ 10 ^ 10 = 100)
阅读全文
摘要:字节流:可以拷贝任意类型的文件 字符流: 1. 可以读取纯文本文件中的数据 2. 可以往纯文本文件中写出数据
阅读全文
摘要:FileWriter 书写细节: 1. 创建字符输出流对象 细节①:参数是字符串表示的路径 或者 File 对象都可以 细节②:如果文件不存在会创建一个新的文件,但要保证父级路径是存在的 细节③:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关 2. 写数据 细节:如果 write 方法
阅读全文
摘要:FileReader fr = new FileReader("E:\\Java基础资料\\a.txt");char[] chars = new char[2];while (true) { int len = fr.read(chars); if (len == -1) break; System
阅读全文
摘要:FileReader:从纯文本文件中读取数据 FileReader 的使用步骤: 1. 创建字符输入流对象 → public FileReader (File file) 或者 public FileReader (String pathname) 细节:如果文件不存在,就直接报错 2. 读取数据
阅读全文
摘要:字符流的底层其实就是字节流,只不过在字节流的基础上又添加了字符集的概念(字符流 = 字节流 + 字符集) 字符流的特点: 输入流:一次读一个字节,遇到中文时,一次读多个字节(GBK一次读两个,UTF-8一次读三个) 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中 字符流应用场景
阅读全文
摘要:所谓编码,就是把我们要存储的数据变成能真正的存储在硬盘当中的字节数据 编码的方法: public byte[] getBytes () → 使用默认方式进行编码(idea默认使用UTF-8;eclipse默认使用GBK) public byte[] getBytes (String charsetN
阅读全文
摘要:所谓编码,就是把我们要存储的数据变成能真正的存储在硬盘当中的字节数据
阅读全文
摘要:为什么会有乱码? 原因①:读取数据的时候未读完整个汉字 原因②:编码和解码的方式不统一 如何不产生乱码? 1. 不要用字节流读取文本文件 2. 编码解码时使用同一个码表,同一种编码方式 问:字节流读取中文会乱码,但为什么拷贝文本文件不会乱码呢? 答:拷贝时,是一个字节一个字节地拷贝过去的,数据没有丢
阅读全文
摘要:UTF-8 不是字符集,而是 Unicode 字符集的一种编码方式 UTF-8 编码规则:用 1~4 个字节保存 UTF-8 规定,如果是 ASCII 里面的英文字母,统一用一个字节表示,二进制的第一位是 0,转成十进制是正数 UTF-8 规定 一个中文用三个字节表示,二进制的第一位是 1,第一个字
阅读全文
摘要:在计算机中,任意数据都是以二进制的形式来存储的 8个比特为1个字节,字节是计算机最小的存储单元 计算机在存储英文的时候,只需一个字节 简体中文版 Windows 默认使用 GBK 字符集。GBK 字符集完全兼容 ASCII 字符集 GBK编码: 规则①:一个汉字用两个字节存储(英文字母占一个字节,二
阅读全文
摘要:finally 里面的代码是一定会执行的,除非虚拟机停止(跟 JVM 退出是一个意思) 所以经常把释放资源之类的扫尾代码放在 finally 里面 语法格式: try { } catch (Exception e) { } finally { } JDK7 的时候,Java 推出了一个接口叫 Aut
阅读全文
摘要:public int read () → 一次读取一个字节数据 public int read (byte[] buffer) → 一次读取一个字节数组的数据,读取完后,会把读取到的数据还存到参数的数组当中; 返回值表示 本次读取到了多少个字节数据,如果读不到数据,返回 -1 read (byte[
阅读全文
摘要:基本代码:FileInputStream fis = new FileInputStream("E:\\Java基础资料\\a.txt");FileOutputStream fos = new FileOutputStream("E:\\Java基础资料\\b.txt" );while (true)
阅读全文
摘要:FileInputStream fis = new FileInputStream("E:\\Java基础资料\\a.txt");/*int b;while((b = fis.read()) != -1) { System.out.print((char)b);}*/while (true) { i
阅读全文
摘要:1. 创建字节输入流对象:FileInputStream fis = new FileInputStream("E:\\Java基础资料\\a.txt"); 细节:如果文件不存在,就直接报错 2. 读取数据(read 方法负责读取数据,会一个一个地读,如果读不到了,就会返回 -1) 细节①:一次读取
阅读全文
摘要:操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来 步骤: 1. 创建字节输入流对象 FileInputStream fis = new FileInputStream("E:\\Java基础资料\\a.txt"); 2. 读取数据(read 方法负责读取数据,会一个一个地读,如果读不到
阅读全文
摘要:要想换行写,只需在两个 write() 方法之间再次写出一个换行符就可以了 Windows:\r\n Linux:\n Mac:\r 细节:在 Windows 操作系统当中,Java 对回车换行进行了优化,虽然完整的是 \r\n,但是我们写其中一个 \r 或者 \n,Java 也能实现换行,因为 J
阅读全文
摘要:void write (int b) → 一次写一个字节数据 void write (byte[] b) → 一次写一个字节数组数据 void write (byte[] b , int off , int len) → 一次写一个字节数组的部分数据 参数一:装着所有数据的数组。参数二:起始索引。参
阅读全文
摘要:1. 创建字节输出流对象:FileOutputStream fos = new FileOutputStream("E:\\Java基础资料\\a.txt"); 细节①:参数可以是字符串表示的路径,也可以是 File 对象 细节②:如果文件不存在,会创建一个新的空文件,但是要保证父级路径是存在的 细
阅读全文
摘要:FileOutputStream:操作本地文件的字节输出流,可以把程序中的数据写到本地文件中 步骤: 1. 创建字节输出流对象 2. 写数据 3. 释放资源 eg: public static void main(String[] args) throws IOException { FileOut
阅读全文
摘要:IO 流:存储和和读取数据的解决方案 IO 流用于读写文件中的数据(可以读写文件,或网络中的数据...) IO 流可以把程序中的数据保存到本地文件当中,也叫写出数据(output),还可以把本地文件中的数据加载到程序当中,也叫读取数据(input) 问:IO 流中,谁在读,谁在写?以谁为参照物看读写
阅读全文
摘要:public static void main(String[] args) { File f = new File("E:\\Java基础资料\\哈哈"); HashMap<String, Integer> count = getCount(f); StringBuilder sb = new S
阅读全文
摘要:list () 方法:获取当前该路径下所有内容(仅仅能获取名字)
阅读全文
摘要:public File[ ] listFiles () → 获取当前该路径文件夹下所有内容,把所有的内容放到数组中返回 File f = new File("E:\\Java基础资料");File[] files = f.listFiles();for (File file : files) { /
阅读全文
摘要:createNewFile () 方法: 细节一:如果当前路径表示的文件不存在,则创建成功,方法返回 true;如果当前路径表示的文件已经存在,则创建失败,方法返回 false 细节二:如果父级路径是不存在的,那么方法会有 IOException 异常 细节三:createNewFile () 方法
阅读全文
摘要:length () 方法的细节:只能获取文件的大小,单位是字节。如果我们想要的单位是 M,G等,可以不断地除以 1024 len / 1024:KB len / 1024 / 1024:MB len / 1024 / 1024 / 1024:G 如果我们要获取一个文件夹的大小,需要把这个文件夹里面所
阅读全文
摘要:File 对象就表示一个路径,可以是文件的路径,也可以是文件夹的路径。甚至这个路径可以是存在的,也可以是不存在的 File 类常见的构造方法有三个: public File (String pathname) → 根据文件路径创建文件对象。把字符串表示的路径变成 File 对象 public Fil
阅读全文
摘要:自定义异常的意义:让控制台的报错信息更加见名知意 步骤: 1. 定义异常类,类名要见名知意 2. 写继承关系。如果定义的异常是运行时异常,要继承 RuntimeException;如果是编译时异常,直接继承 Exception 3. 写空参构造 4. 写带参构造
阅读全文
摘要:抛出 核心思想:告诉调用者方法里面有问题了。所以更多的是写在方法里面的。 捕获 核心思想:不让程序停止,让程序运行下去。所以捕获更多的是写在方法的调用处。
阅读全文
摘要:throws:写在方法定义处,表示声明一个异常,告诉调用者,使用本方法可能会有哪些异常(编译时异常:必须要写;运行时异常:可以不写) 语法: public void 方法 () throws 异常类名1 , 异常类名2 ... { } throw:写在方法内,表示结束方法。用来手动抛出异常对象,把异
阅读全文
摘要:一、如果 try 中没有遇到问题,怎么执行? 答:会把 try 里面所有的代码全部执行完毕,不会执行 catch 里面的代码。只有当出现了异常才会执行 catch 里面的代码 二、如果 try 中可能会遇到多个问题,怎么执行? 答:会写多个 catch 与之对应。如果我们要捕获多个异常,这些异常中如
阅读全文
摘要:语法格式: try { 可能出现异常的代码 ; } catch (异常类名 变量名) { 异常的处理代码 ; } 目的:当代码出现异常时,可以让程序继续往下执行 代码的执行逻辑: int[] arr = {1, 2, 3};try { System.out.println(arr[10]); Sys
阅读全文
摘要:第一步:把异常的名称、异常的原因及异常出现的位置等信息打印在了控制台,并且是以红色字体打印的 第二步:程序停止执行,异常下面的代码不会再执行了
阅读全文
摘要:1. 引用静态方法: 格式: 类名 : : 静态方法名 (Integer : : parseInt) 2. 引用成员方法 3. 引用构造方法
阅读全文
摘要:方法引用的概念:把已经有的方法拿过来用,当作函数式接口中抽象方法的方法体 方法引用需要满足的条件: 1. 引用处必须是函数式接口 2. 被引用的方法必须是已经存在的 3. 被引用方法的形参和返回值需要跟抽象方法保持一致 4. 被引用方法的功能要满足当前需求 : : 是方法引用符,是方法引用当中独特的
阅读全文
摘要:void forEach ( Consumer action ) → 遍历 long count () → 统计 toArray () → 收集流中的数据,放到数组中 collect ( Collector collector ) → 收集流中的数据,放到集合中 count () 方法: Array
阅读全文
摘要:sorted ():排序 举例: sorted (): ArrayList<Integer> list = new ArrayList<>();Collections.addAll(list, 1, 6, 5);list.stream().sorted(new Comparator<Integer>
阅读全文
摘要:作用:结合了 Lambda 表达式,简化集合、数组的操作 步骤: 1. 先得到一条 Stream 流(流水线),并把数据放上去 2. 使用 中间方法 对流水线上的数据进行操作 3. 使用 终结方法 对流水线上的数据进行操作 获取Stream流: 单列集合:default Stream<E> stre
阅读全文
摘要:如果不想让别人修改集合中的内容,只想让别人仅能够查询数据,就可以用不可变集合 在 List、Set、Map 接口中,都存在静态的 of 方法,可以获取一个不可变的集合 eg:List<String> list = List.of ( "张三" , "李四" );
阅读全文
摘要:https://element-plus.org/zh-CN/component/button.html
阅读全文
摘要:对 vuex 或 Pinia 里面的内容做本地持久化 1. 安装插件: npm i pinia-plugin-persistedstate 2. 将插件添加到 pinia 实例上 ① main.js 里导入持久化插件:import piniaPluginPersistedstate from 'pi
阅读全文
摘要:import { defineStore } from 'pinia' import { ref } from 'vue' import axios from 'axios' export const useChannelStore = defineStore('channel', () => {
阅读全文
摘要:Pinia 是 Vue 的最新 状态管理工具,是 Vuex 的替代品 Pinia 的优势: 1. 提供更简单的 API(去掉了 mutation) 2. 提供符合 组合式风格的 API(和 Vue3 新语法统一) 3. 去掉了 modules 的概念,每一个 store 都是一个独立的模块 4. 配
阅读全文
摘要:作用和场景:顶层组件向任意的底层组件 传递数据和方法,实现 跨层组件通信 跨层传递普通数据 步骤: 1. 顶层组件通过 provide 函数提供数据 provide ( ' key ' , 顶层组件中的数据 ) 2. 底层组件通过 inject 函数获取数据 const message = inje
阅读全文
摘要:模板引用的概念:通过 ref 标识 获取真实的 dom对象或者组件实例对象 使用: 1. 调用 ref 函数生成一个 ref 对象 <script setup> import { ref } from 'vue' const h1Ref = ref (null) </script> 2. 通过 re
阅读全文
摘要:步骤: 1. 子组件内部通过 emit 方法触发事件 ① 通过 defineEmits 编译器宏生成 emit 方法 <script setup> const emit = defineEmits ([ 'get-message' ]) // get-message:可以触发的事件 </script
阅读全文
摘要:步骤: 一、父给子传 写死的值 1. 父组件中给子组件 以添加属性的方式传值 <script setup> import sonComVue from './son-com.vue' // 局部注册 </script> <template> <sonComVue message = "黑马程序员">
阅读全文
摘要:计算属性基本思想和 Vue2 的完全一致,组合式 API 下的计算属性只是修改了写法 核心步骤: 1. 导入 computed 函数 <script setup> import { computed } from 'vue' </script> 2. 执行函数 在回调参数中 return 基于响应式
阅读全文
摘要:Vue中默认的数据并不是响应式的,如果我们希望数据是响应式的,则需要通过 reactive 或者 ref 进行处理。 reactive (): 作用:接收 对象类型的数据作为参数传入 并返回一个 响应式对象 reactive 不能处理简单类型的数据 reactive 使用步骤: 1. 在 <scri
阅读全文
摘要:组合式 API:一系列函数,有时需要调用这些函数编写组件逻辑。 setup 是组合式 API 的入口,先写 setup,才能往里边写组合式 API 的函数 setup 的执行时机会比 beforeCreate 生命周期钩子还要早,因此 setup 函数中获取不到 this setup 选项的写法:(
阅读全文
摘要:create-vue 是 Vue 官方新的脚手架工具,底层切换到了 vite(下一代构建工具),为开发提供极速响应 使用 create-vue 创建项目: 1. 前提环境条件: 已安装 16.0 或更高版本的 Node.js(node -v) 2. 创建一个 Vue 应用:npm init vue
阅读全文
摘要:模块拆分: 1. 在 store 文件夹下再新建文件夹 modules,在 modules 下新建 xxx.js 文件: eg:新建 user.js 文件 const state = { userInfo: { name: 'zs', age: 18 }, score: 80 } const mut
阅读全文
摘要:actions:处理异步操作 需求:一秒钟之后,修改 state 的 count 成 200 说明:mutations 必须是同步的(便于监测数据变化,记录调试) actions 本质上不是直接修改 state 的数据,因为要修改 state 必须要经过 mutations,所以就算想要处理异步,也
阅读全文
摘要:目标:明确如何给仓库提供数据,如何使用仓库的数据 一、提供数据: State 提供唯一的公共数据源,所有共享的数据都要统一放到 Store 中的 State 中存储。在 state 对象中可以添加我们要共享的数据。 // state : 状态,即数据,类似于 vue 组件中的 data(区别:dat
阅读全文
摘要:vuex 是一个插件,可以帮我们管理 vue 通用的数据(多组件共享的数据) 应用场景: 1. 某个状态在很多个组件来使用(个人信息) 2. 多个组件共同维护一份数据(购物车) vuex 的优势: 1. 共同维护一份数据,数据集中化管理 2. 响应式变化 3. 操作简洁(vuex 提供了一些辅助函数
阅读全文
摘要:编程式导航:通过 JS 的方式实现路由跳转 如何实现点击按钮跳转? 一、不传参: 1. 通过 path 路径跳转(简易方便) ① 简写: 按钮的点击事件中写 this.$router.push ( ' /路由路径 ' ) 比如:this.$router.push ( ' /search ' ) ②
阅读全文
摘要:问题描述:网页打开,url 默认是 / 路径,未匹配到组件时,会出现空白 解决:重定向 → 匹配 path 后,强制跳转 path 路径 语法:{ path : 匹配路径 , redirect : 重定向到的路径 } const router = new VueRouter({ routes: [
阅读全文
摘要:vue-router 提供了一个全局组件 router-link(取代 a 标签) router-link 本质还是 a 标签 router-link 功能: ① 能跳转,配置 to 属性指定路径(必须),本质还是 a 标签,to 无需 # ② 能高亮,默认就会提供 高亮类名,可以直接设置高亮样式
阅读全文
摘要:Vue 中路由:路径 和 组件 的映射关系,根据路由就能知道不同的路径应该匹配渲染哪个组件 VueRouter 作用:修改地址栏路径时,切换显示匹配的组件 VueRouter 的使用步骤: 1. 五个固定步骤: ① 下载 VueRouter 模块到当前工程,版本 3.6.5(Vue2 对应的版本是
阅读全文
摘要:插槽的作用:让组件内部的一些 结构 支持 自定义 应用场景 eg:将对话框封装成组件,对话框的内容部分不希望写死,希望能使用的时候自定义。 插槽的基本语法: 1. 组件内需要定制的结构部分 改用 <slot> </slot> 占位 2. 使用组件时,<MyDialog></MyDialog> 标签内
阅读全文
摘要:自定义指令:自己定义的指令,可以封装一些 dom 操作,扩展额外功能 语法: (无论是全局方式定义指令 还是 局部方式定义指令,最终 只要把指令定义完成,页面当中用起来 只需要 eg : <input v-指令名 type = "text" > 。只要一绑上,在当前输入框被插入到页面当中的时候,就会
阅读全文
摘要:Vue 是异步更新 DOM 的,想要在 dom 更新完成之后做某件事,可以使用 $nextTick $nextTick:等 dom 更新后,才会触发执行此方法里的函数体 语法: this.$nextTick ( () => { // 业务逻辑 }) eg: this.$nextTick ( () =
阅读全文
摘要:作用:利用 ref 和 $refs 可以用于 获取 dom 元素,或 组件实例 特点: 查找范围:当前组件内(更精确稳定) 语法: ① 获取 dom: 1. 给目标标签添加上 ref 属性 (<div ref = " chartRef "> 我是渲染图表的容器 </div>) 2. 在恰当时机,通过
阅读全文
摘要:作用:可以实现 子组件 与 父组件数据 的 双向绑定,简化代码 特点:prop 属性名可以自定义,非固定为 value 本质:就是 :属性名 和 @update : 属性名 的合写 应用场景:封装弹窗类的基础组件,visible 属性 true 显示,false 隐藏 eg: 父组件: <BaseD
阅读全文
摘要:原理:v-model 本质上是一个语法糖。例如应用在输入框上,就是 value 属性 和 input 事件 的合写(如果应用于复选框,就是 checked 属性和 change 事件的合写,下拉菜单是 value 属性和 change 事件的合写) 作用:提供数据的双向绑定 ①数据变,视图跟着变 :
阅读全文
摘要:共同点:都可以给组件提供数据 不同点: data 的数据是自己的,随便改。 prop 的数据是外部的,不能直接改,要遵循 单向数据流。 单向数据流:父组件的 prop 更新,会单向地向下流动,影响到子组件
阅读全文
摘要:prop:组件上注册的一些自定义属性 prop 作用:向子组件传递数据 prop 特点:可以传递任意数量、任意类型的 prop props 校验 作用:为组件的 prop 指定验证要求,不符合要求,控制台就会有错误提示 语法:1.类型校验 2.非空校验 3.默认值 4.自定义校验 1. 类型校验:
阅读全文
摘要:组件通信是指 组件与组件 之间的数据传递。 组件的数据是独立的,无法直接访问其他组件的数据,想用其他组件的数据,需要通过组件通信方案。 组件关系分类:父子关系、非父子关系 组件通信方案: 父子关系:props(父传子) 和 $emit(子传父) 非父子关系:① provide & inject ②
阅读全文
摘要:一个组件的 data 选项必须是一个函数,可以保证 每个组件实例 维护独立的一份数据对象。每次创建新的组件实例,都会新执行一次 data 函数,得到一个新对象 eg: <script> export default { data () { return { count : 999 } } } </s
阅读全文
摘要:全局注册:所有组件内都能直接使用。在多个组件范围内使用的通用的组件 就可以定义成 全局组件 步骤:① 创建 .vue 文件(三个组成部分) ② main.js 中进行全局注册 //(import 组件对象 from ' .vue文件路径 ') import HmButton from ' ./com
阅读全文
摘要:组件注册的两种方式: 1. 局部注册:只能在注册的组件内使用 ① 创建 .vue 文件(三个组成部分) ② 在使用的组件内导入并注册 eg: (import 组件对象 from ' .vue文件路径 ') import HmHeader from ' ./components/HmHeader '
阅读全文
摘要:组件化:页面可拆分成一个个组件,每个组件有着独立的结构、样式、行为 组件分类:普通组件、根组件 根组件:整个应用最上层的组件,包裹所有普通小组件 一个根组件 App.vue,包含三个部分 App.vue 文件(单文件组件)的三个组成部分:结构、样式、行为 结构通过 template 标签提供,行为通
阅读全文
摘要:1.内容: import Vue from 'vue' //导入 Vue 核心包 import App from './App.vue' //导入 App.vue 根组件 Vue.config.productionTip = false //提示当前处于什么环境(生产环境 / 开发环境),fasle
阅读全文
摘要:打开终端:ctrl + shift + (~`) 启动工程:npm run serve 停止工程:ctrl + c
阅读全文
摘要:Vue的生命周期:一个Vue实例从 创建 到 销毁 的整个过程 生命周期四个阶段:创建、挂载、更新、销毁 ①创建阶段:初始化工作,进行数据的响应式处理,把普通数据 变成 响应式数据(数据变,视图跟着变) ②挂载阶段:渲染模板。结合数据与模板进行渲染 ③更新阶段:用户可以通过页面上的按钮等修改数据。数
阅读全文
摘要:1. 作用:给 表单元素 使用,形成 双向数据绑定,可以快速 获取或设置 表单元素内容,v-model会根据 控件类型 的不同自动选取 正确的方法 来更新元素。(常见的表单元素有 input:text输入框、textarea文本域、radio单选框、checkbox复选框、select下拉菜单等等)
阅读全文
摘要:1. 作用:基于数据循环,多次渲染整个元素(可以遍历 数组、对象、数字 ......) 2. 遍历数组语法:v-for = "(item, index) in 数组名" (item:遍历时的每一项;index:遍历时的下标) 如果不需要下标,则可以简写:v-for = "item in 数组名" e
阅读全文
摘要:1. 作用:动态设置 html 的标签属性(eg:src、url、title ......) 2. 语法:v-bind : 属性名 = "表达式" 或 : 属性名 = "表达式"(简写形式) 3. 例子: new Vue 的 data 里面定义一个变量 imgUrl : './imgs/10-01.
阅读全文
摘要:1. v-on 作用:注册事件(注册事件 = 添加监听 + 提供处理逻辑) 2. 语法: ① v-on : 事件名 = "内联语句" eg:<button v-on:click="count++"> 点我加一 </button> ② v-on : 事件名 = "methods中的函数名" 或 v-o
阅读全文
摘要:v-else 、 v-else-if 作用:都是辅助 v-if 进行判断渲染的。 语法:v-else:后面不需要跟任何表达式,直接表示的是:否则; v-else-if :v-else-if = "表达式" true则渲染 注意:v-else 或 v-else-if 都需要紧挨着 v-if 一起使用
阅读全文
摘要:v-show : 1.作用:控制元素显示隐藏 2.语法:v-show = "表达式" 表达式值为 true 则显示, false 则隐藏 3.底层原理:切换 css 的 display: none 来控制显示隐藏 4.使用场景:频繁切换显示隐藏的场景 v-if : 1.作用:控制元素显示隐藏(条件渲
阅读全文