Java 7新特性深度解析:提升效率与功能

在这里插入图片描述

文章目录

  • Java 7新特性深度解析:提升效率与功能
    • 一、Switch中添加对String类型的支持
    • 二、数字字面量的改进
    • 三、异常处理(捕获多个异常)
    • 四、增强泛型推断
    • 五、NIO2.0(AIO)新IO的支持
    • 六、SR292与InvokeDynamic
    • 七、Path接口
    • 八、fork/join计算框架

Java 7新特性深度解析:提升效率与功能

一、Switch中添加对String类型的支持

Switch语句可以使用原始类型或枚举类型。

Java引入了另一种类型,可以在switch语句中使用:字符串类型。

public class switchAddString {public static void main(String[] args) {String s = "a";switch (s) {case "a":System.out.println("a");break; case "b":System.out.println("b");break;default:System.out.println("default");}}
}

编译器在编译时的处理情形

  1. 仅有一个casedefault,则直接转换为if…else…
  2. 有多个case。先将String转换为hashCode,然后相应的进行处理。

二、数字字面量的改进

  1. 数字中可加入分隔符
    • Java7中支持在数字量中间添加’_’作为分隔符。
    • 下划线仅仅能在数字中间。
    • 编译时编译器自己主动删除数字中的下划线。
  2. Java7添加二进制表示。
public static void main(String[] args) {int i = 10;System.out.println("i=" + i);// 二进制int j = 0b1010;// 十六进制int k = 0x1234;// 1,000,000int l = 1_000_000;// 1,000,000int m = 1__000_000;System.out.println("j=" + j);System.out.println("k=" + k);System.out.println("l=" + l);System.out.println("m=" + m);}

三、异常处理(捕获多个异常)

  1. catch子句能够同一时候捕获多个异常
    • 使用’|'切割,多个类型,一个对象e 。
  2. try-with-resources语句
    • Java7之前须要在finally中关闭socket、文件、数据库连接等资源。
    • Java7引入try-with-resources,用于确保资源在使用后能够正确地关闭。
    • 在使用try-with-resources时,你可以在 try 关键字后面的括号中声明一个或多个资源。
    • 这些资源必须实现 AutoCloseable 接口(Java 7引入的接口,它具有一个 close() 方法用于释放资源)。
public static void main(String[] args) {// 捕获多个异常try {int a = 10;int b = 0;System.out.println("a/b=" + (a / b));} catch (ArithmeticException | NullPointerException e) {e.printStackTrace();}// try-with-resources,在 try 关键字后面的括号中声明一个或多个资源,每个资源用逗号分隔String fileName = "example.txt";try (// 使用try-with-resources声明BufferedReader资源BufferedReader reader = new BufferedReader(new FileReader(fileName));// 需要声明多个资源,我们只需在括号中用逗号分隔BufferedReader reader1 = new BufferedReader(new FileReader("file1.txt"));BufferedReader reader2 = new BufferedReader(new FileReader("file2.txt"))) {// 读取文件内容String line;while ((line = reader.readLine()) != null) {System.out.println(line);}// 这里不需要显式调用reader.close(),因为try-with-resources会自动处理} catch (IOException e) {// 处理可能发生的IOExceptione.printStackTrace();}// 在try代码块执行完毕后,reader会被自动关闭}

四、增强泛型推断

  1. 菱形操作符
    • 在实例化泛型类时,可以使用菱形操作符 <> 来省略类型参数。
    • 编译器会根据上下文推断类型参数。
    • 简化代码,减少冗余,提高代码的可读性。
  2. 泛型实例化类型推断
    • 当泛型类的构造函数的参数包含泛型类型时,Java 7 能够推断泛型的类型。
    • 这允许你在实例化泛型类时省略类型参数,只在构造函数参数中指定类型即可。
public static void main(String[] args) {// Java7之前ArrayList<String> arrayList = new ArrayList<String>();// Java7之后ArrayList<String> arrayList2 = new ArrayList<>();// 泛型类class Generic<T> {// 构造函数参数为泛型类型public Generic(T t) {}}// 使用泛型实例化类型推断Generic<String> generic = new Generic<>("abc");}

五、NIO2.0(AIO)新IO的支持

Java 7 引入了 NIO 2.0(New I/O),其中包含对异步 I/O(AIO)的支持,这是一个显著的新特性,特别是在处理非阻塞 I/O 操作时非常有用。具体来说,NIO 2.0 的 AIO 支持通过引入 AsynchronousFileChannel 类来实现异步文件 I/O 操作。

  1. AsynchronousFileChannel 类:
    • 允许进行异步文件读取和写入操作。
    • 相比于传统的阻塞 I/O,异步 I/O 可以在读写数据的同时执行其他操作,从而提高系统的效率和性能。
public static void main(String[] args) throws Exception {// 异步读取文件Path path = Paths.get("file.txt");AsynchronousFileChannel fileChannel = AsynchronousFileChannel.open(path, StandardOpenOption.READ);// 分配缓冲区ByteBuffer buffer = ByteBuffer.allocate(1024);// 读取文件long position = 0;// 异步读取数据,用于检查读取操作的状态和获取读取的结果Future<Integer> operation = fileChannel.read(buffer, position);while (!operation.isDone()) {// 等待读取完成Thread.sleep(1000);}// 读取完成,将缓冲区数据翻转buffer.flip();// 读取数据byte[] data = new byte[buffer.limit()];// 将缓冲区数据复制到data中buffer.get(data);System.out.println(new String(data));// 关闭文件fileChannel.close();}
  1. AsynchronousServerSocketChannel 和 AsynchronousSocketChannel:
    • 用于支持异步的网络编程。
    • 这些类允许你创建异步服务器端和客户端,并进行异步的网络数据读取和写入操作。
    • 在高并发环境下处理 I/O 操作变得更为高效和灵活。
public static void main(String[] args) throws Exception {// 创建异步通道AsynchronousServerSocketChannel serverChannel =AsynchronousServerSocketChannel.open().bind(new InetSocketAddress(8080));// 接受连接serverChannel.accept(null, new CompletionHandler<AsynchronousSocketChannel, Void>() {/*** 接受连接完成时调用此方法。* @param clientChannel* @param attachment*/@Overridepublic void completed(AsynchronousSocketChannel clientChannel, Void attachment) {// 继续接受连接serverChannel.accept(null, this);// 读取数据ByteBuffer buffer = ByteBuffer.allocate(1024);// 异步读取数据clientChannel.read(buffer, buffer, new CompletionHandler<Integer, ByteBuffer>() {/*** 当读取操作完成时调用此方法。** @param result 读取操作的结果,通常为读取的字节数,但在此处未使用* @param attachment 包含读取数据的ByteBuffer对象*/@Overridepublic void completed(Integer result, ByteBuffer attachment) {// 处理读取完成attachment.flip();// 读取数据byte[] data = new byte[attachment.limit()];// 将数据复制到数组中attachment.get(data);System.out.println(new String(data));}/*** 读取操作失败时调用此方法。* @param exc* @param attachment*/@Overridepublic void failed(Throwable exc, ByteBuffer attachment) {// 处理读取失败}});}/*** 接受连接失败时调用此方法。* @param exc* @param attachment*/@Overridepublic void failed(Throwable exc, Void attachment) {// 处理接受连接失败}});// 程序继续执行其他操作Thread.sleep(Long.MAX_VALUE);}

六、SR292与InvokeDynamic

  1. SR-292(Small Ranges):
    • SR-292 是 Java 7 中引入的一个改进,主要针对 switch 语句的性能优化。
    • 在早期的 Java 版本中,switch 语句的效率问题在于它通过逐个比较每个 case 条件来确定执行的分支,如果分支很多,这个过程可能会很慢。
    • SR-292 引入了一种优化,即当 switch 语句的 case 常量之间的距离非常小(称为 “small ranges”),Java 编译器会使用一种更有效的查找方式,而不是简单的逐个比较。
    • 这种方式可以显著提高 switch 语句的执行速度,特别是在处理密集的条件分支时。
public static void main(String[] args) {int month = 3;String monthName;// Java 7 的 SR-292 特性可以在一些情况下优化这样的 switch 语句,尤其是在 case 常量的范围较小时switch (month) {case 1:monthName = "January";break;case 2:monthName = "February";break;case 3:monthName = "March";break;case 4:monthName = "April";break;case 5:monthName = "May";break;case 6:monthName = "June";break;default:monthName = "Unknown";break;}System.out.println("Month: " + monthName);}
  1. InvokeDynamic(动态方法调用):
    • InvokeDynamicJava 7 引入的另一个重要特性,它是 Java 虚拟机(JVM)层面的改进,旨在支持更灵活和高效的动态语言实现。
    • 允许 Java 代码中的方法调用在运行时动态解析,并且可以绑定到相应的方法实现。
    • 用来优化字节码生成和方法调用的性能。
    • Java 8Lambda 表达式依赖于 InvokeDynamic 来生成相应的字节码。
public static void main(String[] args) throws Throwable {// 创建动态调用MethodHandles.Lookup lookup = MethodHandles.lookup();// 创建方法句柄,使用lookup对象来查找Math.class中的静态方法sqrt,该方法接受一个double参数并返回一个dou* 第一个参数是`lookup`对象。MethodHandle mh = lookup.findStatic(Math.class, "sqrt",MethodType.methodType(double.class, double.class));// 创建动态调用// 第一个参数是`lookup`对象// 第二个参数是方法名,这里使用`"apply"`,因为它是`Function`接口中唯一的方法。// 第三个参数是`Function`接口的签名(即`Function.class`的类型)。// 第四个参数是`mh`的泛型类型签名。// 第五个参数是我们要调用的方法句柄(即`mh`)。// 第六个参数是`mh`的类型签名,表示我们要调用的方法的实际类型。CallSite sqrt = LambdaMetafactory.metafactory(lookup, "apply",MethodType.methodType(Function.class),mh.type().generic(),mh,mh.type());// 调用动态调用MethodHandle factory = sqrt.getTarget();// 调用工厂方法,得到一个Function对象,使用了强制类型转换,因为factory.invoke()返回的是一个ObjectFunction<Double, Double> sqrtFunc = (Function<Double, Double>) factory.invoke();double result = sqrtFunc.apply(16.0);System.out.println("Square root of 16: " + result);}

七、Path接口

在 Java 7 之前,通常使用 java.io.File 类来处理文件路径,Java 7 引入了 java.nio.file.Path 接口,它是 Java 中操作文件和目录路径的抽象表示。 Path 接口提供了更多功能和更强大的操作能力。

Path 接口的一些主要特性和用法

  1. 路径表示

    • Path 接口可以表示文件系统中的路径,可以是文件或目录。它不仅仅是一个字符串,而是一个真正的对象,提供了丰富的方法来操作路径。
  2. 创建路径

    • 可以使用Paths 类的静态方法来创建 Path 对象

      Path path = Paths.get("/path/to/file.txt");
      
  3. 路径操作

    • Path 接口提供了多种方法来获取路径的信息
      • toString():将路径转换为字符串表示。
      • getFileName():获取路径中的文件名部分。
      • getParent():获取路径中的父路径。
      • getRoot():获取路径的根部分。
      • getNameCount():获取路径中的名称元素的数量。
      • subpath(int beginIndex, int endIndex):获取指定范围内的子路径。
  4. 路径解析

    • resolve() 方法可以用于解析相对路径或者连接两个路径,返回一个新的路径对象。
  5. 检查路径属性

    • 可以使用 Files 类的静态方法来检查文件或目录的属性,例如是否存在、是否可读、是否可写等。
  6. 文件操作

    • Files 类结合 Path 接口提供了丰富的文件操作功能,包括读取文件内容、写入文件、复制、移动、删除等。
  7. 路径迭代

    • Path接口支持迭代,可以方便地遍历路径的各个部分。

      for (Path element : path) {System.out.println(element);
      }
      
  8. 相对路径和绝对路径

    • Path 接口可以表示相对路径和绝对路径,并提供了方法来转换和处理这两种路径。
public static void main(String[] args) {// 创建一个 Path 对象Path path = Paths.get("/path/to/file.txt");// 获取文件名Path fileName = path.getFileName();System.out.println("File Name: " + fileName);// 获取父路径Path parent = path.getParent();System.out.println("Parent Path: " + parent);// 获取路径的根部分Path root = path.getRoot();System.out.println("Root of the path: " + root);// 获取路径的元素数量int nameCount = path.getNameCount();System.out.println("Number of elements in the path: " + nameCount);// 遍历路径的每个元素System.out.println("Elements in the path:");for (int i = 0; i < nameCount; i++) {System.out.println("Element " + i + ": " + path.getName(i));}// 路径解析示例Path resolvedPath = path.resolve("subdir");System.out.println("Resolved Path: " + resolvedPath);// 检查文件或目录的属性// 判断文件是否存在boolean exists = Files.exists(path);System.out.println("Exists: " + exists);// 判断文件是否是目录boolean isReadable = Files.isReadable(path);System.out.println("Readable: " + isReadable);// 判断文件是否是可写boolean isWritable = Files.isWritable(path);System.out.println("Writable: " + isWritable);// 读取文件内容Path filePath = Paths.get("/path/to/file.txt");List<String> lines = null;try {lines = Files.readAllLines(filePath, StandardCharsets.UTF_8);} catch (IOException e) {throw new RuntimeException(e);}for (String line : lines) {System.out.println(line);}// 写入文件内容Path newFilePath = Paths.get("/path/to/newfile.txt");String content = "Hello, Java 7!";try {Files.write(newFilePath, content.getBytes());} catch (IOException e) {throw new RuntimeException(e);}// 复制文件Path copiedFilePath = Paths.get("/path/to/copiedfile.txt");try {Files.copy(filePath, copiedFilePath, StandardCopyOption.REPLACE_EXISTING);} catch (IOException e) {throw new RuntimeException(e);}// 移动文件Path targetPath = Paths.get("/path/to/targetdir/movedfile.txt");try {Files.move(filePath, targetPath, StandardCopyOption.REPLACE_EXISTING);} catch (IOException e) {throw new RuntimeException(e);}// 删除文件try {Files.delete(filePath);} catch (IOException e) {throw new RuntimeException(e);}}

八、fork/join计算框架

Java 7 引入了 Fork/Join 框架,是一种并行计算框架,专门用于解决分而治之的问题。主要用于执行递归式地将问题划分为更小子问题,并行执行这些子问题的计算,然后合并结果的任务。

使用 Fork/Join 框架的基本步骤:

  1. 定义任务类 (RecursiveTaskRecursiveAction):
    • RecursiveTask: 用于有返回值的任务。
    • RecursiveAction: 用于无返回值的任务。
  2. 重写 compute() 方法:
    • 在任务类中,需要实现 compute() 方法来定义任务的具体执行逻辑。
    • 通常会判断是否需要进一步拆分任务,执行子任务的计算,最终将子任务的结果合并或处理。
  3. 创建 Fork/Join 池:
    • 使用 ForkJoinPool 类来管理并发执行的任务。
    • 通常可以通过 ForkJoinPool.commonPool() 方法来获取默认的线程池,也可以根据需要创建自定义的线程池。
  4. 提交任务:
    • 将任务提交给 ForkJoinPool 来执行。

使用 Fork/Join 框架来计算数组的总和Demo

import java.util.concurrent.*;// 继承 RecursiveTask 来实现有返回值的任务
class SumTask extends RecursiveTask<Long> {// 阈值,控制任务拆分的粒度private static final int THRESHOLD = 10;private int[] array;private int start;private int end;public SumTask(int[] array, int start, int end) {this.array = array;this.start = start;this.end = end;}@Overrideprotected Long compute() {if (end - start <= THRESHOLD) {// 如果任务足够小,直接计算结果long sum = 0;for (int i = start; i < end; i++) {sum += array[i];}return sum;} else {// 否则,拆分任务为更小的子任务int mid = (start + end) / 2;SumTask leftTask = new SumTask(array, start, mid);SumTask rightTask = new SumTask(array, mid, end);// 异步执行左边的子任务leftTask.fork();// 同步执行右边的子任务long rightResult = rightTask.compute(); // 获取左边子任务的结果long leftResult = leftTask.join(); // 合并子任务的结果return leftResult + rightResult;}}
}public class ForkJoinDemo {public static void main(String[] args) {int[] array = new int[100];for (int i = 0; i < array.length; i++) {array[i] = i;}// 创建 Fork/Join 线程池ForkJoinPool forkJoinPool = ForkJoinPool.commonPool();// 创建任务并提交给 Fork/Join 线程池SumTask task = new SumTask(array, 0, array.length);long result = forkJoinPool.invoke(task);// 输出计算结果System.out.println("Sum: " + result);}
}

如果你累了,学会休息,而不是放弃

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

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

相关文章

WordPress网站添加插件和主题时潜在危险分析

WordPress 最初只是一个简单的博客软件&#xff0c;现在据估计为全球前 1000 万个网站中的 30% 提供支持。WordPress受欢迎的因素之一是可以轻松创建插件和主题来扩展它并提供比默认设置更多的功能。 目前&#xff0c;WordPress 网站列出了 56,000 多个插件以及数千个主题。插件…

DatawhaleAI夏令营2024 Task2

#AI夏令营 #Datawhale #夏令营 赛题解析一、Baseline详解1.1 环境配置1.2 数据处理任务理解2.3 prompt设计2.4 数据抽取 二、完整代码总结 赛题解析 赛事背景 在数字化时代&#xff0c;企业积累了大量对话数据&#xff0c;这些数据不仅是交流记录&#xff0c;还隐藏着宝贵的信…

python读取csv出错怎么解决

Python用pandas的read_csv函数读取csv文件。 首先&#xff0c;导入pandas包后&#xff0c;直接用read_csv函数读取报错OSError&#xff0c;如下&#xff1a; 解决方案是加上参数&#xff1a;enginepython。 运行之后没有报错&#xff0c;正在我欣喜之余&#xff0c;输出一下d…

linux 服务器数据备份 和 mysql 数据迁移

查看域名ip 查看程序所处文件位置 list open files 1、 lsof -i :port 查看端口获取进程 pid 2、lsof -i pid 1、scp 下载服务器文件到本地 security copy protocol 2、导出服务器 mysql 数据库&#xff08;表&#xff09;到本地 mysqldump是MySQL自带的一个实用程序&…

CentOS 7.9 停止维护(2024-6-30)后可用在线yum源 —— 筑梦之路

众所周知&#xff0c;centos 7 在2024年6月30日&#xff0c;生命周期结束&#xff0c;官方不再进行支持维护&#xff0c;而很多环境一时之间无法完全更新替换操作系统&#xff0c;因此对于yum源还是需要的&#xff0c;特别是对于互联网环境来说&#xff0c;在线yum源使用方便很…

207 课程表

题目 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课程 ai 则 必须 先学习课程 bi 。 …

Qt5.9.9 关于界面拖动导致QModbusRTU(QModbusTCP没有测试过)离线的问题

问题锁定 参考网友的思路&#xff1a; Qt5.9 Modbus request timeout 0x5异常解决 网友认为是Qt的bug&#xff0c; 我也认同&#xff1b;网友认为可以更新模块&#xff0c; 我也认同&#xff0c; 我也编译了Qt5.15.0的code并成功安装到Qt5.9.9中进行使用&#xff0c;界面拖…

51单片机嵌入式开发:3、STC89C52操作8八段式数码管原理

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 STC89C52操作8八段式数码管原理 1 8位数码管介绍1.1 8位数码管概述1.2 8位数码管原理1.3 应用场景 2 原理图图解2.1 74HC573原理2.2 74HC138原理2.3 数码管原理 3 数码管程序…

树模型详解2-GBDT算法

与adaboost一样&#xff0c;GBDT也是采用前向分步算法&#xff0c;只是它会用决策树cart算法作为基学习器&#xff0c;因此先要从分类树和回归树讲起 决策树-提升树-梯度提升树 决策树cart算法 回归树&#xff1a;叶子结点的值是所有样本落在该叶子结点的平均值 如何构建&a…

【绿色版】Mysql下载、安装、配置与使用(保姆级教程)

大家都知道&#xff0c;Mysql安装版的卸载过程非常繁琐&#xff0c;而且卸载不干净会出现许多问题&#xff0c;很容易让大家陷入重装系统的窘境。基于此&#xff0c;博主今天给大家分享绿色版Mysql的安装、配置与使用。 目录 一、Mysql安装、配置与使用 1、下载解压 2、创建…

zabbix 配置钉钉告警

1.申请一个钉钉企业版 2.群内申请一个机器人 下载电脑版钉钉&#xff0c;登录后&#xff0c;在要接收群消息的群里&#xff0c;点击右上角设置图标&#xff0c;下滑找到机器人&#xff0c;添加一个机器人&#xff0c;保存机器人的webhook地址 保存这里的加签字符串 保存这里的…

深度网络现代实践 - 深度前馈网络之反向传播和其他的微分算法篇

序言 反向传播&#xff08;Backpropagation&#xff0c;简称backprop&#xff09;是神经网络训练过程中最关键的技术之一&#xff0c;尤其在多层神经网络中广泛应用。它是一种与优化方法&#xff08;如梯度下降法&#xff09;结合使用的算法&#xff0c;用于计算网络中各参数的…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

Pseudo-Label : The Simple and Efficient Semi-Supervised Learning Method--论文笔记

论文笔记 资料 1.代码地址 https://github.com/iBelieveCJM/pseudo_label-pytorch 2.论文地址 3.数据集地址 论文摘要的翻译 本文提出了一种简单有效的深度神经网络半监督学习方法。基本上&#xff0c;所提出的网络是以有监督的方式同时使用标记数据和未标记数据来训练的…

ASCII码对照表(Matplotlib颜色对照表)

文章目录 1、简介1.1 颜色代码 2、Matplotlib库简介2.1 简介2.2 安装2.3 后端2.4 入门例子 3、Matplotlib库颜色3.1 概述3.2 颜色图的分类3.3 颜色格式表示3.4 内置颜色映射3.5 xkcd 颜色映射3.6 颜色命名表 4、Colorcet库5、颜色对照表结语 1、简介 1.1 颜色代码 颜色代码是…

2024亚太杯数学建模竞赛(B题)的全面解析

你是否在寻找数学建模比赛的突破点&#xff1f;数学建模进阶思路&#xff01; 作为经验丰富的数学建模团队&#xff0c;我们将为你带来2024亚太杯数学建模竞赛&#xff08;B题&#xff09;的全面解析。这个解决方案包不仅包括完整的代码实现&#xff0c;还有详尽的建模过程和解…

数据库-MySQL 实战项目——书店图书进销存管理系统数据库设计与实现(附源码)

一、前言 该项目非常适合MySQL入门学习的小伙伴&#xff0c;博主提供了源码、数据和一些查询语句&#xff0c;供大家学习和参考&#xff0c;代码和表设计有什么不恰当还请各位大佬多多指点。 所需环境 MySQL可视化工具&#xff1a;navicat&#xff1b; 数据库&#xff1a;MySq…

MySQL:如何在已经使用的数据表中增加一个自动递增的字段

目录 一、需求 二、实现步骤 &#xff08;一&#xff09;数据表students &#xff08;二&#xff09;添加整型字段 &#xff08;三&#xff09;更新SID字段的值 1、使用用户定义的变量和JOIN操作 2、用SET语句和rownum变量 &#xff08;1&#xff09;操作方法 &#x…

使用antd的<Form/>组件获取富文本编辑器输入的数据

前端开发中&#xff0c;嵌入富文本编辑器时&#xff0c;可以通过富文本编辑器自身的事件处理函数将数据传输给后端。有时候&#xff0c;场景稍微复杂点&#xff0c;比如一个输入页面除了要保存富文本编辑器的内容到后端&#xff0c;可能还有一些其他输入组件获取到的数据也一并…

MySQL篇三:数据类型

文章目录 前言1. 数值类型1.1 tinyint类型1.2 bit类型1.3 小数类型1.3.1 float1.3.2 decimal 2. 字符串类型2.1 char2.2 varchar2.3 char和varchar比较 3. 日期类型4. enum和set 前言 数据类型分类&#xff1a; 1. 数值类型 1.1 tinyint类型 在MySQL中&#xff0c;整型可以指…