【Java数据类型学习——String】

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
🌈个人主页: Aileen_0v0
🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法
💫个人格言:“没有罗马,那就自己创造罗马~”

文章目录

    • `打印字符串长度的两种方法`
    • `字符串String的比较`
      • `1.==用于比较引用的对象是否指向同一个内存地址`
      • `2.用equal比较两个字符串的值是否一致`
      • `3.判断字符串的大小-compareTo`
      • `4.忽略大小写进行比较-compareToIgnoreCase和equalsIgnoreCase`
    • `字符串常用于查找调用的方法及使用示例`
    • `数据类型的转换`
      • 将整数转换成字符串
      • 其他类型转换
      • 大小写转换
      • 字符串转数组
      • 格式化输出
      • 字符串替换
      • 字符串的拆分
      • 字符串截取
      • 去掉字符串左右空格,保留中间空格通过 trim()方法
      • 字符串的不可变性
      • stringBuffer & stringBulider的引入

在这里插入图片描述

打印字符串长度的两种方法

        //①通过引用来打印字符串长度
        System.out.println(s1.length());
        //②通过String类型对象打印字符串长度
        System.out.println("Aileen".length());

字符串String的比较

1.==用于比较引用的对象是否指向同一个内存地址

        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;//S3这个引用指向S1这个引用所指向的对象
        System.out.println(s3);
        System.out.println(s1 == s3);
        System.out.println(s1 == s2);

在这里插入图片描述

        String s1 = new String("hello");
        String s5 = new String("hello");
        System.out.println(s1 == s5);

在这里插入图片描述


2.用equal比较两个字符串的值是否一致

        System.out.println("-------------------------------------------");
        String s1 = new String("hello");
        String s5 = new String("hello");
        System.out.println(s1 == s5);
        System.out.println(s1.equals(s5));
        System.out.println("-------------------------------------------");

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我们可以看到,当我们调用equals方法的时候,他就会被String进行重写(它原本是Object的equals方法),如上图所示,最后通过equals可以直接比较字符串的内容。

在Java中只要是直接赋值的字符串都会被放到一个字符串的常量池里面,但是如果值相等的话,它只会放一个。

在这里插入图片描述


3.判断字符串的大小-compareTo

  • equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较规则如下:
    • 1.先按照字典次序比较大小,若出现不等的字符,直接返回这两个字符的大小差值。
    • 2.如果前k个字符相等(K为两个字符长度的最小差值),返回值是两个字符串长度差值(相同输出0)。

public class Test {
    public static void main(String[] args) {
        //判断字符串大小
        String s6 = "hello";
        String s7 = "aaello";

        //s1 和 s2 比较大小 s1 > s2
        System.out.println(s6.compareTo(s7));
    }
   }

Java中,String类的compareTo方法用来比较两个字符串。它按照两个字符串的字典顺序去比较,比较规则是Unicode值。

因为h的Unicode值(104)大于a的(97),所以调用compareTo方法打印的结果是这两个Unicode值之差,结果是7。
在这里插入图片描述


        String s8 = "hello";
        String s9 = "helloAileen";
        System.out.println(s8.compareTo(s9));

在这里插入图片描述


4.忽略大小写进行比较-compareToIgnoreCase和equalsIgnoreCase

public class Test {

    public static void main(String[] args) {
        String s1 = new String("hello");
        String s2 = new String("Hello");

        System.out.println(s1.equals(s2));
        System.out.println(s1.equalsIgnoreCase(s2));

        System.out.println(s1.compareTo(s2));
        System.out.println(s1.compareToIgnoreCase(s2));
    }
 }

在这里插入图片描述


字符串常用于查找调用的方法及使用示例

在这里插入图片描述

  • ①返回字符串对应下标的字符-charAt
        String s1 = new String("hello");
        char ch1 = s1.charAt(0);
        System.out.println(ch1);

在这里插入图片描述

       String s1 = new String("hello");
        char ch2 = s1.charAt(100);
        System.out.println(ch2);

在这里插入图片描述


  • ②返回对应字符出现的下标位置,从头开始一个一个查。- indexOf
public class Test {
    public static void main(String[] args) {
        String s1 = new String("hello");
//        返回对应字符出现的下标位置,从头开始一个一个查
        int pos = s1.indexOf("l");
        System.out.println(pos);
        }
     }

在这里插入图片描述


③:从指定位置找某个字符出现的位置 - indexOf

//        从指定位置开始找某个字符出现的位置
        int index = s1.indexOf("l",0);
        System.out.println(index);

在这里插入图片描述

从一个字符串中找另一个字符串,下面例子就是从我的s1这个字符串中查找我的字符串“lo”的位置。

public class Test {
    public static void main(String[] args) {
        String s1 = new String("hello");
        int index1 = s1.indexOf("lo");
        System.out.println(index1);
		}
    }

在这里插入图片描述


④:从后往前找 - lastIndexOf

public class Test {

    public static void main(String[] args) {
        String s1 = new String("hello");

        int index = s1.lastIndexOf("l");
        System.out.println(index);

        int index2 = s1.lastIndexOf("o",4);
        System.out.println(index2);

        int index3 = s1.lastIndexOf("e",0);
        System.out.println(index3);

        int index4 = s1.lastIndexOf("l",2);
        System.out.println(index4);

    }
  }

在这里插入图片描述


数据类型的转换

将整数转换成字符串

序列化:将对象转化成字符串
反序列化:将字符串转换成对象

import com.sun.org.apache.bcel.internal.util.ClassStack;
class Student{
    public String name;
    public  int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return
                "name='" + name + '\'' +
                ", age=" + age
                ;
    }
}

public class Test {
    public static void main(String[] args) {
//  将整数转换成字符串
        String str = String.valueOf(1123);
        System.out.println(str);

//  序列化(将对象转换成字符串)与反序列化(将字符转换成对象):
//      序列化:
        String str2  = String.valueOf(new Student("Aileen", 21));
        System.out.println(str2);

//        Ⅰ把字符串转换成整数
        int a = Integer.valueOf("87384");
        System.out.println(a + 6);

//        Ⅱ把字符串转换成整数  和I的功能基本一致 、
//        Integer是Java当中的包装类,其拥有更多的方法 使得我们可以通过调用这些方法直接完成转换
        int b = Integer.parseInt("123");
        System.out.println(b + 7);
    }

其他类型转换

在这里插入图片描述

  • 同理,对于小数类型我们也可以使用这两种方法进行转换:
        double c = Double.valueOf("1");
        System.out.println(c + 0.05);

        double d = Double.parseDouble("9");
        System.out.println(d + 0.1);

在这里插入图片描述

大小写转换

public class Test {

    public static void main(String[] args) {
        String a = "hello";
        String b = "Aileen";
//        大写转换
        System.out.println(a.toUpperCase());
//        小写转换
        System.out.println(b.toLowerCase());
    }
  }

在这里插入图片描述

字符串转数组

public class Test {
    //字符串转数组
    public static void main(String[] args) {
        String name = "Aileen";
        char[] chars = name.toCharArray();
        for (char ch : chars) {
            System.out.println(ch);

        }
    }

在这里插入图片描述

  • Ⅰ.代码首先通过 name.toCharArray() 把字符串 “Aileen” 转换为字符数组 chars,即:{‘A’, ‘i’, ‘l’, ‘e’, ‘e’, ‘n’}。
  • Ⅱ.然后,for 循环依次取出 chars 数组中的每个字符,并将其赋值给变量 ch。
  • Ⅲ.在每次循环中,System.out.println(ch) 会打印出当前字符 ch。
    在这里插入图片描述

格式化输出

public class Test {
    public static void main(String[] args) {
        String s = String.format("%d-%d-%d" , 2024,11,27);
        System.out.println(s);
    }

在这里插入图片描述

字符串替换

public class Test {

    public static void main(String[] args) {
        String str = "ababababbababbabaababaabbabdfcdf";

//      替换所有老字符为第二个参数
        String str1 = str.replace("ab","098");
        System.out.println(str1);

        String str2 = str.replace("a","A");
        System.out.println(str2);

        String str3 = str.replaceAll("df","Aileen");
        System.out.println(str3);

        String str4 = str.replaceFirst("ab","21");
        System.out.println(str4);

        System.out.println(str);
    }

在这里插入图片描述

字符串的拆分

public class Test {
//    字符串的拆分
    public static void main(String[] args) {
        String str = "hello Aileen you are so good.";
//        ①按照空格分割
        String[] ret = str.split(" ");
        for (int i = 0; i < ret.length; i++) {
            System.out.println(ret[i]);
        }
        System.out.println("====================================");
//        ②按照空格拆分成limit = 2组进行分割
        String[] limitret = str.split(" " , 2);
        for (int j = 0; j < limitret.length; j++) {
            System.out.println(limitret[j]);
        }
        System.out.println("*************************************");
//        特殊类型分割:
//        ③一些特殊符号:*,+,. 的分割按照转义字符进行分割:其前面需要加上"\\"
        String str1 = "192.186.1.1";
//        ④正则表达式的分割
        String[] address = str1.split("\\.",3);

        for (int k = 0; k < address.length; k++) {
            System.out.println(address[k]);

        }

        System.out.println("--------------------------------------");

        String str2 = "110\\1123\\1\\1";

        String[] rot = str2.split("\\\\");

        for (int l = 0; l < rot.length ; l++) {
            System.out.println(rot[l]);
        }

        System.out.println("++++++++++++++++++++++++++++++++++++++++");

//        ⑤若一个字符串有多个分隔符,可以通过 | 进行连接
        String str3 = "name=Aileen&age=21";
        String[] infor = str3.split("=|&");
        for (int m = 0; m < infor.length; m++) {
            System.out.println(infor[m]);

        }
    }

在这里插入图片描述


  • 通过循环遍历进行分割
        System.out.println("···········································");

//        ④通过多次分割的方式进行分割 - for循环
        String str4 = "name=Aileen&age=21";
        //多次分割
        String[] myinfo = str4.split("&");
        //分割后myinfo数组包含两个元素: [0]:name=Aileen  [1]:age=21
        for (String x : myinfo) {
//            通过新变量x获取myinfo数组的每一个元素
            String[] newinfo = x.split("=") ;
//            再将每一个元素用=分割,并存储在一个新的数组newinfo里面
            for (String ss : newinfo) {
//                最后通过变量ss遍历数组的每一个元素
                System.out.println(ss);

            }
        }

在这里插入图片描述


字符串截取

public class Test {

//    字符串截取
    public static void main(String[] args) {
        String str = "abcdef";
        String ret = str.substring(1,3);//左闭右开,取得1到2的元素
        System.out.println(ret);
    }

在这里插入图片描述


去掉字符串左右空格,保留中间空格通过 trim()方法

        String str2 = "        Aileen is an excellent people.                      ";
        System.out.println(str2);
        String ret2 = str2.trim();
        System.out.println(ret2);

在这里插入图片描述


字符串的不可变性

String是一种不可变的对象,字符串中的内容是不可改变的,原因如下:

  • 1.String类在设计时就是不可变的,String类实现过程中就已经说明了。
  • 在这里插入图片描述
    在这里插入图片描述
    • 字符串不可改变的原因是因为这个数组是被private修饰的,并且未提供get()和set()方法

在这里插入图片描述

在这里插入图片描述

  • 通过对比上面的两段代码可得出:final关键字保证是引用不可改变,而不是对象内容不可改变。在这个例子中,我们可以改变array数据库的内容,但不能将array指向新的数据库。

在这里插入图片描述

//    ---------------字符串修改---------------------
    public static void main15(String[] args) {
//        String s = "hello";
//        s += " world";// s 指向了新的对象
//        System.out.println(s);//hello world


        //通过反汇编将上面的代码转换成下面的代码:
        String s = "hello";
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(s);
        stringBuilder.append(" world");
        s = stringBuilder.toString();
        System.out.println(s);
//        通过上面代码可得出:
        //String的 加号的拼接 会产生一些 临时的对像(stringBuilder)

    }

stringBuffer & stringBulider的引入

    public static void main(String[] args) {

        //Ⅰ.通过调用StringBuffer拼接字符串所消耗的时间
        long start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer("");
        for(int i = 0; i < 100000; ++i){
            sbf.append(i);
        }

        long end = System.currentTimeMillis();
        System.out.println(end - start);

        //Ⅱ.通过调用StringBuilder拼接字符串所消耗的时间
        start = System.currentTimeMillis();
        StringBuilder sbd = new StringBuilder();
        for(int i = 0; i < 100000; ++i){
            sbd.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);

        //Ⅲ.通过循环语句拼接字符串所消耗的时间
        start = System.currentTimeMillis();//获取当前系统的时间戳
        String s = "";
        for(int i = 0; i < 100000; ++i){
            //以后不能在循环当中 这样去拼接字符串
            s += i;
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }

在这里插入图片描述

  • 通过对比上面的三种字符串的拼接方式,我们可得到,在调用stringBuffer和stringBuilder对象及其append方法的时候,我们不会一直创建对象所以耗时较少,但如果是通过循环语句去拼接字符串就会不断地创建对象,每次循环都会不断地创造对象,这就导致消耗的时间大大增加。
  • 所以字符串拼接要使用stringBuilder和stringBuffer的append方法

方法说明
StringBuffer append(String str)在尾部追加, 相当于String的+=, 可以追加: booleancharchar[]doublefloatintlongObjectStringStringBuffer的变量
char charAt(int index)获取index位置的字符
int length()获取字符串的长度
int capacity()获取底层保存字符串空间总的大小
void ensureCapacity(int minimumCapacity)扩容
void setCharAt(int index, char ch)index位置的字符设置为ch
int indexOf(String str)返回str第一次出现的位置
int indexOf(String str, int fromIndex)fromIndex位置开始查找str第一次出现的位置
int lastIndexOf(String str)返回最后一次出现str的位置
int lastIndexOf(String str, int fromIndex)fromIndex位置开始找str最后一次出现的位置
StringBuffer insert(int offset, String str)offset位置插入: 八种基类类型&String类型&Object类型数据
StringBuffer deleteCharAt(int index)删除index位置字符
StringBuffer delete(int start, int end)删除[start,end)区间内的字符
StringBuffer replace(int start, int end, String str)[start,end)位置的字符替换为str
String substring(int start)start开始一直到末尾的字符以String的方式返回
String substring(int start, int end)[start,end)范围内的字符以String的方式返回
StringBuffer reverse()反转字符串
String toString()将所有字符按照String的方式返回
public static void main(String[] args) {
StringBuilder sb1 = new StringBuilder("hello");
StringBuilder sb2 = sb1;
// 追加:即尾插-->字符、字符串、整形数字
sb1.append(' '); // hello
sb1.append("world"); // hello world
sb1.append(123); // hello world123
System.out.println(sb1); // hello world123
System.out.println(sb1 == sb2); // true
System.out.println(sb1.charAt(0)); // 获取0号位上的字符 h
System.out.println(sb1.length()); // 获取字符串的有效长度14
System.out.println(sb1.capacity()); // 获取底层数组的总大小
sb1.setCharAt(0, 'H'); // 设置任意位置的字符 Hello world123
sb1.insert(0, "Hello world!!!"); // Hello world!!!Hello world123
System.out.println(sb1);
System.out.println(sb1.indexOf("Hello")); // 获取Hello第一次出现的位置
System.out.println(sb1.lastIndexOf("hello")); // 获取hello最后一次出现的位置
sb1.deleteCharAt(0); // 删除首字符
sb1.delete(0,5); // 删除[0, 5)范围内的字符
String str = sb1.substring(0, 5); // 截取[0, 5)区间中的字符以String的方式返回
System.out.println(str);
sb1.reverse(); // 字符串逆转
str = sb1.toString(); // 将StringBuffer以String的方式返回
System.out.println(str);
}
  • 从上述例子可以看出:String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。
    • 频繁修改字符串的情况考虑使用StringBuilder。
    • 注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采用如下原则:
      • String变为StringBuilder: 利用StringBuilder的构造方法或append()方法
      • StringBuilder变为String: 调用toString()方法。

](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)
](https://img-home.csdnimg.cn/images/20220524100510.png#pic_center)

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

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

相关文章

基于Spring Boot的校园部门资料管理系统

一、系统背景与目的 随着信息技术的飞速发展&#xff0c;校园信息化建设成为必然趋势。学校各部门在日常工作中积累了大量的资料&#xff0c;包括教学资料、学生档案、科研成果、行政文件等。传统的纸质资料管理方式存在效率低、易丢失、难以检索等问题&#xff0c;无法满足现…

STL 剖析

STL 六大组件 「STL 六大组件的交互关系」 Container 通过 Allocator 取得数据储存空间Algorithm 通过 Iterator 存取 Container 内容Functor 可以协助 Algorithm 完成不同的策略变化Adapter 可以修饰或套接 Functor、Iterator 配置器(allocator) 配置器&#xff1a;负责空间…

企业网络构建:如何满足业务需求与提升效率

企业组网指通过网络将企业内部的各种设备&#xff08;如电脑、打印机和服务器等&#xff09;连接起来&#xff0c;实现资源共享、信息交流与协同办公的过程。要打造一个高效的企业网络&#xff0c;需要从安全性、可靠性、稳定性和性能等多个方面进行综合考虑。以下内容将详细解…

升级thinkphp8最新版本,升级后发现版本不变

升级thinkphp8.0.3最新版本8.1.1&#xff0c;升级后发现版本不变&#xff0c; 更新TP有两个方法 1 全部更新(所有插件都一起更新) composer update 2 只更新TP框架核心 composer update topthink/framework 造成可能有两个原因&#xff0c;一是缓存问题&#xff0c;二是更新…

Cesium进阶教程——自定义图形、外观、绘图基础、现有着色器移植至Cesium、ShadowMapping、视频GIS、模型压平、卷帘

基础必看 WEBGL基础&#xff08;从渲染管线角度解读&#xff09; 参考路线 http://www.xt3d.online/tutorial/further/article.html 自定义图形 https://blog.csdn.net/m0_55049655/article/details/138908327 https://blog.csdn.net/m0_55049655/article/details/140306837 …

理解数据结构 hashtable的简易理解思路

结构图 为了方便演示&#xff0c;下图中分区算法为下标取模 private int hashFun(int id) {//使用 hash并取模return id % size;}Hashtable的结构如图所示&#xff1a;是一个数组&#xff08;元素为各个链表的表头&#xff09; 多个链表组成&#xff0c;也就是说 hashtable 结…

【YashanDB知识库】kettle同步PG至崖山提示no encryption pg_hba.conf记录

【问题分类】数据导入导出 【关键字】数据同步&#xff0c;kettle&#xff0c;数据迁移&#xff0c;pg_hba.conf 【问题描述】使用kettle同步postgresql至崖山数据库时提示以下报错信息&#xff1a; 【问题原因分析】pg_hba.conf 文件中没有正确配置允许从 IP 地址 连接到数…

记录2024-leetcode-字符串DP

10. 正则表达式匹配 - 力扣&#xff08;LeetCode&#xff09;

UE5制作伤害浮动数字

效果演示&#xff1a; 首先创建一个控件UI 添加画布和文本 文本设置样式 添加伤害浮动动画&#xff0c;根据自己喜好调整&#xff0c;我设置了缩放和不透明度 添加绑定 转到事件图表&#xff0c;事件构造设置动画 创建actor蓝图类 添加widget 获取位置 设置位移 创建一个被击中…

【USB-HID】“自动化键盘“

这里写目录标题 【USB-HID】"自动化键盘"1. 前言2. 框架3. 实现3.1 模拟键盘按键输入 【USB-HID】“自动化键盘” 1. 前言 最近从朋友那了解了一种"自动化键盘"&#xff0c;能够通过上位机录制按键脚本&#xff0c;然后执行脚本&#xff0c;实现物理键盘…

STM32F407ZGT6-UCOSIII笔记4:时间片轮转调度

本文学习与程序编写基于 正点原子的 STM32F1 UCOS开发手册 编写熟悉一下 UCOSIII系统的 时间片轮转调度 文章提供测试代码讲解、完整工程下载、测试效果图 目录 解决上文的卡系统问题&#xff1a; 使能时间片轮转调度&#xff1a; 任务初始化定义更改&#xff1a; 文件结构…

【Flask+OpenAI】利用Flask+OpenAI Key实现GPT4-智能AI对话接口demo - 从0到1手把手全教程(附源码)

文章目录 前言环境准备安装必要的库 生成OpenAI API代码实现详解导入必要的模块创建Flask应用实例配置OpenAI API完整代码如下&#xff08;demo源码&#xff09;代码解析 利用Postman调用接口 了解更多AI内容结尾 前言 Flask作为一个轻量级的Python Web框架&#xff0c;凭借其…

搭建springmvc项目

什么是springmvc MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 View视图 Controller控制层 springmvc框架是spring框架的一个分支。它是按照mvc架构思想设计的一款框架。 springmvc的主要作用: 接收浏览器的请求数据&#xff0c;对数据进行处理&#xff0c;…

Three.js相机Camera控件知识梳理

原文&#xff1a;https://juejin.cn/post/7231089453695238204?searchId20241217193043D32C9115C2057FE3AD64 1. 相机类型 Three.js 主要提供了两种类型的相机&#xff1a;正交相机&#xff08;OrthographicCamera&#xff09;和透视相机&#xff08;PerspectiveCamera&…

为“行车大脑”降温:Simdroid-EC助力汽车ECU设计研发

ECU&#xff08;Electronic Control Unit&#xff0c;电子控制单元&#xff09;被誉为汽车的行车大脑&#xff0c;在工作时会产生大量的热量&#xff0c;而其散热存在以下难题&#xff1a;一是工作环境恶劣&#xff0c;ECU常处于高温环境中&#xff1b;二是ECU所处的空间较为狭…

改进系列(6):基于DenseNet网络添加TripletAttention注意力层实现的番茄病害图像分类

目录 1. DenseNet 介绍 2. TripletAttention 3. DenseNet TripletAttention 4. 番茄场景病害病虫识别 4.1 数据集情况 4.2 训练 4.3 训练结果 4.4 推理 1. DenseNet 介绍 DenseNet是一种深度学习架构&#xff0c;卷积神经网络&#xff08;CNN&#xff09;的一种变体&…

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库

Ubuntu 20.04LTS 系统离线安装5.7.44mysql数据库 环境下载 MySQL 5.7.44 包安装标题检查服务是否启动成功遇到的问题登陆&修改密码&远程访问 环境 操作系统&#xff1a;Ubuntu 20.04.4 LTS 数据库&#xff1a;MySQL 5.7.34 内核版本&#xff1a;x86_64&#xff08;amd…

0基础学前端-----CSS DAY6

0基础学前端-----CSS DAY6 视频参考&#xff1a;B站Pink老师 今天是CSS学习的第六天&#xff0c;今天开始的笔记对应Pink老师课程中的CSS第三天的内容。 本节重点&#xff1a;CSS的三大特性以及CSS的盒子模型。 1.CSS的三大特性 CSS有三个重要特性&#xff1a;层叠性、继承性…

手写Redis分布式锁+RedisUtil二次封装

文章目录 1.手写Redis分布式锁1.RedisShareLockUtil2.使用方式 2.RedisUtil二次封装1.RedisUtil2.使用案例 1.手写Redis分布式锁 1.RedisShareLockUtil package com.sunxiansheng.redis.util;import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springfra…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 国际站点 GitHub: https://github.com/chenchuhan 国内站点 Gitee : https://gitee.com/chuck_chee 姊妹篇: Qt WORD/PDF&#x…