JAVA-八种基础数据类型和包装类型及相关面试题

news2024/11/13 3:45:08

文章目录

  • 前言
  • 一、基本数据类型
    • 1.1 分类
    • 1.2 概念
    • 1.3 代码
    • 1.4 二维表
  • 二、各基本数据类型间强制转换
    • 2.1 为什么Java中有强制转换?
    • 2.2 示例代码
  • 三、包装类型
    • 3.1 为什么有包装类型?
    • 3.2 基本概念
    • 3.3 转换方法
  • 四、转换过程中使用的自动装箱和自动拆箱
    • 4.1 来源
    • 4.2 原理
    • 4.3 示例代码
    • 4.4 二维表
  • 五、相关面试题
    • 5.1 为什么应该避免使用包装类型?
    • 5.2 Java中如何判断两个包装类型是否相等?
    • 5.3 Java中的基本数据类型和包装类型在内存中的存储方式有什么区别?
    • 5.4 Java中的基本数据类型和包装类型可以作为泛型类型参数吗?
    • 5.5 char类型能不能存储一个汉字?为什么?
  • 六、总结

前言

    在计算机编程中,数据类型是非常重要的概念。数据类型定义了变量或表达式能够存储的数据范围和类型。在Java中,有基本数据类型和包装类型两种。基本数据类型包括整型、浮点型、字符型和布尔型,它们是Java语言的基础,直接存储在内存中。而包装类型则是为了解决基本数据类型不能直接参与面向对象编程而设计的,它们是基本数据类型对应的类,提供了更多的操作和功能。

    本文将深入探讨Java中的基本数据类型和包装类型。我们将从数据类型的定义、内存分配、转换规则等方面入手,详细介绍Java中各种数据类型的特点和使用方法。同时,我还将介绍如何在程序中正确地使用基本数据类型和包装类型,以及如何避免常见的数据类型错误和陷阱。

    无论是初学者还是有一定经验的Java开发者,了解数据类型的知识都是非常重要的。希望通过本文的介绍,读者能够更深入地理解Java中的数据类型,更加熟练地运用它们,从而写出更加高效和优秀的Java程序。

    Java是一种面向对象的编程语言,拥有丰富的数据类型和数据结构。在Java中,数据类型可以分为基本数据类型和包装类型。这篇文章将深入探讨这些数据类型及其相关内容。

一、基本数据类型

    Java中的基本数据类型是指直接存储数据值的数据类型。在Java中,基本数据类型有八种:byte、short、int、long、float、double、char和boolean。下面我们将逐一介绍这些数据类型的特点及其使用方法。

1.1 分类

在这里插入图片描述

1.2 概念

byte
    byte是一种8位的有符号数据类型,可以存储-128到+127之间的整数。byte类型通常用于存储小的整数值,例如文件中的字节、图像处理中的像素等。

short
    short是一种16位的有符号数据类型,可以存储-32768到+32767之间的整数。short类型通常用于存储中等大小的整数值,例如音频处理中的采样值等。

int
    int是一种32位的有符号数据类型,可以存储-2147483648到+2147483647之间的整数。int类型是Java程序中最常用的整数类型,通常用于存储整数值。

long
    long是一种64位的有符号数据类型,可以存储-9223372036854775808到+9223372036854775807之间的整数。long类型通常用于存储大整数值,例如时间戳等。

float
    float是一种32位的单精度浮点数据类型,可以存储6~7位有效数字的浮点数。float类型通常用于存储较小的浮点数值,例如科学计算中的实验数据等。

double
    double是一种64位的双精度浮点数据类型,可以存储15~16位有效数字的浮点数。double类型通常用于存储较大的浮点数值,例如金融计算中的货币数据等。

char
    char是一种16位的无符号Unicode字符数据类型,可以存储任何Unicode字符。char类型通常用于存储单个字符,例如字符串中的字符等。

boolean
    boolean是一种布尔数据类型,只能存储true或false两个值。boolean类型通常用于存储条件结果,例如if语句中的条件判断等。

1.3 代码

public class Main {
    public static void main(String[] args) {
        // 整型
        int i = 10;
        System.out.println("int类型:" + i);

        // 浮点型
        float f = 3.14f;
        double d = 3.14159265358979323846;
        System.out.println("float类型:" + f);
        System.out.println("double类型:" + d);

        // 字符型
        char c = 'A';
        System.out.println("char类型:" + c);

        // 布尔型
        boolean b = true;
        System.out.println("boolean类型:" + b);

        // 字符串类型
        String s = "Hello World!";
        System.out.println("String类型:" + s);

        // 基本数据类型之间的转换
        int j = 100;
        long l = j; // 自动类型转换
        System.out.println("int类型自动转换为long类型:" + l);

        double e = 2.71828;
        int k = (int)e; // 强制类型转换
        System.out.println("double类型强制转换为int类型:" + k);
    }
}

1.4 二维表

在这里插入图片描述

二、各基本数据类型间强制转换

2.1 为什么Java中有强制转换?

    Java中有强制转换是因为在程序中可能会出现需要将一种数据类型转换为另一种数据类型的情况。例如,我们可能需要将一个整数类型的变量转换为浮点数类型的变量,或者需要将一个浮点数类型的变量转换为整数类型的变量。在这种情况下,我们就需要使用强制类型转换。

    强制类型转换可以将一个数据类型的值强制转换为另一个数据类型的值。但是需要注意的是,强制类型转换可能会导致精度的损失或数据溢出,因此在进行强制类型转换时需要格外小心,并且需要确保转换的结果是正确的。

2.2 示例代码

public class Main {
    public static void main(String[] args) {
        // 强制将 int 类型转换为 double 类型
        int num1 = 10;
        double num2 = (double) num1; // 注意要加上强制转换符号

        // 强制将 double 类型转换为 int 类型
        double num3 = 3.14;
        int num4 = (int) num3; // 小数部分会被直接截断,只保留整数部分

        // 强制将 long 类型转换为 int 类型
        long num5 = 100L;
        int num6 = (int) num5; // 当 long 类型的值大于 int 类型的最大值时会出现数据溢出

        // 强制将 char 类型转换为 int 类型
        char ch = 'a';
        int num7 = (int) ch; // 实际上是将字符的 Unicode 码转换为 int 类型

        // 强制将 int 类型转换为 byte 类型
        int num8 = 128;
        byte num9 = (byte) num8; // 当 int 类型的值超出 byte 类型的范围时会出现数据溢出

        // 强制将 int 类型转换为 short 类型
        int num10 = 32768;
        short num11 = (short) num10; // 当 int 类型的值超出 short 类型的范围时会出现数据溢出

        // 强制将 float 类型转换为 int 类型
        float num12 = 3.14F;
        int num13 = (int) num12; // 小数部分会被直接截断,只保留整数部分
    }
}

三、包装类型

3.1 为什么有包装类型?

    Java中的包装类型是对基本数据类型的封装,用于在面向对象的环境下使用基本数据类型。
    Java中的包装类型有八种,与基本数据类型一一对应:Byte、Short、Integer、Long、Float、Double、Character和Boolean。

3.2 基本概念

Byte
    Byte是基本数据类型byte的包装类,提供了一些方法用于转换byte类型的值。例如,byteValue()方法可以返回Byte对象所包含的byte值,parseByte()方法可以将字符串解析为byte类型的值。

Short
    Short是基本数据类型short的包装类,提供了一些方法用于转换short类型的值。例如,shortValue()方法可以返回Short对象所包含的short值,parseShort()方法可以将字符串解析为short类型的值。

Integer
    Integer是基本数据类型int的包装类,提供了一些方法用于转换int类型的值。例如,intValue()方法可以返回Integer对象所包含的int值,parseInt()方法可以将字符串解析为int类型的值。

Long
    Long是基本数据类型long的包装类,提供了一些方法用于转换long类型的值。例如,longValue()方法可以返回Long对象所包含的long值,parseLong()方法可以将字符串解析为long类型的值。

Float
    Float是基本数据类型float的包装类,提供了一些方法用于转换float类型的值。例如,floatValue()方法可以返回Float对象所包含的float值,parseFloat()方法可以将字符串解析为float类型的值。

Double
    Double是基本数据类型double的包装类,提供了一些方法用于转换double类型的值。例如,doubleValue()方法可以返回Double对象所包含的double值,parseDouble()方法可以将字符串解析为double类型的值。

Character
    Character是基本数据类型char的包装类,提供了一些方法用于转换char类型的值。例如,charValue()方法可以返回Character对象所包含的char值。

Boolean
    Boolean是基本数据类型boolean的包装类,提供了一些方法用于转换boolean类型的值。例如,booleanValue()方法可以返回Boolean对象所包含的boolean值。

3.3 转换方法

byte 和 Byte

// byte 转 Byte
byte b1 = 10;
Byte b2 = Byte.valueOf(b1); // 调用Byte类的valueOf方法将byte类型转为Byte类型
System.out.println(b2); // 输出10

// Byte 转 byte
Byte b3 = new Byte((byte) 20);
byte b4 = b3.byteValue(); // 调用Byte类的byteValue方法将Byte类型转为byte类型
System.out.println(b4); // 输出20

short 和 Short

// short 转 Short
short s1 = 30;
Short s2 = Short.valueOf(s1); // 调用Short类的valueOf方法将short类型转为Short类型
System.out.println(s2); // 输出30

// Short 转 short
Short s3 = new Short((short) 40);
short s4 = s3.shortValue(); // 调用Short类的shortValue方法将Short类型转为short类型
System.out.println(s4); // 输出40

int 和 Integer

// int 转 Integer
int i1 = 50;
Integer i2 = Integer.valueOf(i1); // 调用Integer类的valueOf方法将int类型转为Integer类型
System.out.println(i2); // 输出50

// Integer 转 int
Integer i3 = new Integer(60);
int i4 = i3.intValue(); // 调用Integer类的intValue方法将Integer类型转为int类型
System.out.println(i4); // 输出60

long 和 Long

// long 转 Long
long l1 = 70;
Long l2 = Long.valueOf(l1); // 调用Long类的valueOf方法将long类型转为Long类型
System.out.println(l2); // 输出70

// Long 转 long
Long l3 = new Long(80L);
long l4 = l3.longValue(); // 调用Long类的longValue方法将Long类型转为long类型
System.out.println(l4); // 输出80

float 和 Float

// float 转 Float
float f1 = 1.23f;
Float f2 = Float.valueOf(f1); // 调用Float类的valueOf方法将float类型转为Float类型
System.out.println(f2); // 输出1.23

// Float 转 float
Float f3 = new Float(4.56f);
float f4 = f3.floatValue(); // 调用Float类的floatValue方法将Float类型转为float类型
System.out.println(f4); // 输出4.56

double 和 Double

// double 转 Double
double d1 = 7.89;
Double d2 = Double.valueOf(d1); // 调用Double类的valueOf方法将double类型转为Double类型
System.out.println(d2); // 输出7.89

// Double 转 double
Double d3 = new Double(0.123);
double d4 = d3.doubleValue(); // 调用Double类的doubleValue方法将Double类型转为double类型
System.out.println(d4); // 输出0.123

char 和 Character

// char 转 Character
char c1 = 'A';
Character c2 = Character.valueOf(c1); // 调用Character类的valueOf方法将char类型转为Character类型
System.out.println(c2); // 输出A

// Character 转 char
Character c3 = new Character('B');
char c4 = c3.charValue(); // 调用Character类的charValue方法将Character类型转为char类型
System.out.println(c4); // 输出B

boolean 和 Boolean

// boolean 转 Boolean
boolean b1 = true;
Boolean b2 = Boolean.valueOf(b1); // 调用Boolean类的valueOf方法将boolean类型转为Boolean类型
System.out.println(b2); // 输出true

// Boolean 转 boolean
Boolean b3 = new Boolean(false);
boolean b4 = b3.booleanValue(); // 调用Boolean类的booleanValue方法将Boolean类型转为boolean类型
System.out.println(b4); // 输出false

四、转换过程中使用的自动装箱和自动拆箱

4.1 来源

    自动装箱和自动拆箱是Java语言中的特性,它们的来源是为了让开发者更方便地将基本数据类型转换为对象类型和将对象类型转换为基本数据类型。在Java 5之前,开发者需要手动进行转换,而在Java 5之后,Java引入了自动装箱和自动拆箱的特性,使得开发者无需手动转换,而是由编译器自动完成转换的工作。

4.2 原理

    自动装箱是指将基本数据类型转换为对应的包装类型,例如将int类型的值转换为Integer类型的对象。自动装箱是通过Java编译器在编译代码时自动完成的,不需要程序员显式地调用。

    自动拆箱是指将包装类型转换为对应的基本数据类型,例如将Integer类型的对象转换为int类型的值。自动拆箱是通过Java编译器在编译代码时自动完成的,不需要程序员显式地调用。

    除了自动装箱和自动拆箱外,程序员还可以显式地进行基本数据类型和包装类型之间的转换。这种转换可以通过包装类型的构造方法或静态方法来实现。例如,可以通过Integer的构造方法将int类型的值转换为Integer类型的对象,也可以通过Integer的静态方法valueOf()将int类型的值转换为Integer类型的对象。

4.3 示例代码

public class AutoBoxingExample {
    public static void main(String[] args) {
        // 定义一个基本数据类型int
        int i = 10;

        // 自动装箱,将int类型的值转换为对应的包装器类型Integer
        Integer integer = i;

        // 自动拆箱,将Integer类型的对象转换为对应的int值
        int j = integer;

        // 自动装箱,将boolean类型的值转换为对应的包装器类型Boolean
        Boolean bool = true;

        // 自动拆箱,将Boolean类型的对象转换为对应的boolean值
        boolean b = bool;

        // 自动装箱,将double类型的值转换为对应的包装器类型Double
        Double d = 3.14;

        // 自动拆箱,将Double类型的对象转换为对应的double值
        double e = d;

        // 打印结果
        System.out.println("integer: " + integer);
        System.out.println("j: " + j);
        System.out.println("bool: " + bool);
        System.out.println("b: " + b);
        System.out.println("d: " + d);
        System.out.println("e: " + e);
    }
}
输出结果为:
integer: 10
j: 10
bool: true
b: true
d: 3.14
e: 3.14

4.4 二维表

在这里插入图片描述

五、相关面试题

5.1 为什么应该避免使用包装类型?

    使用包装类型会带来一些额外的开销,如对象创建、内存分配和垃圾回收等,对性能有一定的影响。因此,在性能要求较高的场景下,应该尽量使用基本数据类型。

5.2 Java中如何判断两个包装类型是否相等?

    在Java中判断两个包装类型是否相等,不能使用 == 运算符,因为此运算符比较的是两个对象的引用地址,而不是对象本身的值。

    应该使用 equals() 方法进行比较。equals() 方法比较的是对象的值是否相等。当包装类型的值相等时,equals() 方法返回 true,否则返回 false。

下面是一个示例代码:

Integer a = 10;
Integer b = 10;
if (a.equals(b)) {
    System.out.println("a 和 b 相等");
} else {
    System.out.println("a 和 b 不相等");
}

    在上面的代码中,a 和 b 都是 Integer 类型的对象,它们的值都为 10。使用 equals() 方法比较它们的值,结果为 true,因此输出 “a 和 b 相等”。

5.3 Java中的基本数据类型和包装类型在内存中的存储方式有什么区别?

在这里插入图片描述

5.4 Java中的基本数据类型和包装类型可以作为泛型类型参数吗?

    在Java中,基本数据类型不能作为泛型类型参数,只能使用其对应的包装类型作为泛型类型参数。

    这是因为泛型类型参数只能是引用类型,基本数据类型不是引用类型,而只是一个简单的值类型。因此,基本数据类型不能作为泛型类型参数。

    但是,Java SE 5.0 以后的版本中,引入了自动装箱和拆箱功能,使得基本数据类型与其对应的包装类型之间可以进行自动转换。这样,在使用泛型时,我们可以直接使用基本数据类型,Java会自动将其转换为对应的包装类型。

    例如,我们可以使用 List 来存储整数,或者使用 Map<String, Boolean> 来存储布尔值等。

    需要注意的是,如果使用基本数据类型作为方法的参数或返回值,我们仍然需要使用其对应的包装类型。因为方法参数和返回值也必须是引用类型。

5.5 char类型能不能存储一个汉字?为什么?

    在Java中,char类型是16位的,可以存储Unicode编码中的字符。汉字是Unicode编码中的字符之一,一个汉字通常由多个Unicode编码的字符组成,例如“中”字的Unicode编码为’\u4E2D’。因此,如果要存储一个汉字,需要使用多个char类型的变量来表示。

    例如,要表示“中”字,需要使用两个char类型的变量来表示,代码如下:

char c1 = '\u4E2D'; // 第一个字符
char c2 = '\u6587'; // 第二个字符

    虽然char类型可以存储一个汉字,但是需要注意它只能存储一个字符,而不能存储整个汉字。同时,由于Java中的字符串类型是由多个字符构成的,因此在实际开发中,通常使用字符串类型来存储汉字。

六、总结

    本文介绍了Java中的基本数据类型和包装类型,包括它们各自的特点及其使用方法。同时,还介绍了基本数据类型和包装类型之间的转换,包括自动装箱和自动拆箱以及显式转换。掌握这些知识,可以帮助程序员更好地使用Java中的数据类型,提高程序的效率和可读性。

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

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

相关文章

Redis Lua脚本原理

Lua脚本执行过程 创建并修改Lua环境 1 创建基础Lua环境2 载入函数库3 创建全局表格Lua4 替换随机函数5 创建排序辅助函数6 创建redis.pcall函数7 全局环境保护8 修改后的Lua环境保存到服务器状态的Lua属性&#xff0c;等待脚本执行 Redis中带有不确定性的命令&#xff1a; …

RK3588平台开发系列讲解(以太网篇)PHY状态机

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、PHY状态机定义二、PHY的状态变化三、PHY的状态变化打印沉淀、分享、成长,让自己和他人都能有所收获!😄 一、PHY状态机定义 phy状态机: 目录:include/linux/phy.h enum phy_state {PHY_DOWN = 0,</

开源模型的力量

2 月&#xff0c;Meta 发布了其大型语言模型&#xff1a;LLaMA。与 OpenAI 及其 ChatGPT 不同&#xff0c;Meta 不仅仅为世界提供了一个可以玩的聊天窗口。 相反&#xff0c;它将代码发布到开源社区&#xff0c;此后不久模型本身就被泄露了。研究人员和程序员立即开始修改、改…

Protobuf实战:通讯录

网络版通讯录 需求 Protobuf常⽤于通讯协议、服务端数据交换场景。接下来将实现⼀个⽹络版本的通讯录&#xff0c;模拟实现客⼾端与服务端的交互&#xff0c;通过Protobuf来实现各端之间的协议序列化。 需求如下&#xff1a; 客⼾端可以选择对通讯录进⾏以下操作&#xff1a;…

电子科技大学编译原理复习笔记(七):自下而上语法分析

目录 前言 重点一览 引言 自下而上分析 分析方法 规范规约&#xff08;最左规约&#xff0c;对应最右推导&#xff09; 算符优先分析法 算符优先文法 最左素短语 举个例子 优先关系表的构造 规范规约与算符优先分析 LR分析法 概述 LR&#xff08;0&#xff09…

系统架构设计师 2:计算机基础

一、计算机硬件 1 处理器&#xff08;CPU&#xff09; 处理器是计算机系统运算和控制的核心部件。 1.1 指令集 处理器的指令集按照其复杂程度可分为复杂指令集&#xff08;CISC&#xff09;与精简指令集&#xff08;RISC&#xff09;。 随着研究的深入&#xff0c;RISC已经…

基于深度学习的高精度安全背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全背心检测识别系统可用于日常生活中或野外来检测与定位安全背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5…

2.25 sigprocmask函数使用 2.26sigaction信号捕捉函数 2.27SIGCHILD信号

2.25 sigprocmask函数使用 阻塞信号集有时称作信号掩码。 联想&#xff1a;fcntl函数可以修改fd属性。 ./sigprocmask & //将程序设置为后台运行&#xff0c;输入ls可以同步有输出 fg //将程序恢复到前台运行#include <stdio.h> #include <signal.…

动态规划dp —— 21.乘积最大子数组

1.状态表示 是什么&#xff1f;dp表中里的值所表示的含义就是状态表示 因为要考虑负数情况&#xff0c;负数乘以最大数就等于最小数了&#xff0c;负数乘以最小数就是最大数了 f[i]表示&#xff1a;以i位置为结尾的所以子数组中最大乘积 g[i]表会&#xff1a;以i位置为结尾…

Java 实现删除顺序表中第一次出现的某个元素

一、思路 1.顺序表不能是空的&#xff0c;如果顺序表是空的就肯定无法删除第一次出现的 key 元素. 2.定义一个key变量来传入要删除的元素&#xff0c;这个元素要求是第一次出现的. 3.删除之前要先找到第一次出现的key的下标. 4.找到位置之后就开始删除. 5.删除过程是从key下标位…

Linux - struct file与缓冲区

​​​​​​​ ​​​​​​​ 感谢各位 点赞 收藏 评论 三连支持 本文章收录于专栏【Linux系统编程】 ❀希望能对大家有所帮助❀ 本文章由 风君子吖 原创 ​​​​​​​ ​​​​​​​ ​​​​​​​ 前言 对于文件&#x…

DTS迁移Oracle至DM与MySQL至DM

目录 DTS迁移Oracle至DM... 3 一、前期准备... 3 二、DTS迁移... 4 1、新建工程... 5 2、新建迁移... 6 3、填写源库信息&#xff0c;使用指定驱动并自定义URL连接... 7 4、填写目标库信息... 8 5、填写迁移选项... 8 6、指定迁移模式及模式对象... 9 7、执行迁移...…

http长连接与会话保持

"我们半推半就的人生&#xff0c;没有和你一样被眷顾的未来!" 一、Http长连接 (1) 为什么需要长连接 如上展示的是一个常规得并不能再常规的http服务&#xff0c;从本地拉取远端linux上的本地文件上传至浏览器上&#xff0c;经过浏览器的渲染展示成如今的样子。唔&a…

【实战】体验训练Geneface

一.环境 conda activate geneface export PYTHONPATH./ CUDA_VISIBLE_DEVICES0 python tasks/run.py --configegs/datasets/lrs3/lm3d_syncnet.yaml --exp_namelrs3/syncnet 训练这篇出过的一些奇奇怪怪的问题基本上都记录在【环境搭建】40系一些奇奇怪怪的环境问题_weixin_50…

aigc - 文化衫设计

团队要用aigc设计个文化衫&#xff0c;就是给些提示词&#xff0c;然后让ai自动生成能够包含这些提示词的文化衫出来 二、第二版 思路&#xff1a;收集了30多张文化衫&#xff0c;然后用两种方式生成提升词&#xff1a;一个是自然语言描述这件t-short&#xff0c;一个是全名词…

IDEA常用插件Top18

前言&#xff1a;精心推荐给大家的一些日常开发中最常用的IDEA效率插件。 1、Alibaba Java Coding Guidelines代码规范检查工具 Alibaba Java Coding Guidelines ,阿里的一款强大的代码规范检查工具&#xff0c;可以让自己写出易读性更高的代码&#xff0c;可以让团队代码风格…

Keepalived+LVS

这里写目录标题 一、Keepalived及其工作原理1.1Keepalived体系主要模块及其作用1.3VRRP &#xff08;虚拟路由冗余协议&#xff09; 二、keepalived实验部署主服务器&#xff1a;备用服务器配置节点 一配置节点二 三、测试 一、Keepalived及其工作原理 Keepalived 是一个基于V…

Linux编译器 gcc、g++

绪论 你热爱生命吗&#xff1f;那幺别浪费时间&#xff0c;由于时间是组成生命的材料。——富兰克林 。 本篇文章写了主要写了Linux下编译器&#xff0c;以及编译器是如何实现编译的过程。 话不多说安全带系好&#xff0c;发车啦&#xff08;建议电脑观看&#xff09;。 附&…

2.30 守护进程(1) 2.31 守护进程(2)

2.30 守护进程&#xff08;1&#xff09; 终端 echo $$//查看当前终端的的pid tty//查看当前终端设备控制终端可以操作某一个进程。 进程组 会话 进程组、会话、控制终端之间的关系 find/2 查看2重定向到dev/null设备上&#xff0c;|管道&#xff08;创建子进程&#xff09…

RK3588平台开发系列讲解(USB篇)USB Device端口组合配置过程

文章目录 一、configfs二、configfs 配置过程2.1、使能相关的宏2.2、挂载configfs2.3、创建名为g1的usb复合设备2.4、配置PID和VID2.5、创建并配置strings子目录2.6、创建configuration和字符串2.7、创建functions2.8、将functions和configuration关联起来2.9、绑定到UDC,使能…