C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序
凑数的,仅供参考。

1 文本格式
/// <summary>
/// 《小白学程序》第二十六课:大数(BigInteger)的Toom-Cook 3乘法
/// Toom-Cook 3-Way Multiplication
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static string toom_cook3_multiply(string a, string b)
{
int n = Math.Max(a.Length, b.Length);
int[] ra = string_to_digitals(a, n);
int[] rb = string_to_digitals(b, n);
toom_cook3_process_00(ra, rb, out int[] rz);
toom_cook3_carry(rz, n * 2);
return digitals_to_string(rz);
}
/// <summary>
/// 短数字的乘法(常规乘法,小学生算法)
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="z"></param>
private static void toom_cook3_normal(int[] a, int[] b, ref int[] z)
{
int n = a.Length;
for (int j = 0; j < n; j++)
{
for (int i = 0; i < n; i++)
{
z[j + i] += a[i] * b[j];
}
}
}
/// <summary>
/// 完全按原始C++代码改写;运行成功;
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="z"></param>
private static void toom_cook3_process_01(int[] a, int[] b, out int[] z)
{
int n = a.Length;
int n1 = n * 1 / 3;
int n2 = n * 2 / 3;
int n3 = n * 3 / 3;
int n4 = n * 4 / 3;
z = new int[n * 2];
if (n <= 9)
{
toom_cook3_normal(a, b, ref z);
return;
}
// int *a0 = &a[0];
// Multiplicand / right side array pointer
int a0 = 0;
// int *a1 = &a[tLen / 3];
// Multiplicand / central array pointer
int a1 = n1;
// int *a2 = &a[tLen * 2/ 3];
// Multiplicand / left side array pointer
int a2 = n2;// n * 2 / 3;
// int *b0 = &b[0];
// Multiplier / right side array pointer
int b0 = 0;
// int *b1 = &b[tLen / 3];
// Multiplier / central array pointer
int b1 = n1;
// int *b2 = &b[tLen * 2 / 3];
// Multiplier / left side array pointer
int b2 = n2;// n * 2 / 3;
// int *c0 = &z[(tLen / 3) * 0];
int[] c0 = new int[n2];
int[] c1 = new int[n2];
// int *c2 = &z[(tLen / 3) * 2];
int[] c2 = new int[n2];
int[] c3 = new int[n2];
// int *c4 = &z[(tLen / 3) * 4];
int[] c4 = new int[n2];
int[] a_m2 = new int[n1]; // a(-2)
int[] a_m1 = new int[n1]; // a(-1)
int[] a_0 = new int[n1]; // a(0)
int[] a_1 = new int[n1]; // a(1)
int[] a_inf = new int[n1]; // a(inf)
int[] b_m2 = new int[n1]; // b-2)
int[] b_m1 = new int[n1]; // b-1)
int[] b_0 = new int[n1]; // b(0)
int[] b_1 = new int[n1]; // b(1)
int[] b_inf = new int[n1]; // b(inf)
// ==== a(-2) = 4 * a2 - 2 * a1 + a0, b(-2) = 4 * b2 - 2 * b1 + b0
for (int i = 0; i < n1; i++)
{
a_m2[i] = (a[a2 + i] << 2) - (a[a1 + i] << 1) + a[a0 + i];
b_m2[i] = (b[b2 + i] << 2) - (b[b1 + i] << 1) + b[b0 + i];
}
// ==== c(-2) = a(-2) * b(-2)
toom_cook3_process_01(a_m2, b_m2, out int[] c_m2);
// ==== a(-1) = a2 - a1 + a0, b(-1) = b2 - b1 + b0
for (int i = 0; i < n1; i++)
{
a_m1[i] = a[a2 + i] - a[a1 + i] + a[a0 + i];
b_m1[i] = b[b2 + i] - b[b1 + i] + b[b0 + i];
}
// ==== c(-1) = a(-1) * b(-1)
toom_cook3_process_01(a_m1, b_m1, out int[] c_m1);
// ==== a(0) = a0, b(0) = b0
for (int i = 0; i < n1; i++)
{
a_0[i] = a[a0 + i];
b_0[i] = b[b0 + i];
}
// ==== c(0) = a(0) * b(0)
toom_cook3_process_01(a_0, b_0, out int[] c_0);
// ==== a(1) = a2 + a1 + a0, b(1) = b2 + b1 + b0
for (int i = 0; i < n1; i++)
{
a_1[i] = a[a2 + i] + a[a1 + i] + a[a0 + i];
b_1[i] = b[b2 + i] + b[b1 + i] + b[b0 + i];
}
// ==== c(1) = a(1) * b(1)
toom_cook3_process_01(a_1, b_1, out int[] c_1);
// ==== a(inf) = a2, b(inf) = b2
for (int i = 0; i < n1; i++)
{
a_inf[i] = a[a2 + i];
b_inf[i] = b[b2 + i];
}
// ==== c(inf) = a(inf) * b(inf)
toom_cook3_process_01(a_inf, b_inf, out int[] c_inf);
// ==== c4 = 6 * c(inf) / 6
for (int i = 0; i < n2; i++)
{
c4[i] = c_inf[i];
}
// ==== c3 = -c(-2) + 3 * c(-1) - 3 * c(0) + c(1) + 12 * c(inf) / 6
for (int i = 0; i < n2; i++)
{
c3[i] = -c_m2[i];
c3[i] += (c_m1[i] << 1) + c_m1[i];
c3[i] -= (c_0[i] << 1) + c_0[i];
c3[i] += c_1[i];
c3[i] += (c_inf[i] << 3) + (c_inf[i] << 2);
c3[i] /= 6;
}
// ==== c2 = 3 * c(-1) - 6 * c(0) + 3 * c(1) - 6 * c(inf) / 6
for (int i = 0; i < n2; i++)
{
c2[i] = (c_m1[i] << 1) + c_m1[i];
c2[i] -= (c_0[i] << 2) + (c_0[i] << 1);
c2[i] += (c_1[i] << 1) + c_1[i];
c2[i] -= (c_inf[i] << 2) + (c_inf[i] << 1);
c2[i] /= 6;
}
// ==== c1 = c(-2) - 6 * c(-1) + 3 * c(0) + 2 * c(1) - 12 * c(inf) / 6
for (int i = 0; i < n2; i++)
{
c1[i] = c_m2[i];
c1[i] -= (c_m1[i] << 2) + (c_m1[i] << 1);
c1[i] += (c_0[i] << 1) + c_0[i];
c1[i] += (c_1[i] << 1);
c1[i] -= (c_inf[i] << 3) + (c_inf[i] << 2);
c1[i] /= 6;
}
// ==== c0 = 6 * c(0) / 6
for (int i = 0; i < n2; i++)
{
c0[i] = c_0[i];
}
// ==== z = c4 * x^4 + c3 * x^3 + c2 * x^2 + c1 * x + c0
for (int i = 0; i < n2; i++)
{
z[i + n4] += c4[i];
z[i + n3] += c3[i];
z[i + n2] += c2[i];
z[i + n1] += c1[i];
z[i] += c0[i];
}
}
/// <summary>
/// 乘积和的进位计算
/// </summary>
/// <param name="a"></param>
/// <param name="n"></param>
/// <exception cref="Exception"></exception>
private static void toom_cook3_carry(int[] a, int n)
{
int cr = 0;
for (int i = 0; i < n; i++)
{
a[i] += cr;
if (a[i] < 0)
{
cr = -(-(a[i] + 1) / 10 + 1);
}
else
{
cr = a[i] / 10;
}
a[i] -= cr * 10;
}
if (cr != 0)
{
// Overflow
throw new Exception("OVERFLOW! cr=" + cr);
}
}
2 代码格式
/// <summary>
/// 《小白学程序》第二十六课:大数(BigInteger)的Toom-Cook 3乘法
/// Toom-Cook 3-Way Multiplication
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <returns></returns>
public static string toom_cook3_multiply(string a, string b)
{int n = Math.Max(a.Length, b.Length);int[] ra = string_to_digitals(a, n);int[] rb = string_to_digitals(b, n);toom_cook3_process_00(ra, rb, out int[] rz);toom_cook3_carry(rz, n * 2);return digitals_to_string(rz);
}/// <summary>
/// 短数字的乘法(常规乘法,小学生算法)
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="z"></param>
private static void toom_cook3_normal(int[] a, int[] b, ref int[] z)
{int n = a.Length;for (int j = 0; j < n; j++){for (int i = 0; i < n; i++){z[j + i] += a[i] * b[j];}}
}/// <summary>
/// 完全按原始C++代码改写;运行成功;
/// </summary>
/// <param name="a"></param>
/// <param name="b"></param>
/// <param name="z"></param>
private static void toom_cook3_process_01(int[] a, int[] b, out int[] z)
{int n = a.Length;int n1 = n * 1 / 3;int n2 = n * 2 / 3;int n3 = n * 3 / 3;int n4 = n * 4 / 3;z = new int[n * 2];if (n <= 9){toom_cook3_normal(a, b, ref z);return;}// int *a0 = &a[0];// Multiplicand / right side array pointerint a0 = 0;// int *a1 = &a[tLen / 3];// Multiplicand / central array pointerint a1 = n1;// int *a2 = &a[tLen * 2/ 3];// Multiplicand / left side array pointerint a2 = n2;// n * 2 / 3;// int *b0 = &b[0];// Multiplier / right side array pointerint b0 = 0;// int *b1 = &b[tLen / 3];// Multiplier / central array pointerint b1 = n1;// int *b2 = &b[tLen * 2 / 3];// Multiplier / left side array pointerint b2 = n2;// n * 2 / 3;// int *c0 = &z[(tLen / 3) * 0];int[] c0 = new int[n2];int[] c1 = new int[n2];// int *c2 = &z[(tLen / 3) * 2];int[] c2 = new int[n2];int[] c3 = new int[n2];// int *c4 = &z[(tLen / 3) * 4];int[] c4 = new int[n2];int[] a_m2 = new int[n1]; // a(-2)int[] a_m1 = new int[n1]; // a(-1)int[] a_0 = new int[n1]; // a(0)int[] a_1 = new int[n1]; // a(1)int[] a_inf = new int[n1]; // a(inf)int[] b_m2 = new int[n1]; // b-2)int[] b_m1 = new int[n1]; // b-1)int[] b_0 = new int[n1]; // b(0)int[] b_1 = new int[n1]; // b(1)int[] b_inf = new int[n1]; // b(inf)// ==== a(-2) = 4 * a2 - 2 * a1 + a0, b(-2) = 4 * b2 - 2 * b1 + b0for (int i = 0; i < n1; i++){a_m2[i] = (a[a2 + i] << 2) - (a[a1 + i] << 1) + a[a0 + i];b_m2[i] = (b[b2 + i] << 2) - (b[b1 + i] << 1) + b[b0 + i];}// ==== c(-2) = a(-2) * b(-2)toom_cook3_process_01(a_m2, b_m2, out int[] c_m2);// ==== a(-1) = a2 - a1 + a0, b(-1) = b2 - b1 + b0for (int i = 0; i < n1; i++){a_m1[i] = a[a2 + i] - a[a1 + i] + a[a0 + i];b_m1[i] = b[b2 + i] - b[b1 + i] + b[b0 + i];}// ==== c(-1) = a(-1) * b(-1)toom_cook3_process_01(a_m1, b_m1, out int[] c_m1);// ==== a(0) = a0, b(0) = b0for (int i = 0; i < n1; i++){a_0[i] = a[a0 + i];b_0[i] = b[b0 + i];}// ==== c(0) = a(0) * b(0)toom_cook3_process_01(a_0, b_0, out int[] c_0);// ==== a(1) = a2 + a1 + a0, b(1) = b2 + b1 + b0for (int i = 0; i < n1; i++){a_1[i] = a[a2 + i] + a[a1 + i] + a[a0 + i];b_1[i] = b[b2 + i] + b[b1 + i] + b[b0 + i];}// ==== c(1) = a(1) * b(1)toom_cook3_process_01(a_1, b_1, out int[] c_1);// ==== a(inf) = a2, b(inf) = b2for (int i = 0; i < n1; i++){a_inf[i] = a[a2 + i];b_inf[i] = b[b2 + i];}// ==== c(inf) = a(inf) * b(inf)toom_cook3_process_01(a_inf, b_inf, out int[] c_inf);// ==== c4 = 6 * c(inf) / 6for (int i = 0; i < n2; i++){c4[i] = c_inf[i];}// ==== c3 = -c(-2) + 3 * c(-1) - 3 * c(0) + c(1) + 12 * c(inf) / 6for (int i = 0; i < n2; i++){c3[i] = -c_m2[i];c3[i] += (c_m1[i] << 1) + c_m1[i];c3[i] -= (c_0[i] << 1) + c_0[i];c3[i] += c_1[i];c3[i] += (c_inf[i] << 3) + (c_inf[i] << 2);c3[i] /= 6;}// ==== c2 = 3 * c(-1) - 6 * c(0) + 3 * c(1) - 6 * c(inf) / 6for (int i = 0; i < n2; i++){c2[i] = (c_m1[i] << 1) + c_m1[i];c2[i] -= (c_0[i] << 2) + (c_0[i] << 1);c2[i] += (c_1[i] << 1) + c_1[i];c2[i] -= (c_inf[i] << 2) + (c_inf[i] << 1);c2[i] /= 6;}// ==== c1 = c(-2) - 6 * c(-1) + 3 * c(0) + 2 * c(1) - 12 * c(inf) / 6for (int i = 0; i < n2; i++){c1[i] = c_m2[i];c1[i] -= (c_m1[i] << 2) + (c_m1[i] << 1);c1[i] += (c_0[i] << 1) + c_0[i];c1[i] += (c_1[i] << 1);c1[i] -= (c_inf[i] << 3) + (c_inf[i] << 2);c1[i] /= 6;}// ==== c0 = 6 * c(0) / 6for (int i = 0; i < n2; i++){c0[i] = c_0[i];}// ==== z = c4 * x^4 + c3 * x^3 + c2 * x^2 + c1 * x + c0for (int i = 0; i < n2; i++){z[i + n4] += c4[i];z[i + n3] += c3[i];z[i + n2] += c2[i];z[i + n1] += c1[i];z[i] += c0[i];}
}/// <summary>/// 乘积和的进位计算/// </summary>/// <param name="a"></param>/// <param name="n"></param>/// <exception cref="Exception"></exception>private static void toom_cook3_carry(int[] a, int n){int cr = 0;for (int i = 0; i < n; i++){a[i] += cr;if (a[i] < 0){cr = -(-(a[i] + 1) / 10 + 1);}else{cr = a[i] / 10;}a[i] -= cr * 10;}if (cr != 0){// Overflowthrow new Exception("OVERFLOW! cr=" + cr);}}
相关文章:
C#,《小白学程序》第二十六课:大数乘法(BigInteger Multiply)的Toom-Cook 3算法及源程序
凑数的,仅供参考。 1 文本格式 /// <summary> /// 《小白学程序》第二十六课:大数(BigInteger)的Toom-Cook 3乘法 /// Toom-Cook 3-Way Multiplication /// </summary> /// <param name"a"></par…...
destoon自定义一个archiver内容文档
在archiver目录建立以下代码: <?php define(DT_REWRITE, true); require ../common.inc.php; $EXT[archiver_enable] or dheader(DT_PATH); //$DT_BOT or dheader(DT_PATH); $N $M $T array(); $mid or $mid 5; $vmid $list 0; foreach($MODULE as $k>…...
5-1 Dataset和DataLoader
Pytorch通常使用Dataset和DataLoader这两个工具类来构建数据管道。 Dataset定义了数据集的内容,它相当于一个类似列表的数据结构,具有确定的长度,能够用索引获取数据集中的元素。 而DataLoader定义了按batch加载数据集的方法,它是…...
IDEA创建完Maven工程后,右下角一直显示正在下载Maven插件
原因: 这是由于新建的Maven工程,IDEA会用它内置的默认的Maven版本,使用国外的网站下载Maven所需的插件,速度很慢 。 解决方式: 每次创建 Project 后都需要设置 Maven 家目录位置(就是我们自己下载的Mav…...
最新清理删除Mac电脑内存空间方法教程
Mac电脑使用的时间越久,系统的运行就会变的越卡顿,这是Mac os会出现的正常现象,卡顿的原因主要是系统缓存文件占用了较多的磁盘空间,或者Mac的内存空间已满。如果你的Mac运行速度变慢,很有可能是因为磁盘内存被过度占用…...
【调试经验】MySQL - fatal error: mysql/mysql.h: 没有那个文件或目录
机器环境: Ubuntu 22.04.3 LTS 报错问题 在编译一个项目时出现了一段SQL报错: CGImysql/sql_connection_pool.cpp:1:10: fatal error: mysql/mysql.h: 没有那个文件或目录 1 | #include <mysql/mysql.h> | ^~~~~~~~~~~~~~~ c…...
腾讯mini项目-【指标监控服务重构】2023-08-12
今日已办 Watermill Handler 将 4 个阶段的逻辑处理定义为 Handler 测试发现,添加的 handler 会被覆盖掉,故考虑添加为 middleware 且 4 个阶段的处理逻辑针对不同 topic 是相同的。 参考https://watermill.io/docs/messages-router/实现不同topic&am…...
kubeadm部署k8sv1.24使用cri-docker做为CRI
目的 测试使用cri-docker做为containerd和docker的中间层垫片。 规划 IP系统主机名10.0.6.5ubuntu 22.04.3 jammymaster01.kktb.org10.0.6.6ubuntu 22.04.3 jammymaster02.kktb.org10.0.6.7ubuntu 22.04.3 jammymaster03.kktb.org 配置 步骤: 系统优化 禁用sw…...
在c#中使用CancellationToken取消任务
目录 🚀介绍: 🐤简单举例 🚀IsCancellationRequested 🚀ThrowIfCancellationRequested 🐤在控制器中使用 🚀通过异步方法的参数使用cancellationToken 🚀api结合ThrowIfCancel…...
【项目经验】:elementui多选表格默认选中
一.需求 在页面刚打开就默认选中指定项。 二.方法Table Methods toggleRowSelection用于多选表格,切换某一行的选中状态,如果使用了第二个参数,则是设置这一行选中与否(selected 为 true 则选中)row, selected 详细…...
外星人入侵游戏-(创新版)
🌈write in front🌈 🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流. 🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如…...
HTML 学习笔记(基础)
它是超文本标记语言,由一大堆约定俗成的标签组成,而其标签里一般又有一些属性值可以设置。 W3C标准:网页主要三大部分 结构:HTML表现:CSS行为:JavaScript <!DOCTYPE html> <html lang"zh-…...
最小二乘法
Least Square Method 1、相关的矩阵公式2、线性回归3、最小二乘法3.1、损失函数(Loss Function)3.2、多维空间的损失函数3.3、解析法求解3.4、梯度下降法求解 1、相关的矩阵公式 P r e c o n d i t i o n : ξ ∈ R n , A ∈ R n ∗ n i : σ A ξ σ ξ…...
使用stelnet进行安全的远程管理
1. telnet有哪些不足? 2.ssh如何保证数据传输安全? 需求:远程telnet管理设备 用户定义需要在AAA模式下: 开启远程登录的服务:定义vty接口 然后从R2登录:是可以登录的 同理R3登录: 在R1也可以查…...
python 二手车数据分析以及价格预测
二手车交易信息爬取、数据分析以及交易价格预测 引言一、数据爬取1.1 解析数据1.2 编写代码爬1.2.1 获取详细信息1.2.2 数据处理 二、数据分析2.1 统计分析2.2 可视化分析 三、价格预测3.1 价格趋势分析(特征分析)3.2 价格预测 引言 本文着眼于车辆信息,结合当下较…...
JAVA医药进销存管理系统(附源码+调试)
JAVA医药进销存管理系统 功能描述 (1)登录模块:登录信息等存储在数据库中 (2)基本信息模块:分为药品信息模块、客户情况模块、供应商情况模块; (3)业务管理模块&#x…...
H5 <blockquote> 标签
主要应用于:内容引用 标签定义及使用说明 <blockquote> 标签定义摘自另一个源的块引用。 浏览器通常会对 <blockquote> 元素进行缩进。 提示和注释 提示:如果标记是不需要段落分隔的短引用,请使用 <q>。 HTML 4.01 与 H…...
nginx配置指南
nginx.conf配置 找到Nginx的安装目录下的nginx.conf文件,该文件负责Nginx的基础功能配置。 配置文件概述 Nginx的主配置文件(conf/nginx.conf)按以下结构组织: 配置块功能描述全局块与Nginx运行相关的全局设置events块与网络连接有关的设置http块代理…...
【数据结构】优先级队列(堆)
文章目录 💐1. 优先级队列1.1 概念 💐2.堆的概念及存储方式2.1 什么是堆2.2 为什么要用完全二叉树描述堆呢?2.3 为什么说堆是在完全二叉树的基础上进行的调整?2.4 使用数组还原完全二叉树 💐3. 堆的常用操作-模拟实现3…...
前端笔试2
1.下面哪一个是检验对象是否有一个以自身定义的属性? foo.hasOwnProperty("bar")bar in foo foo["bar"] ! undefinedfoo.bar ! null 解析: bar in foo 检查 foo 对象是否包含名为 bar 的属性,但是这个属性可以是从原型链继承来的&a…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能
1. 开发环境准备 安装DevEco Studio 3.1: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK 项目配置: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...
【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)
前言: 双亲委派机制对于面试这块来说非常重要,在实际开发中也是经常遇见需要打破双亲委派的需求,今天我们一起来探索一下什么是双亲委派机制,在此之前我们先介绍一下类的加载器。 目录 编辑 前言: 类加载器 1. …...
