zxing生成、解析二维码,条形码

1、maven依赖

        <!--zxing依赖-->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.1.0</version>
        </dependency>

2、一些重要属性方法

BarcodeFormat (码类型)

设置生成条形码的类型。
如:二维码、EAN-13码、UPC-A码、Code-128码、Code-39码等等。

条形码类型
BarcodeFormat.AZTEC    阿兹特克码
BarcodeFormat.CODABAR    Codabar码
BarcodeFormat.CODE_39    CODE-30码
BarcodeFormat.CODE_93    CODE-93码
BarcodeFormat.CODE_128    CODE-128码
BarcodeFormat.DATA_MATRIX    矩阵式二维条码
BarcodeFormat.EAN_8    EAN-8码
BarcodeFormat.EAN_13    EAN-13码
BarcodeFormat.ITF    交插二五条码
BarcodeFormat.MAXICODE    MaxiCode二维条码
BarcodeFormat.PDF_417    PDF417
BarcodeFormat.QR_CODE    二维码
BarcodeFormat.RSS_14    RSS 14
BarcodeFormat.RSS_EXPANDED    RSS EXPANDED
BarcodeFormat.UPC_A    UPC A
BarcodeFormat.UPC_E    UPC E
BarcodeFormat.UPC_EAN_EXTENSION    UPC EAN EXTENSION

EncodeHintType(自定义属性)

3、带logo得到二维码生成

/**
 * @description: 二维码生成
 * @author: HK
 * @since: 2024/11/4 10:16
 */
public class Test3 {
    private static final Integer CODE_WIDTH = 300;                 // 基础属性:二维码宽度,单位像素
    private static final Integer CODE_HEIGHT = 300;                // 基础属性:二维码高度,单位像素
    private static final Integer FRONT_COLOR = 0x000000;           // 基础属性:二维码前景色,0x000000 表示黑色
    private static final Integer BACKGROUND_COLOR = 0xFFFFFF;      // 基础属性:二维码背景色,0xFFFFFF 表示白色
    public static void main(String[] args) throws Exception {
        //设置生成二维码的内容
        String qrMessage = "https://www.baidu.com";

        // EncodeHintType:编码提示类型,枚举类型
        //    EncodeHintType.CHARACTER_SET:设置字符编码类型
        //    EncodeHintType.ERROR_CORRECTION:设置误差校正
        //    ErrorCorrectionLevel:误差校正等级,
        //          L = ~7% correction、M = ~15% correction、
        //          Q = ~25% correction、H = ~30% correction
        //      不设置时,默认为 L 等级,等级不一样,生成的图案不同,但扫描的结果是一样的
        //    EncodeHintType.MARGIN:设置二维码边距,单位像素,值越小,二维码距离四周越近
        Map<EncodeHintType, Object> typeObjectHashMap = new HashMap<EncodeHintType, Object>();
        typeObjectHashMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        typeObjectHashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.M);
        typeObjectHashMap.put(EncodeHintType.MARGIN, 1);

        // MultiFormatWriter:多格式写入,这是一个工厂类,里面重载了两个 encode 方法,用于写入条形码或二维码
        // encode(String contents,BarcodeFormat format,int width, int height,Map<EncodeHintType,?> hints)
        //      参数1:contents:条形码/二维码内容
        //      参数2:format:编码类型,如 条形码,二维码 等
        //      参数3:width:码的宽度
        //      参数4:height:码的高度
        //      参数5:hints:码内容的编码类型
        // BarcodeFormat:枚举该程序包已知的条形码格式,即创建何种码,如 1 维的条形码,2 维的二维码 等
        // BitMatrix:位(比特)矩阵或叫2D矩阵,也就是需要的二维码
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        BitMatrix bitMatrix = multiFormatWriter
                .encode(qrMessage, BarcodeFormat.QR_CODE, CODE_WIDTH, CODE_HEIGHT, typeObjectHashMap);

        // java.awt.image.BufferedImage:具有图像数据的可访问缓冲图像,实现了 RenderedImage 接口
        // BitMatrix 的 get(int x, int y) 获取比特矩阵内容,指定位置有值,则返回true,将其设置为前景色,否则设置为背景色
        // BufferedImage 的 setRGB(int x, int y, int rgb) 方法设置图像像素
        //      参数1 x:像素位置的横坐标,即列
        //      参数2 y:像素位置的纵坐标,即行
        //      参数3 rgb:像素的值,采用 16 进制,如 0xFFFFFF 白色
        BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);
        for (int x = 0; x < CODE_WIDTH; x++) {
            for (int y = 0; y < CODE_HEIGHT; y++) {
                bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);
            }
        }

        // 把logo图片设置到二维码中间位置(若不想在二维码中间插入logo图片则不执行此条代码)
        insertLogoImage(bufferedImage, new FileInputStream("d://hello.jpg"));

        // javax.imageio.ImageIO java扩展的图像IO
        // write(RenderedImage im,String formatName,File output)
        //      im:待写入的图像
        //      formatName:图像写入的格式
        //      output:写入的图像文件,文件不存在时会自动创建
        // 即将保存的二维码图片文件
        ImageIO.write(bufferedImage, "png", new FileOutputStream("d://hello.png"));
    }

    /***
     * 为二维码插入中间的logo图片
     * @param bufferedImage 二维码图片信息
     * @param logoInput logo图片位置
     * @throws IOException  抛出IO异常
     */
    private static void insertLogoImage(BufferedImage bufferedImage, InputStream logoInput) throws IOException {
        // 加载Logo图片到Image对象
        Image logoImage = ImageIO.read(logoInput);
        // 设置二维码中间的Logo图片(设置logo图片的宽高需要保持和二维码宽高的一半宽高)
        int logoWidth = CODE_WIDTH / 5;
        int logoHeight = CODE_HEIGHT / 5;
        // 按照指定的宽高进行等比缩放(若设置的宽高比之前大则代表放大),并将缩放后的图片绘制到一个新的BufferedImage对象中
        Image image = logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);
        BufferedImage logoBufferedImage = new BufferedImage(logoWidth, logoHeight, BufferedImage.TYPE_INT_RGB);
        // 获取图形上下文对象,用于后续将缩放后的图片绘制在 logoBufferedImage 对象上
        Graphics graphics = logoBufferedImage.getGraphics();
        // 绘制缩放后的图片到 logoBufferedImage 对象上,使其填满整个画布
        graphics.drawImage(image, 0, 0, null);
        // 释放图形上下文对象,避免内存泄漏
        graphics.dispose();
        // 把处理好的logo图片再次设置给之前的logo图片对象
        logoImage = image;

        // 开始把logo图片插入到二维码的中间位置
        // 获取 Graphics2D 对象,用于后续在 bufferedImage 上绘制二维码和 logo 图片
        Graphics2D graph = bufferedImage.createGraphics();
        // 计算出 logo 图片在二维码中间的坐标点 (x, y),以便后续将 logo 图片插入到正确的位置。
        int x = (CODE_WIDTH - logoWidth) / 2;
        int y = (CODE_HEIGHT - logoHeight) / 2;
        // 绘制缩放后的 logo 图片到二维码中间位置
        graph.drawImage(logoImage, x, y, logoWidth, logoHeight, null);
        // 设置边框的线条粗细为 3 像素,并且设置线条是一个圆角矩形,6表示圆角的半径。并关闭资源
        graph.setStroke(new BasicStroke(3f));
        graph.draw(new RoundRectangle2D.Float(x, y, logoWidth, logoHeight, 6, 6));
        graph.dispose();
    }
}

4、解析二维码

/**
 * 二维码解析
 *
 * @author Anhui OuYang
 * @version 1.0
 **/
public class QRCodeParsing {

    public static void main(String[] args) throws Exception {
        System.out.println("=========================二维码解析 Start=========================");
        parsingQRCode(new File("d://222.png"));
        System.out.println("=========================二维码解析 End=========================");
    }

    /***
     * 二维码(QR_CODE)解析
     * @param file 文件路径信息
     */
    public static void parsingQRCode(File file) throws IOException, NotFoundException {
        //创建一个图像数据缓冲区类(并读取二维码图片)
        BufferedImage bufferedImage = ImageIO.read(file);

        // 对图片信息的图像处理和分析
        // 注意需要 zxing 库的版本 3.2.1 或更高版本才能使用,若没有则使用我下面定义的getRGBPixelData(BufferedImage image)
        BufferedImageLuminanceSource luminanceSource = new BufferedImageLuminanceSource(bufferedImage);
        // 若版本不够则使用这种方式
        // RGBLuminanceSource luminanceSource = new RGBLuminanceSource(bufferedImage.getWidth(),
        //         bufferedImage.getHeight(), getRGBPixelData(bufferedImage));

        // 创建BinaryBitmap对象
        // BinaryBitmap是二值化位图,将像素从RGB空间转换为黑白颜色空间
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(luminanceSource));

        // 设置解码参数
        Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>();
        hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");   // 设置解析的字符集

        // 使用 MultiFormatReader 进行解码
        MultiFormatReader formatReader = new MultiFormatReader();
        formatReader.setHints(hints);                               // 设置解码一些参数
        Result result = formatReader.decode(binaryBitmap);          // 解码(解析binaryBitmap数据)

        // 打印一些信息
        System.out.println("二维码解析图片的路径:   " + file.getPath());
        System.out.println("二维码解析图片中格式:   " + result.getBarcodeFormat());
        System.out.println("二维码解析图片中内容:   " + result.getText());
    }

   
}

5、条形码

简单条形码(无文字)

public class GenerateBarcode {

    private static final Integer CODE_WIDTH = 300;                 // 基础属性:二维码宽度,单位像素
    private static final Integer CODE_HEIGHT = 150;                // 基础属性:二维码高度,单位像素
    private static final Integer FRONT_COLOR = 0x000000;           // 基础属性:二维码前景色,0x000000 表示黑色
    private static final Integer BACKGROUND_COLOR = 0xFFFFFF;      // 基础属性:二维码背景色,0xFFFFFF 表示白色

    public static void main(String[] args) throws Exception {

        //设置生成条形码的内容(注:条形码信息一定要按照格式,如随便一个商品上的条形码都行,但必须是EAN_13格式)
        String qrMessage = "6971483746515";

        // EncodeHintType:指定和控制码生成器的一些参数的类
        Map<EncodeHintType, Object> typeObjectHashMap = new HashMap<EncodeHintType, Object>();
        // 设置编码
        typeObjectHashMap.put(EncodeHintType.CHARACTER_SET, "UTF-8");
        // 设置容错等级
        typeObjectHashMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        // 设置边距,默认为5
        typeObjectHashMap.put(EncodeHintType.MARGIN, 3);

        // MultiFormatWriter:用于写入条形码或二维码
        MultiFormatWriter multiFormatWriter = new MultiFormatWriter();
        BitMatrix bitMatrix = multiFormatWriter
                .encode(qrMessage, BarcodeFormat.EAN_13, CODE_WIDTH, CODE_HEIGHT, typeObjectHashMap);

        // java.awt.image.BufferedImage:把条形码信息转换为图像信息
        BufferedImage bufferedImage = new BufferedImage(CODE_WIDTH, CODE_HEIGHT, BufferedImage.TYPE_INT_BGR);
        for (int x = 0; x < CODE_WIDTH; x++) {
            for (int y = 0; y < CODE_HEIGHT; y++) {
                bufferedImage.setRGB(x, y, bitMatrix.get(x, y) ? FRONT_COLOR : BACKGROUND_COLOR);
            }
        }

        // javax.imageio.ImageIO 将图片信息写出到文件
        ImageIO.write(bufferedImage, "png", new FileOutputStream("d://222.png"));
    }

}

条形码(含文字)

/**
 * 一个简单的条形码生成
 *
 * @author Anhui OuYang
 * @version 1.0
 **/
public class GenerateBarcode {

    private static final Integer CODE_WIDTH = 300;                 // 基础属性:二维码宽度,单位像素
    private static final Integer CODE_HEIGHT = 150;                // 基础属性:二维码高度,单位像素
    private static final Integer FRONT_COLOR = 0x000000;           // 基础属性:二维码前景色,0x000000 表示黑色
    private static final Integer BACKGROUND_COLOR = 0xFFFFFF;      // 基础属性:二维码背景色,0xFFFFFF 表示白色

    public static void main(String[] args) throws Exception {
        // 条形码底部内容
        String bottomStr = "123456";
        // 条形码左上角内容
        //String topLeftStr = name.length() < 11 ? name : name.substring(0, 11);
        String topLeftStr = "ceshi";
        // 条形码右上角内容
        String topRightStr = "2024-11-4";
        // 生成条形码
        BufferedImage barCodeImage = create(bottomStr, 250, 50);
        BufferedImage withWords = createWithWords(
                barCodeImage,
                bottomStr,
                topLeftStr,
                topRightStr,
                250,
                150,
                10,
                14);
        ImageIO.write(withWords, "png", new FileOutputStream("d://222.png"));

        barCodeImage = create(bottomStr, 350, 70);
        withWords = createWithWords(
                barCodeImage,
                bottomStr,
                topLeftStr,
                topRightStr,
                350,
                210,
                14,
                20);
        ImageIO.write(withWords, "png", new FileOutputStream("d://333.png"));

        barCodeImage = create(bottomStr, 500, 100);
        withWords = createWithWords(
                barCodeImage,
                bottomStr,
                topLeftStr,
                topRightStr,
                500,
                300,
                20,
                28);
        ImageIO.write(withWords, "png", new FileOutputStream("d://444.png"));
    }

    /**
     * 生成简单条形码(无文字)
     *
     * @param content
     * @param width
     * @param height
     * @return
     */
    public static BufferedImage create(String content, int width, int height) {
        // 定义位图矩阵BitMatrix
        BitMatrix matrix = null;

        try {
            // 定义二维码参数
            Map<EncodeHintType, Object> hints = new HashMap<EncodeHintType, Object>(3);
            // 设置编码
            hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
            // 设置容错等级
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            // 设置边距,默认为5
            hints.put(EncodeHintType.MARGIN, 3);

            // 使用code_128格式进行编码生成条形码
            MultiFormatWriter writer = new MultiFormatWriter();
            matrix = writer.encode(content, BarcodeFormat.CODE_128, width, height, hints);
        } catch (WriterException e) {
            e.printStackTrace();
            //throw new RuntimeException("条形码内容写入失败");
        }

        return MatrixToImageWriter.toBufferedImage(matrix);
    }


    /**
     * 生成条形码(含文字)
     * ****************************************************
     * ----------------------------------------------
     * |                         2023-06-10 10:55   |
     * |                                            |
     * |            商品名称 /超出不显示/              |
     * |                                            |
     * |    | || ||| | || |||| | | | ||| | | ||     |
     * |    | || ||| | || |||| | | | ||| | | ||     |
     * |    | || ||| | || |||| | | | ||| | | ||     |
     * |    | || ||| | || |||| | | | ||| | | ||     |
     * |               13800000000                  |
     * ----------------------------------------------
     * ===================================================
     * 1、日期:顶部右侧
     * 2、商品名称:居中
     * 3、条形码:商品名称下方,且居中
     * 4、条码内容:条形码下方,且居中
     * *****************************************************
     *
     * @param codeImage     条形码图片
     * @param bottomStr     底部文字
     * @param titleStr      标题文字
     * @param topRightStr   右上角文字
     * @param pictureWidth  图片宽度
     * @param pictureHeight 图片高度
     * @param margin        边距
     * @param fontSize      字体大小
     * @return 条形码图片
     */
    private static BufferedImage createWithWords(
            BufferedImage codeImage,
            String bottomStr,
            String titleStr,
            String topRightStr,
            int pictureWidth,
            int pictureHeight,
            int margin,
            int fontSize) {
        BufferedImage picImage = new BufferedImage(pictureWidth, pictureHeight, BufferedImage.TYPE_INT_RGB);

        Graphics2D g2d = picImage.createGraphics();
        // 抗锯齿
        setGraphics2D(g2d);
        // 设置白色
        setColorWhite(g2d, picImage.getWidth(), picImage.getHeight());

        // 条形码默认居中显示
        int codeStartX = (pictureWidth - codeImage.getWidth()) / 2;
        int codeStartY = (pictureHeight - codeImage.getHeight()) / 2 + 2 * margin;
        // 画条形码到新的面板
        g2d.drawImage(codeImage, codeStartX, codeStartY, codeImage.getWidth(), codeImage.getHeight(), null);

        // 给条码上下各画一条线
        // 设置颜色
        g2d.setColor(Color.LIGHT_GRAY);
        int y1 = 2 * margin + codeImage.getHeight();
        int y2 = 2 * margin + 2 * codeImage.getHeight();
        g2d.drawLine(0, y1, pictureWidth, y1);
        g2d.drawLine(0, y2, pictureWidth, y2);

        // 画文字到新的面板
        g2d.setColor(Color.BLACK);
        // 字体、字型、字号
        g2d.setFont(new Font("微软雅黑", Font.PLAIN, fontSize));
        // 文字与条形码之间的间隔
        int wordAndCodeSpacing = 3;

        // 底部文字(居中)
        if (StringUtils.isNotEmpty(bottomStr)) {
            // 文字长度
            int strWidth = g2d.getFontMetrics().stringWidth(bottomStr);
            // 文字X轴开始坐标
            int strStartX = (pictureWidth - strWidth) / 2;
            if (strStartX < margin) {
                strStartX = margin;
            }
            // 文字Y轴开始坐标
            int strStartY = codeStartY + codeImage.getHeight() + fontSize + wordAndCodeSpacing;
            // 画文字
            g2d.drawString(bottomStr, strStartX, strStartY);
        }

        // 右上角文字
        if (StringUtils.isNotEmpty(topRightStr)) {
            // 文字长度
            int strWidth = g2d.getFontMetrics().stringWidth(topRightStr);
            // 文字X轴开始坐标
            int strStartX = pictureWidth - strWidth - margin;
            // 文字Y轴开始坐标
            int strStartY = margin + fontSize;
            // 画文字
            g2d.drawString(topRightStr, strStartX, strStartY);
        }

        // 标题文字(居中)
        if (StringUtils.isNotEmpty(titleStr)) {
            if (titleStr.length() > 11) {
                titleStr = titleStr.substring(0, 11);
            }
            // 字体、字型、字号
            int fs = (int) Math.ceil(fontSize * 1.5);
            g2d.setFont(new Font("微软雅黑", Font.PLAIN, fs));
            // 文字长度
            int strWidth = g2d.getFontMetrics().stringWidth(titleStr);
            // 文字X轴开始坐标
            int strStartX = (pictureWidth - strWidth) / 2;
            if (strStartX < margin) {
                strStartX = margin;
            }
            // 文字Y轴开始坐标
            int strStartY = codeStartY - margin;
            // 画文字
            g2d.drawString(titleStr, strStartX, strStartY);
        }

        g2d.dispose();
        picImage.flush();

        return picImage;
    }
    /**
     * 设置 Graphics2D 属性 (抗锯齿)
     *
     * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
     */
    private static void setGraphics2D(Graphics2D g2d) {
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_DEFAULT);
        Stroke s = new BasicStroke(1, BasicStroke.CAP_ROUND, BasicStroke.JOIN_MITER);
        g2d.setStroke(s);
    }

    /**
     * 设置背景为白色
     *
     * @param g2d Graphics2D提供对几何形状、坐标转换、颜色管理和文本布局更为复杂的控制
     */
    private static void setColorWhite(Graphics2D g2d, int width, int height) {
        g2d.setColor(Color.WHITE);
        // 填充整个屏幕
        g2d.fillRect(0, 0, width, height);
        // 设置笔刷
        g2d.setColor(Color.BLACK);
    }


}

解析条形码

public static void main(String[] args) throws Exception {
        String text = "";
        try {
            BufferedImage image = ImageIO.read(new File("d://444.png"));
            if (image == null) {
                return;
            }
            LuminanceSource source = new BufferedImageLuminanceSource(image);
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));

            Map<DecodeHintType, Object> hints = new HashMap<DecodeHintType, Object>(3);
            hints.put(DecodeHintType.CHARACTER_SET, "UTF-8");
            hints.put(DecodeHintType.PURE_BARCODE, Boolean.TRUE);
            hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE);
            Result result = new MultiFormatReader().decode(bitmap, hints);
            text = result.getText();
            System.out.println(text);
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("无法识别");
        }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

有效增加网站流量的实用策略和技巧

内容概要 在数字化时代&#xff0c;网站流量的增加被视为在线业务成功的关键。网站流量不仅仅意味着访问者的数量&#xff0c;还影响着品牌知名度、用户参与度和销售转化率。针对这一需求&#xff0c;企业需要采取行之有效的策略&#xff0c;例如搜索引擎优化&#xff08;SEO&…

玄机-应急响应- Linux入侵排查

一、web目录存在木马&#xff0c;请找到木马的密码提交 到web目录进行搜索 find ./ type f -name "*.php" | xargs grep "eval(" 发现有三个可疑文件 1.php看到密码 1 flag{1} 二、服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 被md5加密的…

从 vue 源码看问题 — vue 如何进行异步更新?

前言 在上一篇 如何理解 vue 响应式&#xff1f; 中&#xff0c;了解到响应式其实是通过 Observer 类中调用 defineReactive() 即 Object.defineProperty() 方法为每个目标对象的 key&#xff08;key 对应的 value 为非数组的&#xff09; 设置 getter 和 setter 实现拦截&…

本地部署bert-base-chinese模型交互式问答,gradio

首先下载bert-base-chinese&#xff0c;可以在 Huggingface, modelscope, github下载 pip install gradio torch transformers import gradio as gr import torch from transformers import BertTokenizer, BertForQuestionAnswering# 加载bert-base-chinese模型和分词器 mod…

SYN590RH是SYNOXO全新开发设计的一款宽电压范围,低功耗,高性能,无需外置AGC电容de单芯片ASK或00 K射频接收器

一般描述 SYN590RH是SYNOXO全新开发设计的一款宽电压范围&#xff0c;低功耗&#xff0c;高性能&#xff0c;无需外置AGC电容&#xff0c;灵敏度达到典型-110 dBm,400MHz~450MHz频率范围应用的单芯片ASK或00 K射频接收器。 SYN590RH是一款典型的即插即用型单片高…

Unreal5从入门到精通之如何在指定的显示器上运行UE程序

前言 我们有一个设备,是一个带双显示器的机柜,主显示器是一个小竖屏,可以触屏操作,大显示器是一个普通的横屏显示器。我们用这个机柜的原因就是可以摆脱鼠标和键盘,直接使用触屏操作,又可以在大屏观看,非常适合用于教学。 然后我们为这款机柜做了很多个VR项目,包括Uni…

C++中unordered_map和unordered_set的介绍以及用哈希表封装实现unordered_map和unordered_set

目录 1.unordered_map和unordered_set的使用 1.1unordered_set类的介绍 1.2unordered_set和set的使用差异 1.3unordered_map和map的使用差异 1.4unordered_multimap/unordered_multiset 2.用哈希表封装实现unordered_set和unordered_map 2.1实现出复用哈希表的框架并支持…

stm32学习4

学习目录 一.流水灯1.创建文件2.编写相关代码 一.流水灯 1.创建文件 将方法进行分类保存在不同的 .c 文件中&#xff0c;方便复用和寻找&#xff1b; 创建Hardware\LED文件&#xff0c;其中有led.c和led.h文件&#xff0c;用于存放有关LED灯操作的方法&#xff1b; 在User文…

JVM结构图

JVM&#xff08;Java虚拟机&#xff09;是Java编程语言的核心组件之一&#xff0c;负责将Java字节码翻译成机器码并执行。JVM由多个子系统组成&#xff0c;包括类加载子系统、运行时数据区、执行引擎、Java本地接口和本地方法库。 类加载子系统&#xff08;Class Loading Subsy…

mysql之命令行基础指令

一&#xff1a;安装好mysql后&#xff0c;注册好账号密码。 二&#xff1a;在命令行进行登录的指令如下 mysql -u用户名 -p 例如&#xff1a;mysql -uroot -p; 然后按下回车&#xff0c;进入输入密码。 三&#xff1a;基本指令&#xff1a; 1&#xff1a;查看当前账户的所有…

LabVIEW适合开发的软件

LabVIEW作为一种图形化编程环境&#xff0c;主要用于测试、测量和控制系统的开发。以下是LabVIEW在不同应用场景中的适用性和优势。 一、测试与测量系统 LabVIEW在测试与测量系统中的应用广泛&#xff0c;是工程测试领域的主流工具之一。利用其强大的数据采集与处理功能&…

MySQL表的增删改查(CRUD3约束)

这次我们开始先不复习嗷&#xff0c;等到把数据表的删除说完咱们统一&#xff0c;总结书写 1.数据表的删除&#xff1a; 语法&#xff1a; 1. 使用 DROP TABLE 语句删除单个表 基本语法&#xff1a;DROP TABLE [IF EXISTS] table_name; table_name是要删除的表的名称。IF EXIS…

国内首位聋人 Android 软件工程师体验通义灵码,“这真是太棒了”

Hi 大家好&#xff01; 我就是人见人爱、Bug 闪开的通义灵码&#xff01; 上个月&#xff0c;我上线了一项新能力&#xff1a; 体验通义灵码 workspace&#xff1a;轻松分析项目结构&#xff0c;结合代码仓库理解工程、查询问答等 补充说明&#xff1a;当你需要快速了解一个工…

萌熊数据科技:剑指脑机转入,开启科技新篇章

近日&#xff0c;科技圈传来一则令人瞩目的消息&#xff0c;天津萌熊数据科技有限公司和天津一万年科技发展有限公司在全国范围内大力开展AI加生命科学的主体业务&#xff0c;并明确将朝着脑机转入方向深入发展&#xff0c;引发了行业内外的广泛关注。 天津萌熊数据科技有限公司…

OceanBase 安装使用详细说明

OceanBase 安装使用详细说明 一、系统环境要求二、安装OceanBase环境方案一:在线下载并安装all-in-one安装包方案二:离线安装all-in-one安装包安装前的准备工作三、配置OceanBase集群编辑配置文件部署和启动集群连接到集群集群状态和管理四、创建业务租户和数据库创建用户并赋…

MYSQL---TEST5(Trigger触发器Procedure存储过程综合练习)

触发器Trigger 数据库mydb16_trigger创建 表的创建 goods create table goods( gid char(8) primary key, #商品号 name varchar(10), #商品名 price decimal(8,2), #价格 num int&#xff1b;&#xff09; #数量orders create tabl…

MySQL 完整教程:从入门到精通

MySQL 完整教程&#xff1a;从入门到精通 MySQL 是一个广泛使用的关系型数据库管理系统&#xff0c;它使用结构化查询语言 (SQL) 来管理和操作数据。本文将详细介绍 MySQL 的基本概念、安装与配置、常用 SQL 语法、数据表的创建与管理、索引、视图、存储过程、触发器等高级特性…

winfrom控制应用程式不能双开

功能&#xff1a;控制winform应用程式不能双开 //应用程式不能双开bool isAppRunning false;Mutex mutex new Mutex(true, "MyApp", out isAppRunning);if (!isAppRunning){MessageBox.Show("程序已运行&#xff0c;不能再次打开&#xff01;");Environm…

uniapp:启动界面关闭时长控制

代码控制关闭启动界面 App启动后不会自动关闭启动界面&#xff0c;需要在代码中调用plus.navigator.closeSplashscreen关闭启动界面。"app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"autoclose" : false,}, }很多…