DC00025【含论文】基于协同过滤推荐算法springboot视频推荐管理系统

1、项目功能演示

DC00025【含文档】基于springboot短视频推荐管理系统协同过滤算法视频推荐系统javaweb开发程序设计vue

2、项目功能描述

短视频推荐系统分为用户和系统管理员两个角色

2.1 用户角色

1、用户登录、用户注册
2、视频中心:信息查看、视频收藏、点赞、踩、评论
3、公告信息:信息查看、收藏、点赞
4、个人信息、修改密码、我的收藏

2.2 管理员角色

1、系统登录
2、个人中心:修改密码、个人信息修改
3、用户管理
4、视频中心管理
5、视频分类管理
6、系统管理:轮播图管理、公告管理、公告信息分类管理

3、项目运行截图

 

4、项目核心代码

4.1  公共处理类

package com.utils;import java.util.Random;
import java.util.ArrayList;
import org.springframework.stereotype.Component;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.ss.usermodel.Cell;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import org.apache.poi.ss.usermodel.DateUtil;
import java.util.Objects;
import com.alibaba.fastjson.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;@Component
public class CommonUtil {/*** 获取随机字符串** @param num* @return*/public static String getRandomString(Integer num) {String base = "abcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < num; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}/*** 获取随机验证码** @param num* @return*/public static String getRandomNumber(Integer num) {String base = "0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < num; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}public static String getCellValue(Cell cell) {String resultValue = "";// 判空if (Objects.isNull(cell)) {return resultValue;}// 拿到单元格类型int cellType = cell.getCellType();switch (cellType) {// 字符串类型case Cell.CELL_TYPE_STRING:resultValue = StringUtils.isEmpty(cell.getStringCellValue()) ? "" : cell.getStringCellValue().trim();break;// 布尔类型case Cell.CELL_TYPE_BOOLEAN:resultValue = String.valueOf(cell.getBooleanCellValue());break;// 数值类型case Cell.CELL_TYPE_NUMERIC:/*** format 的值可能为以下这些 yyyyMMddHHmmss* yyyy-MM-dd----- 14* yyyy年m月d日----- 31* yyyy年m月--------57* m月d日  -----------58* HH:mm-----------20* h时mm分  --------- 32*/Object val = cell.getNumericCellValue();// POI Excel 日期格式转换String formatDate = "";switch (cell.getCellStyle().getDataFormat()){case 14:formatDate = "yyyy-MM-dd";break;case 20:formatDate = "HH:mm";break;case 21:formatDate = "HH:mm:ss";break;case 31:formatDate = "yyyy年MM月dd日";break;case 32:formatDate = "HH时mm分";break;case 33:formatDate = "HH时mm分mm秒";break;case 57:formatDate = "yyyy年MM月";break;case 58:formatDate = "MM月dd日";break;case 176:formatDate = "yyyy-MM-dd HH:mm:ss";break;}if(!"".equals(formatDate)){resultValue = new SimpleDateFormat(formatDate).format(DateUtil.getJavaDate((Double) val));}else{resultValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());}break;// 取空串default:break;}return resultValue;}}

4.2 加密解密处理类

package com.utils;import java.nio.charset.StandardCharsets;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.KeySpec;
import java.util.Base64;import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import cn.hutool.crypto.digest.DigestUtil;public class EncryptUtil {/*** md5算法* @param text明文* @param key密钥* @return 密文*/// 带秘钥加密public static String md5(String text) {if(text==null) return null;// 加密后的字符串String md5str = DigestUtil.md5Hex(text);return md5str;}/*** SHA-256算法* @param text* @return* @throws Exception*/public static String sha256(String text) {if(text==null) return null;StringBuilder stringBuilder = new StringBuilder();try {//获取SHA-256算法实例MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");//计算散列值byte[] digest = messageDigest.digest(text.getBytes());//将byte数组转换为15进制字符串for (byte b : digest) {stringBuilder.append(Integer.toHexString((b & 0xFF) | 0x100), 1, 3);}} catch (NoSuchAlgorithmException e) {// TODO Auto-generated catch blocke.printStackTrace();}return stringBuilder.toString();}private static final String DES_ALGORITHM = "DES";/*** DES加密** @param data 待加密的数据* @param key  密钥,长度必须为8位* @return 加密后的数据,使用Base64编码*/public static String desEncrypt(String text) {if(text==null) return null;try {String key = "12345678";// 根据密钥生成密钥规范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根据密钥规范生成密钥工厂SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根据密钥工厂和密钥规范生成密钥SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 根据加密算法获取加密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化加密器,设置加密模式和密钥cipher.init(Cipher.ENCRYPT_MODE, secretKey);// 加密数据byte[] encryptedData = cipher.doFinal(text.getBytes());// 对加密后的数据进行Base64编码return Base64.getEncoder().encodeToString(encryptedData);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}/*** DES解密** @param encryptedData 加密后的数据,使用Base64编码* @param key 密钥,长度必须为8位* @return 解密后的数据*/public static String desDecrypt(String text) {if(text==null) return null;try {String key = "12345678";// 根据密钥生成密钥规范KeySpec keySpec = new DESKeySpec(key.getBytes());// 根据密钥规范生成密钥工厂SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);// 根据密钥工厂和密钥规范生成密钥SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);// 对加密后的数据进行Base64解码byte[] decodedData = Base64.getDecoder().decode(text);// 根据加密算法获取解密器Cipher cipher = Cipher.getInstance(DES_ALGORITHM);// 初始化解密器,设置解密模式和密钥cipher.init(Cipher.DECRYPT_MODE, secretKey);// 解密数据byte[] decryptedData = cipher.doFinal(decodedData);// 将解密后的数据转换为字符串return new String(decryptedData);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}private static final String AES_ALGORITHM = "AES";// AES加密模式为CBC,填充方式为PKCS5Paddingprivate static final String AES_TRANSFORMATION = "AES/CBC/PKCS5Padding";// AES密钥为16位private static final String AES_KEY = "1234567890123456";// AES初始化向量为16位private static final String AES_IV = "abcdefghijklmnop";/*** AES加密** @param data 待加密的数据* @return 加密后的数据,使用Base64编码*/public static String aesEncrypt(String text) {if(text==null) return null;try {// 将AES密钥转换为SecretKeySpec对象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 将AES初始化向量转换为IvParameterSpec对象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根据加密算法获取加密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化加密器,设置加密模式、密钥和初始化向量cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);// 加密数据byte[] encryptedData = cipher.doFinal(text.getBytes(StandardCharsets.UTF_8));// 对加密后的数据使用Base64编码return Base64.getEncoder().encodeToString(encryptedData);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}/*** AES解密** @param encryptedData 加密后的数据,使用Base64编码* @return 解密后的数据*/public static String aesDecrypt(String text) {if(text==null) return null;try {// 将AES密钥转换为SecretKeySpec对象SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);// 将AES初始化向量转换为IvParameterSpec对象IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());// 根据加密算法获取解密器Cipher cipher = Cipher.getInstance(AES_TRANSFORMATION);// 初始化解密器,设置解密模式、密钥和初始化向量cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);// 对加密后的数据使用Base64解码byte[] decodedData = Base64.getDecoder().decode(text);// 解密数据byte[] decryptedData = cipher.doFinal(decodedData);// 返回解密后的数据return new String(decryptedData, StandardCharsets.UTF_8);} catch (InvalidKeyException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return null;}}

4.3 基于用户的协同过滤算法

package com.utils;/**
* 类说明 : 基于用户的协同过滤算法
*/import java.util.*;
import java.util.stream.Collectors;public class UserBasedCollaborativeFiltering {private Map<String, Map<String, Double>> userRatings;private Map<String, List<String>> itemUsers;private Map<String, Integer> userIndex;private Map<Integer, String> indexUser;private Long[][] sparseMatrix;public UserBasedCollaborativeFiltering(Map<String, Map<String, Double>> userRatings) {this.userRatings = userRatings;this.itemUsers = new HashMap<>();this.userIndex = new HashMap<>();//辅助存储每一个用户的用户索引index映射:user->indexthis.indexUser = new HashMap<>();//辅助存储每一个索引index对应的用户映射:index->user// 构建物品-用户倒排表int keyIndex = 0;for (String user : userRatings.keySet()) {Map<String, Double> ratings = userRatings.get(user);for (String item : ratings.keySet()) {if (!itemUsers.containsKey(item)) {itemUsers.put(item, new ArrayList<>());}itemUsers.get(item).add(user);}//用户ID与稀疏矩阵建立对应关系this.userIndex.put(user,keyIndex);this.indexUser.put(keyIndex,user);keyIndex++;}int N = userRatings.size();this.sparseMatrix=new Long[N][N];//建立用户稀疏矩阵,用于用户相似度计算【相似度矩阵】for(int i=0;i<N;i++){for(int j=0;j<N;j++)this.sparseMatrix[i][j]=(long)0;}for(String item : itemUsers.keySet()) {List<String> userList = itemUsers.get(item);for(String u1 : userList) {for(String u2 : userList) {if(u1.equals(u2)){continue;}this.sparseMatrix[this.userIndex.get(u1)][this.userIndex.get(u2)]+=1;}}}}public double calculateSimilarity(String user1, String user2) {//计算用户之间的相似度【余弦相似性】Integer id1 = this.userIndex.get(user1);Integer id2 = this.userIndex.get(user2);if(id1==null || id2==null) return 0.0;return this.sparseMatrix[id1][id2]/Math.sqrt(userRatings.get(indexUser.get(id1)).size()*userRatings.get(indexUser.get(id2)).size());}public List<String> recommendItems(String targetUser, int numRecommendations) {// 计算目标用户与其他用户的相似度Map<String, Double> userSimilarities = new HashMap<>();for (String user : userRatings.keySet()) {if (!user.equals(targetUser)) {double similarity = calculateSimilarity(targetUser, user);userSimilarities.put(user, similarity);}}// 根据相似度进行排序List<Map.Entry<String, Double>> sortedSimilarities = new ArrayList<>(userSimilarities.entrySet());sortedSimilarities.sort(Map.Entry.comparingByValue(Comparator.reverseOrder()));// 选择相似度最高的K个用户List<String> similarUsers = new ArrayList<>();for (int i = 0; i < numRecommendations; i++) {if (i < sortedSimilarities.size()) {similarUsers.add(sortedSimilarities.get(i).getKey());} else {break;}}// 获取相似用户喜欢的物品,并进行推荐Map<String, Double> recommendations = new HashMap<>();for (String user : similarUsers) {Map<String, Double> ratings = userRatings.get(user);for (String item : ratings.keySet()) {if (userRatings.get(targetUser)!=null && !userRatings.get(targetUser).containsKey(item)) {recommendations.put(item, ratings.get(item));}}}// 排序推荐物品LinkedHashMap<String, Double> sortedRecommendations = new LinkedHashMap<>(recommendations);// 取前N个推荐物品int numItems = Math.min(numRecommendations, sortedRecommendations.size());sortedRecommendations = sortedRecommendations.entrySet().stream().sorted((Map.Entry.<String, Double>comparingByValue().reversed())).limit(numItems).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));List<String> result = new ArrayList<String>();result.addAll(sortedRecommendations.keySet());return result;}}

4.4 SQL过滤


package com.utils;import org.apache.commons.lang3.StringUtils;import com.entity.EIException;/*** SQL过滤*/
public class SQLFilter {/*** SQL注入过滤* @param str  待验证的字符串*/public static String sqlInject(String str){if(StringUtils.isBlank(str)){return null;}//去掉'|"|;|\字符str = StringUtils.replace(str, "'", "");str = StringUtils.replace(str, "\"", "");str = StringUtils.replace(str, ";", "");str = StringUtils.replace(str, "\\", "");//转换成小写str = str.toLowerCase();//非法字符String[] keywords = {"master", "truncate", "insert", "select", "delete", "update", "declare", "alter", "drop"};//判断是否包含非法字符for(String keyword : keywords){if(str.indexOf(keyword) != -1){throw new EIException("包含非法字符");}}return str;}
}

4.5 分页工具类


package com.utils;import java.io.Serializable;
import java.util.List;
import java.util.Map;import com.baomidou.mybatisplus.plugins.Page;/*** 分页工具类*/
public class PageUtils implements Serializable {private static final long serialVersionUID = 1L;//总记录数private long total;//每页记录数private int pageSize;//总页数private long totalPage;//当前页数private int currPage;//列表数据private List<?> list;/*** 分页* @param list        列表数据* @param totalCount  总记录数* @param pageSize    每页记录数* @param currPage    当前页数*/public PageUtils(List<?> list, int totalCount, int pageSize, int currPage) {this.list = list;this.total = totalCount;this.pageSize = pageSize;this.currPage = currPage;this.totalPage = (int)Math.ceil((double)totalCount/pageSize);}/*** 分页*/public PageUtils(Page<?> page) {this.list = page.getRecords();this.total = page.getTotal();this.pageSize = page.getSize();this.currPage = page.getCurrent();this.totalPage = page.getPages();}/** 空数据的分页*/public PageUtils(Map<String, Object> params) {Page page =new Query(params).getPage();new PageUtils(page);}public int getPageSize() {return pageSize;}public void setPageSize(int pageSize) {this.pageSize = pageSize;}public int getCurrPage() {return currPage;}public void setCurrPage(int currPage) {this.currPage = currPage;}public List<?> getList() {return list;}public void setList(List<?> list) {this.list = list;}public long getTotalPage() {return totalPage;}public void setTotalPage(long totalPage) {this.totalPage = totalPage;}public long getTotal() {return total;}public void setTotal(long total) {this.total = total;}}

5、项目包含

6、项目获取

6.1 方式一

 私聊或者扫描下方名片获取项目文件。

6.2 方式二

点击此处直接获取项目文件。 

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

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

相关文章

数据链路层 ——MAC

目录 MAC帧协议 mac地址 以太网帧格式 ARP协议 ARP报文格式​编辑 RARP 其他的网络服务或者协议 DNS ICMP协议 ping traceroute NAT技术 代理服务器 网络层负责规划转发路线&#xff0c;而链路层负责在网络节点之间的转发&#xff0c;也就是"一跳"的具体传输…

Qt_绘图

目录 1、绘图核心类 2、QPainter类的使用 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 3、QPen类的使用 3.1 使用画笔 4、QBrush类的使用 4.1 使用画刷 5、绘制图片 5.1 测试QPixmap 5.1.1 图片移动 5.1.2 图标缩小 5.1.3 旋转图片 5.1.4 将…

【四】Spring Cloud OpenFeign原理分析

Spring Cloud OpenFeign原理分析 概述 Spring Cloud 微服务实践也有挺多年了&#xff0c;一直想着总结一下这系列的知识点&#xff0c;最近终于下定决心来出一个Spring Cloud 系列文章了。本文主要围绕fegin组件来进行讲解&#xff0c;文中将会给出基础使用的示例&#xff0c;还…

docker-compose 快速部署clickhouse集群

在本教程中&#xff0c;我们将学习如何使用 Docker Compose 部署一个带有三节点的 ClickHouse 集群&#xff0c;并使用 ZooKeeper 作为分布式协调服务。 前提条件 注意事项&#xff1a; 镜像版本号注意保持一致 [zookeeper:3.7, clickhouse/clickhouse-server:22.5.4]config…

uniapp微信小程序使用ucharts遮挡自定义tabbar的最佳解决方案

如图所示&#xff1a; 使用的ucharts遮挡住了我自定义的tabbar&#xff08;如果不是提需求的有病&#xff0c;我才不会去自定义tabbar&#xff09; 查阅了不少文档&#xff0c;说是开启 ucharts 的 canvas2d 即可&#xff1a; 官网文档地址&#xff1a; uCharts官网 - 秋云…

资源《Arduino 扩展板1-LED灯》说明。

资源链接&#xff1a;Arduino 扩展板1-LED灯 1.文件明细&#xff1a; 2.文件内容说明 包含&#xff1a;AD工程、原理图、PCB。 3.内容展示 4.简述 该文件为PCB工程&#xff0c;采用AD做的。 该文件打板后配合Arduino使用&#xff0c;属于Arduino的扩展板。 该文件主要有…

深度学习自编码器 - 分布式表示篇

序言 深度学习作为人工智能领域的重要分支&#xff0c;其核心在于表示学习&#xff08; Representation Learning \text{Representation Learning} Representation Learning&#xff09;&#xff0c;尤其是分布式表示&#xff08; Distributed Representation \text{Distribut…

netty之基础aio,bio,nio

前言 在Java中&#xff0c;提供了一些关于使用IO的API&#xff0c;可以供开发者来读写外部数据和文件&#xff0c;我们称这些API为Java IO。IO是Java中比较重要知识点&#xff0c;且比较难学习的知识点。并且随着Java的发展为提供更好的数据传输性能&#xff0c;目前有三种IO共…

Go基础学习06-Golang标准库container/list(双向链表)深入讲解;延迟初始化技术;Element;List;Ring

基础介绍 单向链表中的每个节点包含数据和指向下一个节点的指针。其特点是每个节点只知道下一个节点的位置&#xff0c;使得数据只能单向遍历。 示意图如下&#xff1a; 双向链表中的每个节点都包含指向前一个节点和后一个节点的指针。这使得在双向链表中可以从前向后或从后…

无人机之数据提取篇

一、无人机平台与传感器 无人机是进行数据采集的基础设施&#xff0c;其稳定性、可靠性、灵活性和负载能力直接影响到数据采集的效果。根据实际需求&#xff0c;需选择适合的无人机类型&#xff0c;如固定翼无人机适合大范围、长时间的数据采集&#xff0c;而多旋翼无人机则更适…

HTML基础用法介绍一

VS code 如何快速生成HTML骨架注释是什么&#xff1f;为什么要写注释&#xff1f;注释的标签是什么&#xff1f;标题标签段落标签换行标签与水平线标签 (都是单标签&#xff09;文本格式化标签图片标签超链接标签音频标签视频标签 &#x1f698;正片开始 VS code 如何快速生成…

基于Spring框架的分层解耦详解

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java Web关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Java Web 三层架构&#xff1a; Java Web可以大致被分为三层架构&#xff1a;…

成都睿明智科技有限公司抖音电商服务靠谱吗?

在这个电商风起云涌的时代&#xff0c;抖音作为短视频直播的超级流量池&#xff0c;正深刻改变着人们的购物习惯。无数商家蜂拥而至&#xff0c;渴望在这片蓝海中找到属于自己的岛屿。而提及抖音电商服务&#xff0c;成都睿明智科技有限公司无疑是一个备受瞩目的名字。那么&…

Linux 进程的基本概念及描述

目录 0.前言 1. 什么是进程 1.1 进程的定义与特性 1.2 进程与线程的区别 2.描述进程 2.1 PCB (进程控制块) 2.2 task_struct 3.查看进程 3.1 查看进程信息 3.1.1 /proc 文件系统 3.1.2 ps 命令 3.1.2 top 和 htop 命令 3.2 获取进程标识符 3.2.1使用命令获取PID 3.2.2 使用C语言…

加密与安全_HTOP 一次性密码生成算法

文章目录 HOTP 的基础原理HOTP 的工作流程HOTP 的应用场景HOTP 的安全性安全性增强措施Code生成HOTP可配置项校验HOTP可拓展功能计数器&#xff08;counter&#xff09;计数器在客户端和服务端的作用计数器的同步机制客户端和服务端中的计数器表现服务端如何处理计数器不同步计…

AIGC学习笔记—minimind详解+训练+推理

前言 这个开源项目是带我的一个导师&#xff0c;推荐我看的&#xff0c;记录一下整个过程&#xff0c;总结一下收获。这个项目的slogan是“大道至简”&#xff0c;确实很简。作者说是这个项目为了帮助初学者快速入门大语言模型&#xff08;LLM&#xff09;&#xff0c;通过从零…

vue3学习记录-computed

vue3学习记录-computed 1.为什么要用computed2.使用方法2.1 基本实例2.2 可写计算属性 1.为什么要用computed 写个购物车的案例 <script setup> import { ref, reactive,computed } from "vue" const tableData reactive([{ name: 商品1, price: 10, num: 1…

3. 轴指令(omron 机器自动化控制器)——>MC_MoveRelative

机器自动化控制器——第三章 轴指令 5 MC_MoveRelative变量▶输入变量▶输出变量▶输入输出变量 功能说明▶指令详情▶时序图▶重启运动指令▶多重启动运动指令▶异常 MC_MoveRelative 指定自指令当前位置起的移动距离&#xff0c;进行定位。 指令名称FB/FUN图形表现ST表现MC…

JVM(HotSpot):字符串常量池(StringTable)

文章目录 一、内存结构图二、案例讲解三、总结 一、内存结构图 JDK1.6 JDK1.8 我们发现&#xff0c;StringTable移入了Heap里面。所以&#xff0c;应该想到&#xff0c;StringTable将受到GC管理。 其实&#xff0c;1.6中&#xff0c;在方法区中的时候&#xff0c;也是受GC管…

从底层理解为什么常量区中的代码不能被修改?

目录 前言&#xff1a;一、了解虚拟地址二、页表映射三、常量区不能被修改的原理四、常量区不可修改的意义 前言&#xff1a; 平时我们在编写代码时都会用到或遇到所谓的常量区或者不可修改的代码&#xff0c;比如说用双引号包起来字符串&#xff08;“Hello World”&#xff…