当前位置: 首页 > news >正文

(三)Java数据类型与进制详解

一、Java数据类型概述

Java是一种强类型语言,这意味着每个变量和表达式在编译时都必须有明确的类型。Java的数据类型系统是其核心基础之一,它决定了如何存储数据、能存储什么样的数据以及能对数据执行哪些操作。

1.1 为什么需要数据类型

数据类型在编程语言中扮演着至关重要的角色,主要原因包括:

  1. 内存分配:不同类型的数据需要不同大小的内存空间。例如,一个整数和一个浮点数在内存中的表示方式完全不同。

  2. 操作定义:数据类型决定了可以对数据执行哪些操作。例如,数字可以进行算术运算,而字符串可以进行连接操作。

  3. 错误预防:类型系统可以在编译时捕获许多错误,防止不合理的操作(如将字符串与数字相加)。

  4. 性能优化:使用适当的数据类型可以提高程序效率,例如使用整型而非浮点型进行整数运算。

1.2 Java数据类型分类

Java数据类型可以分为两大类:基本数据类型(Primitive Types)引用数据类型(Reference Types)

Java数据类型
├── 基本数据类型(8种)
│   ├── 数值型
│   │   ├── 整数类型(byte, short, int, long)
│   │   └── 浮点类型(float, double)
│   ├── 字符型(char)
│   └── 布尔型(boolean)
└── 引用数据类型├── 类(class)├── 接口(interface)└── 数组

基本数据类型是Java语言内置的、最简单的数据类型,它们不是对象,直接存储在栈内存中。而引用数据类型则指向对象的引用(类似于指针),实际对象存储在堆内存中。

二、Java基本数据类型详解

Java有8种基本数据类型,它们的大小和取值范围都是固定的,不随硬件平台的变化而变化,这保证了Java程序的可移植性。

2.1 整数类型

整数类型用于存储整数值,Java提供了四种不同大小的整数类型:

类型大小取值范围默认值示例
byte8位-128 ~ 1270byte b = 100;
short16位-32,768 ~ 32,7670short s = 1000;
int32位-2,147,483,648 ~ 2,147,483,6470int i = 100000;
long64位-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,8070Llong l = 100000L;

使用建议

  • 一般情况下使用int类型,它最常用且处理速度通常最快

  • 只有在内存非常紧张时(如大型数组)才考虑使用byte或short

  • 需要处理非常大的整数时使用long类型

注意事项

  1. 直接写的整数常量默认为int类型。如果要表示long类型,需要在数字后加L或l(推荐大写L,因为小写l容易与数字1混淆)。

    java

    long bigNumber = 2147483648L;  // 必须加L,因为2147483648超过了int范围

  2. 整数除法会截断小数部分:

    java

    int a = 5 / 2;  // 结果是2,不是2.5

  3. 整数溢出不会报错,但会导致结果不正确:

    java

    int max = Integer.MAX_VALUE;  // 2147483647
    int overflow = max + 1;       // -2147483648(溢出)

2.2 浮点类型

浮点类型用于表示有小数部分的数值,Java有两种浮点类型:

类型大小取值范围默认值示例
float32位约±3.40282347E+38F0.0ffloat f = 3.14f;
double64位约±1.79769313486231570E+3080.0ddouble d = 3.14159;

使用建议

  • 默认情况下使用double类型,它的精度是float的两倍

  • 只有在内存非常紧张且不需要高精度时才考虑使用float

  • 金融计算等需要精确计算的场景应使用BigDecimal而非浮点类型

注意事项

  1. 直接写的小数常量默认为double类型。如果要表示float类型,需要在数字后加F或f。

    java

    float pi = 3.14f;  // 必须加f

  2. 浮点数比较不能直接使用==,因为存在精度问题:

    java

    double a = 0.1 + 0.2;
    double b = 0.3;
    System.out.println(a == b);  // 输出false,因为0.1+0.2实际上等于0.30000000000000004

    正确的比较方式是比较它们的差值是否小于一个很小的数:

    java

    double epsilon = 0.000001;
    System.out.println(Math.abs(a - b) < epsilon);  // 输出true

  3. 浮点数有特殊的无穷大和NaN(Not a Number)值:

    java

    double infinity = 1.0 / 0.0;  // Infinity
    double nan = 0.0 / 0.0;       // NaN

2.3 字符类型

char类型用于表示单个字符:

类型大小取值范围默认值示例
char16位'\u0000' ~ '\uffff''\u0000'char c = 'A';

特点

  1. Java使用Unicode编码,char类型占2个字节(16位),可以表示大多数语言的字符

  2. 字符常量用单引号括起来

  3. 可以使用Unicode转义序列表示字符:

    java

    char omega = '\u03A9';  // 希腊字母Ω

  4. char类型可以当作无符号整数使用(0~65535):

    java

    char c = 65;  // 等同于'A'

常见操作

java

char c1 = 'A';
char c2 = '中';  // 中文字符
char c3 = '\n';  // 转义字符(换行)// 字符与数字转换
int code = 'A';  // 65
char c = (char)66;  // 'B'// 大小写转换
char lower = Character.toLowerCase('A');  // 'a'
char upper = Character.toUpperCase('a');  // 'A'

2.4 布尔类型

boolean类型表示逻辑值,只有两个可能的值:

类型大小取值范围默认值示例
boolean未明确定义true/falsefalseboolean flag = true;

特点

  1. Java中的boolean类型不能与其他基本类型相互转换

  2. 不能像C语言那样用0表示false,非0表示true

  3. 大小没有明确定义,不同JVM实现可能不同

常见用法

java

boolean isJavaFun = true;
boolean isFishTasty = false;if (isJavaFun) {System.out.println("Java很有趣!");
}// 布尔运算
boolean result = (5 > 3) && (2 < 4);  // true

三、Java引用数据类型

与基本数据类型不同,引用数据类型不直接存储数据本身,而是存储对数据的引用(可以理解为内存地址)。所有引用类型的默认值都是null。

3.1 类(Class)类型

类是最常见的引用类型,例如String类:

java

String str = "Hello World";  // str是引用类型变量

3.2 接口(Interface)类型

接口也是一种引用类型:

java

List<String> list = new ArrayList<>();  // List是接口类型

3.3 数组类型

数组是特殊的引用类型,可以存储固定大小的同类型元素:

java

int[] numbers = new int[5];  // 整型数组
String[] names = {"Alice", "Bob", "Charlie"};  // 字符串数组

3.4 基本类型与引用类型的区别

比较项基本类型引用类型
存储内容实际值对象的引用(地址)
内存位置栈内存引用在栈,对象在堆
默认值各类型不同(如int为0)null
大小固定(如int总是32位)取决于具体对象
参数传递按值传递(拷贝值)按引用传递(拷贝引用)
比较使用==比较值使用==比较引用,equals比较内容
效率更高较低

示例说明

java

// 基本类型
int a = 10;
int b = a;  // b得到a的值的拷贝
b = 20;     // 修改b不影响a
System.out.println(a);  // 输出10// 引用类型
int[] arr1 = {1, 2, 3};
int[] arr2 = arr1;      // arr2和arr1引用同一个数组
arr2[0] = 100;          // 通过arr2修改会影响arr1
System.out.println(arr1[0]);  // 输出100

四、类型转换

Java中的类型转换分为自动类型转换(隐式转换)和强制类型转换(显式转换)。

4.1 自动类型转换

当满足以下条件时,Java会自动进行类型转换:

  1. 两种类型兼容(如都是数值类型)

  2. 目标类型范围大于源类型

转换规则(从左到右可以自动转换):

byte → short → int → long → float → doublechar → int → ...

示例

java

int i = 100;
long l = i;  // 自动将int转换为long
float f = l; // 自动将long转换为float
double d = f; // 自动将float转换为doublechar c = 'A';
int code = c;  // 自动将char转换为int(输出65)

4.2 强制类型转换

当需要将大范围类型转换为小范围类型时,需要使用强制类型转换,语法是在值前面加上目标类型的小括号。

示例

java

double d = 3.14159;
int i = (int)d;  // i的值为3(小数部分被截断)long l = 1234567890123L;
int j = (int)l;  // 可能丢失精度,因为long范围比int大byte b = (byte)200;  // 200超过byte范围,结果为-56(溢出)

注意事项

  1. 强制转换可能导致精度丢失或数据溢出

  2. 布尔类型不能与其他任何类型相互转换

  3. 引用类型之间的转换涉及继承关系,将在面向对象章节讨论

4.3 表达式中的自动类型提升

在表达式中,Java会自动将较小的类型提升为较大的类型:

  1. byte、short和char在运算时自动提升为int

  2. 整个表达式最终会提升为表达式中最高级的类型

示例

java

byte a = 10;
byte b = 20;
// byte c = a + b;  // 错误!a+b的结果是int类型
byte c = (byte)(a + b);  // 正确,需要强制转换int i = 5;
double d = 3.5;
double result = i + d;  // i自动提升为double

五、进制与数值表示

5.1 不同进制的表示方法

Java支持多种进制表示整数:

  1. 十进制:默认表示法,如 int a = 100;

  2. 二进制:以 0b 或 0B 开头,如 int b = 0b1100100;(Java 7+)

  3. 八进制:以 0 开头,如 int c = 0144;(不推荐使用,容易混淆)

  4. 十六进制:以 0x 或 0X 开头,如 int d = 0x64;

示例

java

System.out.println(100);    // 十进制:100
System.out.println(0b1100100);  // 二进制:100
System.out.println(0144);   // 八进制:100
System.out.println(0x64);   // 十六进制:100

5.2 进制转换方法

Java提供了多种方法进行进制转换:

  1. 十进制转其他进制

    java

    int num = 100;
    System.out.println(Integer.toBinaryString(num));  // 1100100
    System.out.println(Integer.toOctalString(num));   // 144
    System.out.println(Integer.toHexString(num));    // 64

  2. 其他进制转十进制

    java

    System.out.println(Integer.parseInt("1100100", 2));  // 100
    System.out.println(Integer.parseInt("144", 8));      // 100
    System.out.println(Integer.parseInt("64", 16));      // 100

5.3 数值字面量增强(Java 7+)

Java 7引入了数值字面量的增强特性:

  1. 二进制字面量

    java

    int binary = 0b1010_1011_1100_1101;  // 使用下划线分组

  2. 数字分组:可以使用下划线(_)对长数字进行分组,提高可读性

    java

    long creditCardNumber = 1234_5678_9012_3456L;
    double pi = 3.1415_9265;
    int bytes = 0b11010010_01101001_10010100_10010010;

注意事项

  • 下划线只能放在数字之间,不能放在开头或结尾

  • 不能放在小数点旁边或进制标识符旁边

  • 浮点数的指数部分不能使用下划线

六、特殊数值处理

6.1 浮点数的特殊值

浮点数有三个特殊值:

  1. 正无穷大Double.POSITIVE_INFINITY

    java

    double inf = 1.0 / 0.0;  // 或者 Double.POSITIVE_INFINITY

  2. 负无穷大Double.NEGATIVE_INFINITY

    java

    double negInf = -1.0 / 0.0;  // 或者 Double.NEGATIVE_INFINITY

  3. NaN(Not a Number)Double.NaN

    java

    double nan = 0.0 / 0.0;  // 或者 Double.NaN

判断方法

java

Double.isInfinite(inf);  // true
Double.isNaN(nan);       // true

6.2 数值溢出处理

整数运算可能会溢出而不报错,需要开发者自行处理:

java

// 方法1:使用更大的类型
int a = Integer.MAX_VALUE;
long result = (long)a + 1;  // 正确:2147483648// 方法2:使用Math的精确方法
int b = Math.addExact(a, 1);  // 抛出ArithmeticException// 方法3:手动检查
if (a > Integer.MAX_VALUE - 1) {throw new ArithmeticException("Overflow!");
}

6.3 精确计算问题

浮点数不适合用于精确计算(如金融计算),应该使用BigDecimal:

java

// 错误的浮点计算
System.out.println(0.1 + 0.2);  // 0.30000000000000004// 正确的精确计算
BigDecimal d1 = new BigDecimal("0.1");
BigDecimal d2 = new BigDecimal("0.2");
System.out.println(d1.add(d2));  // 0.3

七、数据类型的最佳实践

7.1 类型选择建议

  1. 整数类型

    • 默认使用int,除非有特殊需求

    • 处理文件或网络数据时使用byte

    • 需要大整数时使用long

  2. 浮点类型

    • 默认使用double

    • 只有在对内存极度敏感时才考虑float

  3. 布尔类型

    • 不要用0/1代替true/false

    • 命名应清晰表达含义,如isValid、hasNext等

  4. 字符类型

    • 处理文本时使用char或String

    • 注意Unicode字符可能占用两个char位置(代理对)

7.2 性能考虑

  1. 基本类型比对应的包装类(如Integer)更高效

  2. 在集合中必须使用包装类(如List<Integer>)

  3. 自动装箱/拆箱会带来性能开销,在循环中应避免

7.3 代码可读性

  1. 使用有意义的变量名

    java

     
    // 不好
    int a = 100;// 好
    int studentCount = 100;
    对于大数字使用下划线分组javalong creditCardNumber = 1234_5678_9012_3456L;
    避免魔法数字,使用常量java// 不好
    if (status == 1) {...}// 好
    final int STATUS_ACTIVE = 1;
    if (status == STATUS_ACTIVE) {...}
     

八、Java数据类型常见面试题

  1. Java中基本数据类型有哪些?它们的大小和默认值是什么?

    • 如上文所述,8种基本数据类型及其特性

  2. int和Integer有什么区别?

    • int是基本类型,Integer是包装类

    • int不能为null,Integer可以为null

    • Integer提供了更多操作方法(如parseInt)

    • Java 5+支持自动装箱/拆箱

  3. float f = 3.4;是否正确?

    • 不正确,3.4是double类型,需要强制转换或使用float后缀

    • 应改为 float f = 3.4f;

  4. char型变量能不能存储一个中文汉字?为什么?

    • 可以,Java使用Unicode编码,char占2字节,可以存储大多数中文汉字

    • 但某些特殊汉字(如𠀀,编码U+20000)需要使用两个char表示(代理对)

  5. 如何将字符串转换为基本数据类型?

    java

    int i = Integer.parseInt("123");
    double d = Double.parseDouble("3.14");
    boolean b = Boolean.parseBoolean("true");

  6. Math.round(11.5)和Math.round(-11.5)等于多少?

    • Math.round(11.5) = 12(四舍五入)

    • Math.round(-11.5) = -11(向正无穷方向舍入)

  7. 以下代码输出什么?为什么?

    java

    Integer a = 100, b = 100;
    System.out.println(a == b);  // trueInteger c = 200, d = 200;
    System.out.println(c == d);  // false
    • Java对-128~127的Integer对象进行了缓存,所以a和b指向同一个对象

    • 超出这个范围则会创建新对象

九、总结

Java的数据类型系统是其编程基础的核心部分。理解并正确使用各种数据类型对于编写正确、高效的Java程序至关重要。关键要点包括:

  1. Java有8种基本数据类型和引用数据类型

  2. 不同类型有不同的内存占用和取值范围

  3. 注意自动类型转换和强制类型转换的规则

  4. 浮点数有精度问题,金融计算应使用BigDecimal

  5. Java支持多种进制表示,可使用下划线提高可读性

  6. 根据场景选择合适的数据类型,平衡性能和精度需求

掌握这些基础知识将为学习Java更高级的特性打下坚实基础。在实际编程中,应根据具体需求选择最合适的数据类型,并注意边界条件和特殊值的处理。

相关文章:

(三)Java数据类型与进制详解

一、Java数据类型概述 Java是一种强类型语言&#xff0c;这意味着每个变量和表达式在编译时都必须有明确的类型。Java的数据类型系统是其核心基础之一&#xff0c;它决定了如何存储数据、能存储什么样的数据以及能对数据执行哪些操作。 1.1 为什么需要数据类型 数据类型在编…...

用 CodyBuddy 帮我写自动化运维脚本

我正在参加CodeBuddy「首席试玩官」内容创作大赛&#xff0c;本文所使用的 CodeBuddy 免费下载链接&#xff1a;腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴”。 #CodeBuddy首席试玩官 背景 我个人是非常喜欢 Jenkins 自动化部署工具的&#xff0c;之前都是手写 Jenki…...

【Linux庖丁解牛】—程序地址空间【进程地址空间 | 虚拟地址空间】

1. 再谈空间分布图 我们之前在学C/C的时候必然学过上面的空间分布图。 可是我们对他并不理解&#xff01;这里先对其进行各区域分布验证&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h> int g_unval; int g_val 100; int ma…...

nginx 上传文件,413 request entity too large

目录 1 问题2 解决 1 问题 前端后端项目&#xff0c;上传文件&#xff0c;接口没问题&#xff0c;但是就是上传不成功 &#xff0c;然后打开f12 &#xff0c;发现这个接口出现413 request entity too large 这个报错 2 解决 1.1 修改nginx配置文件 在Nginx中&#xff0c;cli…...

Nacos源码—5.Nacos配置中心实现分析二

大纲 1.关于Nacos配置中心的几个问题 2.Nacos如何整合SpringBoot读取远程配置 3.Nacos加载读取远程配置数据的源码分析 4.客户端如何感知远程配置数据的变更 5.集群架构下节点间如何同步配置数据 4.客户端如何感知远程配置数据的变更 (1)ConfigService对象使用介绍 (2)客…...

数智管理学(八)

四、未来管理学可能的新拓展方向 &#xff08;一&#xff09;人工智能与机器学习的融合形成智能决策管理职能 随着人工智能和机器学习技术的不断发展&#xff0c;它们将在管理学中得到更广泛的应用。传统决策方法难以快速处理海量数据并准确把握复杂的市场动态。人工智能与机…...

Compose Multiplatform iOS 稳定版发布:可用于生产环境,并支持 hotload

随着 Compose Multiplatform 1.8.0 的发布&#xff0c;iOS 版本也引来的第一个稳定版本&#xff0c;按照官方的原话&#xff1a;「iOS Is Stable and Production-Ready」 &#xff0c;而 1.8.0 版本&#xff0c;也让 Kotlin 和 Compose 在移动端有了完整的支持。 在 2023 年 4 …...

spark基本介绍

一、Spark概述 Spark是一种基于内存的快速、通用、可拓展的大数据分析计算引擎。 Hadoop是一个分布式系统结构的基础架构。 二、Spark与Hadoop相比较的优势&#xff1a; 1. 处理速度&#xff1a;Hadoop&#xff1a;数据处理速度相对较慢 Spark&#xff1a;速度比Hadoop快很…...

DeepSeek智能时空数据分析(九):NL2SQL绘制河流名字-如何给轨迹添加说明文字

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…...

管家婆实用贴-如何在Excel中清除空格

我们在使用管家婆软件时&#xff0c;经常会用到Excel表格导入导出数据&#xff0c;在使用Excel整理数据时&#xff0c;数据中的空格可能会导致计算和分析出现问题。无论是多余的前导空格、尾部空格还是单元格中的不必要空格&#xff0c;清除它们都是确保数据准确性的关键。今天…...

《软件项目管理》笔记一

软件项目管理概述 项目管理属于软件工程的组成之一&#xff0c;另外两部分为&#xff1a;软件开发&#xff0c;过程改进。 参考书如下&#xff1a; 1.1 项目与软件项目 1、项目&#xff1a; 为了创造一个唯一的产品或提供一个唯一的服务而进行 的临时性的努力。 2、项目的…...

前端线上错误日志收集与定位指南

想象一下&#xff1a;你的Web应用上线后&#xff0c;用户反馈“按钮点不动”或“页面白屏”&#xff0c;但你却无从下手&#xff01;前端线上错误如JavaScript异常、网络失败&#xff0c;稍不注意就让用户流失&#xff0c;业务受损。令人抓狂的是&#xff0c;80%的错误悄无声息…...

可视化魔法指南

🎨 ECharts数据可视化魔法指南 🌟 ECharts:数据的艺术画笔 #mermaid-svg-ARwFHUrXBJ03Gpo9 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ARwFHUrXBJ03Gpo9 .error-icon{fill:#552222;}#mermaid-svg-ARwFHUr…...

使用ffmpeg截取MP3等音频片段

可以使用以下命令通过 ffmpeg 截取 MP3 音频文件的指定片段: ffmpeg的安装方法参考:linux 安装包方式安装ffmpeg,并在环境中设定或指定ffmpeg地址_linux 通过ffmpeg访问地址-CSDN博客 ffmpeg -ss [start_time] -i input.mp3 -to [end_time] -codec copy output.mp3 参数说…...

FFmpeg(7.1版本)编译生成ffplay

FFmpeg在编译的时候,没有生成ffplay,怎么办? 1. 按照上一篇文章:FFmpeg(7.1版本)在Ubuntu18.04上的编译_ffmpeg-7.1-CSDN博客 在build.sh脚本里配置了ffplay 但是,实际上却没有生成ffplay,会是什么原因呢? 2. 原因是编译ffplay的时候,需要一些依赖库 sudo apt-get i…...

CAN学习之--不使用收发器进行通讯测试

在实际调试或者学习CAN通讯过程中&#xff0c;在需要进行CAN调试的时候&#xff0c;但是手头有只有MCU的评估板&#xff0c;没有CAN的收发器&#xff0c;比如ATA6561、MCP2518这类芯片的时候&#xff0c;该怎么办呢&#xff1f; 因为我们知道&#xff0c;CAN收发器只是做信号的…...

律所项目管理全攻略:人力分配 / 案件管控 / 知识沉淀三维度解析(附专用工具清单)

引言&#xff1a;律所项目管理破局 ——从经验驱动到体系化运营 在法律服务行业数字化转型加速的背景下&#xff0c;律所项目管理能力已成为决定服务质量、客户满意度及团队效能的核心竞争力。从人力分配失衡导致的效率损耗&#xff0c;到案件流程模糊引发的客户信任危机&…...

Linux电源管理(7)_Wakeup events framework

原文链接&#xff1a;Linux电源管理(7)_Wakeup events framework 1. 前言 本文继续“Linux电源管理(6)_Generic PM之Suspend功能”中有关suspend同步以及PM wakeup的话题。这个话题&#xff0c;是近几年Linux kernel最具争议的话题之一&#xff0c;在国外Linux开发论坛&…...

Nvidia-smi 运行失败(Failed to initialize NVML: Driver/library version mismatch)

问题排查 在linux服务器上运行 nvidia-smi 命令&#xff0c;提示以下错误&#xff1a; Failed to initialize NVML: Driver/library version mismatch 首先查看内核驱动版本&#xff1a; cat /proc/driver/nvidia/version然后查看当前NVIDIA驱动版本&#xff1a; sudo dpkg …...

算法设计与分析实验题-序列对齐

基于 C 的序列最大对齐得分算法实现 在生物信息学和文本处理领域&#xff0c;序列对齐是一种常见的需求。本文将介绍如何使用 C 实现一个序列最大对齐得分算法&#xff0c;该算法可以计算两个序列在最优对齐方式下的最大得分。 问题描述 给定两个序列 S1 和 S2&#xff0c;我…...

第8章-1 查询性能优化-优化数据访问

上一篇&#xff1a;《 下一篇&#xff1a;《第7章-3 维护索引和表》》 在前面的章节中&#xff0c;我们介绍了如何设计最优的库表结构、如何建立最好的索引&#xff0c;这些对于提高性能来说是必不可少的。但这些还不够——还需要合理地设计查询。如果查询写得很糟糕&a…...

每日一题洛谷P1025 [NOIP 2001 提高组] 数的划分c++

P1025 [NOIP 2001 提高组] 数的划分 - 洛谷 (luogu.com.cn) #include<iostream> using namespace std; int n, k; int res 0; void dfs(int num,int step,int sum) {//判断if (sum n) {if (step k) {res;return;}}if (sum > n || step k)return;//搜索for (int i …...

【python】使用Python和BERT进行文本摘要:从数据预处理到模型训练与生成

《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 随着信息爆炸时代的到来,海量文本数据的高效处理与理解成为亟待解决的问题。文本摘要作为自然语言处理(NLP)中的关键任务,旨在自动生成…...

WHAT - Rust 智能指针

文章目录 常见的智能指针类型1. Box<T> — 堆上分配的数据2. Rc<T> — 引用计数的共享所有权&#xff08;单线程&#xff09;3. Arc<T> — 原子引用计数&#xff08;多线程&#xff09;4. RefCell<T> — 运行时可变借用&#xff08;单线程&#xff09;…...

用go从零构建写一个RPC(仿gRPC,tRPC)--- 版本1(Client端)

这里我们来实现这个RPC的client端 为了实现RPC的效果&#xff0c;我们调用的Hello方法&#xff0c;即server端的方法&#xff0c;应该是由代理来调用&#xff0c;让proxy里面封装网络请求&#xff0c;消息的发送和接受处理。而上一篇文章提到的服务端的代理已经在.rpc.go文件中…...

CentOS 安装 Zellij 终端复用器教程

CentOS 安装 Zellij 终端复用器教程 简介 Zellij 是一个现代化的终端复用器&#xff0c;使用 Rust 语言编写。它提供了类似 tmux 的功能&#xff0c;但具有更友好的用户界面和更现代化的特性。本教程将详细介绍如何在 CentOS 7.9 系统上安装 Zellij。 前置条件 CentOS 7.9 …...

基于 SpringBoot + Vue 的校园管理系统设计与实现

一、项目简介 本系统以校园组织管理为主线&#xff0c;结合用户权限分离机制与模块化设计&#xff0c;实现对“单位类别、单位、通知推送、投票信息、用户回复”等内容的全流程管理&#xff0c;广泛适用于教育局、高校及下属组织的信息管理工作。 &#x1f3af; 项目亮点&…...

如何减少锁竞争并细化锁粒度以提高 Rust 多线程程序的性能?

在并发编程中&#xff0c;锁&#xff08;Lock&#xff09;是一种常用的同步机制&#xff0c;用于保护共享数据免受多个线程同时访问造成的竞态条件&#xff08;Race Condition&#xff09;。然而&#xff0c;不合理的锁使用会导致严重的性能瓶颈&#xff0c;特别是在高并发场景…...

【人工智能agent】--dify通过mcp协议调用工具

MCP Client 发起工具调用的实体&#xff0c;也就是 Dify 工作流或 Agent。它通过 Dify 平台提供的标准化接口&#xff08;工具节点&#xff09;来请求服务。 MCP Server / Host 提供实际服务的端点。在这个例子中&#xff0c;就是模拟 API 服务器 上的各个API (/api/pump/st…...

Review --- Redis

Redis redis是什么? Redis是一个开源的,使用C语言编写的,支持网络交互的&#xff0c;key-value数据结构存储系统,支持多种语言的一种非关系型数据库,它可以用作数据库&#xff08;存储一些简单的数据&#xff0c;例如新闻点赞量&#xff09;&#xff0c;**缓存&#xff08;秒…...

Sql刷题日志(day8)

一、笔试 1、right:提取字符串右侧指定数量的字符 right(string,length) /*string&#xff1a;要操作的字符串。length&#xff1a;要从右侧提取的字符数 */ 2、curdate():返回当前日期&#xff0c;格式通常为 YYYY-MM-DD 二、面试 1、自变量是不良体验反馈&#xff0c;因…...

【Science Advances】普林斯顿大学利用非相干光打造可重构纳米光子神经网络

(导读 ) 人工智能对计算性能需求剧增&#xff0c;电子微处理器发展受功耗限制。光学计算有望解决这些问题&#xff0c;光学神经网络&#xff08;ONNs&#xff09;成为研究热点&#xff0c;但现有 ONNs 因设计缺陷&#xff0c;在图像分类任务中精度远低于现代电子神经网络&#…...

2025-05-07 Unity 网络基础8——UDP同步异步通信

文章目录 1 UDP 概述1.1 通信流程1.2 TCP 与 UDP1.3 UDP 分包1.4 UDP 黏包 2 同步通信2.1 服务端2.2 客户端2.3 测试 3 异步通信3.1 Bgin / End 方法3.2 Async 方法 1 UDP 概述 1.1 通信流程 ​ 客户端和服务端的流程如下&#xff1a; 创建套接字 Socket。用 Bind() 方法将套…...

K8S - 金丝雀发布实战 - Argo Rollouts 流量控制解析

一、金丝雀发布概述 1.1 什么是金丝雀发布&#xff1f; 金丝雀发布&#xff08;Canary Release&#xff09;是一种渐进式部署策略&#xff0c;通过逐步将生产流量从旧版本迁移至新版本&#xff0c;结合实时指标验证&#xff0c;在最小化风险的前提下完成版本迭代。其核心逻辑…...

手持小风扇方案解说---【其利天下技术】

春去夏来&#xff0c;酷暑时节&#xff0c;小风扇成为外出必备的解暑工具&#xff0c;近年来&#xff0c;随着无刷电机的成本急剧下降&#xff0c;小风扇也逐步从有刷变无刷化了。 数量最大的如一箱无刷马达&#xff0c;其次三相低压无刷电机也大量被一些中高端风扇大量采用。…...

Qt开发:枚举的介绍和使用

文章目录 一、概述二、Qt 中定义和使用枚举2.1 普通枚举的定义方式2.2 使用枚举 三、配合 Qt 元对象系统使用枚举3.1 使用 Q_ENUM&#xff08;Qt 5.5 及以上&#xff09;3.2 示例&#xff1a;枚举值转字符串3.4 示例&#xff1a;字符串转枚举值 四、枚举与字符串相互转换五、枚…...

HarmonyOS运动开发:如何集成百度地图SDK、运动跟随与运动公里数记录

前言 在开发运动类应用时&#xff0c;集成地图功能以及实时记录运动轨迹和公里数是核心需求之一。本文将详细介绍如何在 HarmonyOS 应用中集成百度地图 SDK&#xff0c;实现运动跟随以及运动公里数的记录。 一、集成百度地图 SDK 1.引入依赖 首先&#xff0c;需要在项目的文…...

“胖都来”商标申请可以通过注册不!

近日“胖都来”被网友认为是蹭“胖东来”品牌流量在互联网上引起争议&#xff0c;看到许多自媒体说浙江这家公司已拿到“胖都来”的注册商标&#xff0c;普推知产商标老杨经检索后发现是没有的&#xff0c;只是申请受理。 对于商城类主要类别是在35类广告销售&#xff0c;核心是…...

【Django】中间件

Django 中间件是 Django 框架里一个轻量级、可插拔的组件&#xff0c;它能在全局范围内对 Django 的请求和响应进行处理。中间件处于 Django 的请求处理流程之中&#xff0c;在请求抵达视图函数之前以及视图函数返回响应之后执行特定操作。以下是关于 Django 中间件的详细介绍&…...

电子电器架构 --- 48V架构的一丢丢事情

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…...

什么是Blender?怎么获取下载Blender格式文件模型

glbxz.com glbxz.com 官方可以下载Blender格式文件模型 BlenderBlender 是一个免费的开源程序&#xff0c;用于建模和动画&#xff0c;最初由一家名为 Neo Geo 的动画工作室作为内部应用程序开发&#xff0c;后来作为自己的程序发布。这是一个称职的程序&#xff0c;近年来由于…...

Ubuntu安装pgsql

​​一、通过 APT 安装&#xff08;推荐&#xff09;​​ 更新软件包列表 sudo apt update 安装 PostgreSQL 核心包及工具 sudo apt install postgresql postgresql-client postgresql-contrib • postgresql&#xff1a;数据库服务端 • postgresql-client&#xff1a;命令行…...

Qwen2-VL详解

一、引言 在人工智能领域,多模态大模型的发展备受关注。Qwen2-VL 作为一款先进的多模态模型,致力于克服现有方法在处理图像和视频数据时存在的不足,显著提升多模态信息的理解与交互能力。本文将全面且深入地阐述 Qwen2-VL 的创新理念、精妙的模型架构、严谨的训练流程、卓越…...

定长滑动窗口---初阶篇

目录 滑动窗口核心思想 定长滑动窗口套路 定长滑动窗口习题剖析 1456. 定长子串中元音的最大数目 643. 子数组最大平均数 I 1343. 大小为 K 且平均值大于等于阈值的子数组数目 2090. 半径为 k 的子数组平均值 2379. 得到 K 个黑块的最少涂色次数 2841. 几乎唯一子数组…...

以pytest_addoption 为例,讲解pytest框架中钩子函数的应用

钩子函数&#xff08;Hook Function&#xff09;的概念 钩子函数&#xff08;Hook Function&#xff09;是软件框架中预定义的回调接口&#xff0c;允许开发者在程序执行的特定阶段插入自定义逻辑&#xff0c;以扩展或修改框架的默认行为。在 pytest 中&#xff0c;钩子函数覆…...

数据智能重塑工业控制:神经网络在 MPC 中的四大落地范式与避坑指南

一、引言&#xff1a;工业控制的范式革命 在工业 4.0 的浪潮中&#xff0c;传统基于物理模型的控制方法&#xff08;如 PID、线性二次型调节器 LQR&#xff09;正面临前所未有的挑战。以石化行业为例&#xff0c;某炼油厂的催化裂化装置&#xff08;FCCU&#xff09;因反应机理…...

AB测试面试题

AB测试面试题 常考AB测试问答题(1)AB测试的优缺点是什么?(2)AB测试的一般流程/介绍一下日常工作中你是如何做A/B实验的?(3)第一类错误 vs 第二类错误 vs 你怎么理解AB测试中的第一、二类错误?(4)统计显著=实际显著?(5)AB测试效果统计上不显著?(6)实验组优于对…...

phpstudy升级新版apache

1.首先下载要升级到的apache版本&#xff0c;这里apache版本为Apache 2.4.63-250207 Win64下载地址&#xff1a;Apache VS17 binaries and modules download 2.将phpstudy中原始apache复制备份Apache2.4.39_origin 3.将1中下载apache解压&#xff0c; 将Apache24复制一份到ph…...

民宿管理系统6

普通管理员管理&#xff1a; 新增普通管理员&#xff1a; 前端效果&#xff1a; 前端代码&#xff1a; <body> <div class"layui-fluid"><div class"layui-row"><div class"layui-form"><div class"layui-f…...

【iOS】源码阅读(三)——内存对齐原理

文章目录 前言获取内存大小的三种常用方式sizeofclass_getInstanceSizemalloc_size 总结 前言 之前学习alloc相关源码&#xff0c;涉及到内存对齐的相关内容&#xff0c;今天笔者详细学习了一下相关内容并写了此篇博客。 获取内存大小的三种常用方式 获取内存大小的方式有很多…...