java String类 万字详解(通俗易懂)

news2024/9/20 14:35:42

目录

一、前言

二、介绍和溯源

三、String类常用构造器

        1.String()

        2.String(byte[] bytes)

        3.String(char[] value)

        4.String(char[] value, int offset, int count)

        5.String(String original)

        Δ演示 : 

四、不同方式创建String类对象的区别

        1.直接赋值的方式

        2.常规new的方式

        3.内容延申

五、String类常用成员方法

        0.前言 : 

        1.判断功能的方法 :

            ①boolean equals(Object anObject) 

            ②boolean equalsIngoreCase(String anotherString) 

            ③boolean startWith(String prefix) 

            ④boolean isEmpty() 

            演示 : 

        2.获取功能的方法 :

            ①int length() 

            ②char charAt(int index) 

            ③int indexOf(String str) 

            ④int indexOf(String str, int t) 

            ⑤int lastIndexOf(String str)

            ⑥int compareTo(String anotherString)

            ⑦String substring(int beginIndex) 

            ⑧String substring(int beginIndex, int endIndex) 

            演示 : 

        3.转换功能的方法 :

            ①byte[] getByte() 

            ②char[] toCharArray()

            ③static String valueOf(...)

            ④String replace(String old, String new)

            ⑤String[] split(String regex)

            ⑥String trim()

            ⑦String concat(String str)

            ⑧String toUpperCase()

            ⑨String toLowerCase()

            ⑩static String format(String format, Object... args)

            演示 : 

六、String类总结


一、前言

        本节内容是我们《API-常用类》专题的第二小节了。本节内容主要讲String类, 内容包括但不限于 String介绍和溯源String类的类图 String类的构造器不同方式创建String类对象的区别,以及 String类常用方法的演示。up希望通过这篇博文的知识分享,能够帮助大家快速上手并理解java String类。 注意 : 代码中的注释也很重要; 不要眼高手低,自己敲一遍才能知道怎么用。 点击侧边栏目录或者文章开头的目录可以跳转。良工不示人以朴,所有文章都会适时改进。大家如果有什么问题,都可以在评论区一块儿交流,或者私信up。  感谢阅读!

二、介绍和溯源

        字符串是一组用双引号括起来的字符序列,eg : "CSDN","Cyan","RA9"等等。每一个字符串对象都是常量。字符串中的字符使用unicode编码,一个字符(不区分中英文)均占两个字节。java中用String类描述字符串,如下图所示 : 

        可以看到,String类用final关键字修饰,因此String类是不可被其他类继承的;并且,通过String类中的属性value及其源码描述,我们可以得知String类的底层实际仍是字符数组byte[]。也就是说,new出的String对象在堆空间中,该对象的空间里有value属性,用于存放字符串的内容(实际是指向常量池的地址)。同时,该value数组也使用了final关键字修饰,我们在面向对象专题详解过final关键字,当final关键字修饰引用类型时,不可更改其引用的指向,即不能更改其保存的地址值

        接下来我们再来看看String类的“家庭关系图”。首先,String类属于java.base模块,java.lang包下,并且实现了Serializable,Comparable等接口。如下图所示 : 

        我们再来看看String类的类图,如下

        可以看到,String类除了继承自Object类之外,还实现了许多接口。这么多接口中,大家只需要记住关键的两个接口——Serializable接口,实现该接口使得String类型可串行化,串行化后,String类型可以进行网络传输。Comparable接口,实现该接口使得String类型可以进行“比较”的操作。


三、String类常用构造器

        String类的构造器非常多,如下图所示 : 

         有些还是过时的。当然,我们就挑几个重点的,常见的构造器给大家演示一下即可。

        1.String()

                该构造器可以初始化一个String对象,使其指向一个空字符序列

        2.String(byte[] bytes)

                该构造器可以初始化一个String对象,并将指定字节数组中的数据转化成字符串

        3.String(char[] value)

                该构造器可以初始化一个String对象,并将指定字符数组中的数据转化成字符串

        4.String(char[] value, int offset, int count)

                该构造器可以初始化一个String对象,并将指定字符数组中的指定数据转化成字符串 

        5.String(String original)

                该构造器可以初始化一个String对象,使该对象实际指向的字符串常量与传入的字符串形参相同,相当于是形参的一份拷贝 

        Δ演示

                以String_Constructors为演示类,代码如下

package csdn.knowledge.api.string;

public class String_Constructors {
    public static void main(String[] args) {
    //演示 : String类的常用构造器
        //1 —— String()
        String str_0 = new String();
        System.out.println(str_0);
        System.out.println("--------------------");

        //2 —— String(byte[] bytes)
        byte[] bytes = {65, 66, 67, 68};   //65~68对应ASCII码表A~D
        String str_1 = new String(bytes);
        System.out.println(str_1);
        System.out.println("--------------------");

        //3 —— String(char[] value)
        char[] value = {'C', 'y', 'a', 'n', '_', 'R', 'A', '9'};
        String str_2 = new String(value);
        System.out.println(str_2);
        System.out.println("--------------------");

        //4 —— String(char[] value, int offset, int count)
        String str_3 = new String(value, 0, 4);
        System.out.println(str_3);
        System.out.println("--------------------");

        //5 —— String(String original)
        String str_4 = new String("CSDN yyds!");
        System.out.println(str_4);
    }
}

                运行结果 : 


四、不同方式创建String类对象的区别

        1.直接赋值的方式

                String类在实际开发中的使用场景非常多,java在底层提供了针对String类的优化,即可以不通过构造器来创建String对象。而是直接赋值一个字符串。
                eg : String str_0 = "Cyan"; 使用这种方式来创建String对象,jvm会先从常量池中查看是否有"Cyan"字符串的数据空间,若有,令引用变量直接指向该空间;若无,重写创建"Cyan"的数据空间并令其引用变量指向它。因此,str_0引用最终直接指向的是常量池中"Cyan"常量的空间地址

                内存图如下所示 : 

        2.常规new的方式

                eg : String str_1 = new String("Cyan"); 使用这种方式来创建String对象,jvm会先在堆空间中给String对象开辟空间,这片空间中维护了value数组这一属性,该属性指向常量池的"Cyan"数据空间。若常量池中没有"Cyan",则重写创建"Cyan"数据空间,并让value引用指向该数据空间。最后,将该对象堆空间的地址值返回给str_1引用。因此,str_1引用最终直接指向的是堆中的空间地址

                内存图如下所示 : 

        3.内容延申

                若使用字符串拼接的方式来创建字符串对象,如下 : 
                eg : String str_0 = "Cyan" + "RA9"; 
                当我们以两个字符串拼接的形式来创建字符串对象时,jvm不会在常量池中分别创建"Cyan"字符串常量和"RA9"字符串常量,再把它们拼接起来。而是直接在底层优化,先把两个字符串拼接起来,之后直接去常量池中寻找有没有拼接起来的这个字符串常量,如果有,直接令该引用指向这个字符串常量的空间地址;如果没有则先创建该字符串常量,再让引用指向这里。当然,我们已经学过了Debug,此时我们就可以直接通过Debug来验证我们的结论,如下图所示 : 


五、String类常用成员方法

        0.前言 : 

                在IDEA类图中我们可以查看String类中的方法,如下GIF图所示 : 

                😂可以看到,String类中的方法真是多得⑧彳亍!不过你放心,up从这些方法中挑选了一些我们经常用到的方法,并根据它们的功能将其分为了“判断功能”,“获取功能”,以及“转化功能”三部分。如此一来,大家就可以放心食用🌶!

        1.判断功能的方法 :

            ①boolean equals(Object anObject) 

                该方法可以判断当前字符串与指定对象的内容是否相同,实际在底层比较的就是字符串的内容,会区分大小写

            ②boolean equalsIngoreCase(String anotherString) 

                该方法可以判断当前字符串与给定字符串的内容是否相同,不区分大小写

            ③boolean startWith(String prefix) 

                该方法可以判断当前字符串是否以给定字符串开头

            ④boolean isEmpty() 

                该方法可以判断当前字符串是否为空

            演示 : 

                以String_methods类为演示类,代码如下

package csdn.knowledge.api.string;

public class String_methods {
    public static void main(String[] args) {
    //演示 : String常用方法之判断功能的方法
        //1 —— boolean equals(Object anObject)
            String str_0 = "cyan";
            System.out.println("\"Cyan\"字符串与str_0字符串的内容相等吗?" + "Cyan".equals(str_0));
            System.out.println("================");

        //2 —— boolean equalsIgnoreCase(String anotherString)
            System.out.println("\"Cyan\"字符串与str_0字符串的内容相等吗?" + "Cyan".equalsIgnoreCase(str_0));
            System.out.println("================");

        //3 —— boolean startWith(String prefix)
            System.out.println("str_0字符串是否以\"cy\"开头?" + str_0.startsWith("cy"));
            System.out.println("str_0字符串是否以\"Cy\"开头?" + str_0.startsWith("Cy"));
            System.out.println("================");

        //4 —— boolean isEmpty()
            System.out.println("str_0字符串是否为空?" + str_0.isEmpty());
    }
}

                运行结果 : 

        2.获取功能的方法 :

            ①int length() 

                获取当前字符串的长度。

            ②char charAt(int index) 

                获取指定位置索引的字符(指字符串的指定索引)。

            ③int indexOf(String str) 

                获取指定字符(串) 第一次出现的索引,默认从第0位开始。若返回-1,则表示没有该字符(串)。

            ④int indexOf(String str, int t) 

                功能与上一次方法相同,但默认从字符串索引第 t 位开始找

            ⑤int lastIndexOf(String str)

                获取指定字符(串)最后一次出现的索引,若没有,返回-1

            ⑥int compareTo(String anotherString)

                返回两个字符串对象的比较结果——若相等,返回0;若不相等,从两个字符串的第一个字符开始比较,返回第一个不相等的字符的ASCII码差值。当较长字符串的前面部分恰巧是较短的字符串时,返回两个字符串的长度差。

            ⑦String substring(int beginIndex) 

                获取指定索引位置(包含该位置) 之后的字符串。

            ⑧String substring(int beginIndex, int endIndex) 

                获取从索引beginIndex开始,到索引endIndex之间的字符串(区间为前闭后开)。

            演示 : 

                以String_methods_2类为演示类,代码如下

package csdn.knowledge.api.string;

public class String_methods_2 {
    public static void main(String[] args) {
    //演示 : String常用方法之获取功能的方法
        //1 —— int length()
            String str_0 = "We are the best.";
            System.out.println("当前字符串str_0 : " + str_0);
            int length = str_0.length();
            System.out.println("str_0字符串的长度为:" + length);
            System.out.println("========================");

        //2 —— char charAt(int index)
            char ch_0 = str_0.charAt(0);
            char ch_1 = str_0.charAt(5);
            System.out.println("str_0字符串中,索引为0的字符是:" + ch_0);
            System.out.println("str_0字符串中,索引为5的字符是:" + ch_1);
            System.out.println("========================");

        //3 —— int indexOf(String str)
            int i_0 = str_0.indexOf('e');
            System.out.println("字符\'e\'在字符串str_0中首次出现时的索引为:" + i_0);
            int i_2 = str_0.indexOf("are");
            System.out.println("字符串\"are\"在字符串str_0中首次出现时的索引为:" + i_2);
            System.out.println("========================");

        //4 —— int indexOf(String str, int t)
            int i_1 = str_0.indexOf('e', 7);
            System.out.println("从字符串str_0索引为7的地方开始找,字符\'e\'在字符串str_0中首次出现时的索引为:" + i_1);
            System.out.println("========================");

        //5 —— int lastIndexOf(String str)
            int i_3 = str_0.lastIndexOf('t');
            System.out.println("字符\'t\'在字符串str_0中最后一次出现时的索引为:" + i_3);
            System.out.println("========================");

        //6 —— int compareTo(String anotherString)
                //第一种情况 : 俩字符串相同
            int i_4 = str_0.compareTo("We are the best.");
            System.out.println("compareTo方法返回0说明俩字符串相等: " + i_4);
                //第二种情况 : 俩字符串长度相同,内容不同
            int i_5 = str_0.compareTo("You are so good.");  //W : 77, Y : 79.
            System.out.println("\'W\'和\'Y\'的ASCII码差值为:" + i_5);
                //第三种情况 : 俩字符串长度不相同,但长的字符串的前一部分与短的字符串相同。
            int i_6 = str_0.compareTo("We are the best.we are the king!");
            int i_7 = "We are the best.we are the king!".compareTo(str_0);
            System.out.println("str_0字符串与传入字符串的长度差值为:" + i_6);
            System.out.println("传入字符串与str_0字符串的长度差值为:" + i_6);
            System.out.println("========================");

        //7 —— String substring(int beginIndex)
            String str_1 = str_0.substring(11); //"best."
            System.out.println("str_0字符串中,从索引11开始到结束的字符串为:" + str_1);
            System.out.println("========================");

        //8 —— String substring(int beginIndex, int endIndex)
            String str_2 = str_0.substring(7, 10);  //[7,10)——注意区间的格式。
            System.out.println("str_0字符串中,从索引7到10(不包括10)的字符串为:" + str_2);
    }
}

                运行结果 : 

        3.转换功能的方法 :

            ①byte[] getByte() 

                将字符串转换成字节数组。(ASCII码)。

            ②char[] toCharArray()

                将字符串转换成字符数组。

            ③static String valueOf(...)

                将指定类型数据转换成字符串。

            ④String replace(String old, String new)

                将指定字符(串)替换为新的字符(串)原字符串不受影响

            ⑤String[] split(String regex)

                以传入的字符(串)为标准来切割原字符串,返回切割后的字符串数据,以String类型的数组作为接收。原字符串不受影响

            ⑥String trim()

                去掉字符串两端的空白字符。(eg : 对登录账号和密码的处理)。

            ⑦String concat(String str)

                将传入的字符串拼接到当前字符串的末尾。

            ⑧String toUpperCase()

                将当前字符串全部转换成大写后返回。

            ⑨String toLowerCase()

                将当前字符串全部转换成小写后返回。

            ⑩static String format(String format, Object... args)

                将指定参数以指定的输出控制格式来输出。形参“String format部分”即输出格式控制,是包含占位符的String类型。形参“Object... args”部分即要输出的参数。占位符由后面的参数按照顺序来一一替换。
                至于什么是占位符,比如 : "%s", "%d", "%f"这些,就是C语言中的printf语句用的那几个,这里不再赘述。

            演示 : 

                以String_methods_3类为演示类,代码如下

package csdn.knowledge.api.string;

public class String_methods_3 {
    public static void main(String[] args) {
    //演示 : String常用方法之转换功能的方法
        //1 —— byte[] getByte()
            String str_0 = "ABCD";  //A~D对应ASCII码值 = 65~68
            byte[] bytes = str_0.getBytes();
            for (int i = 0; i < bytes.length; i++) {
                System.out.println("字节数组的第" + (i + 1) + "个元素 = " + bytes[i]);
            }
            System.out.println("-----------------------");

        //2 —— char[] toCharArray()
            char[] chars = str_0.toCharArray();
            for (int i = 0; i < chars.length; i++) {
                System.out.println("字符数组的第" + (i + 1) + "个元素 = " + chars[i]);
            }
            System.out.println("-----------------------");

        //3 —— static String valueOf(...)
            String str_1 = String.valueOf(1111);
            String str_2 = String.valueOf('h');
            String str_3 = String.valueOf(123.6666);
            System.out.println("int类型转String类型:" + str_1);
            System.out.println("char类型转String类型:" + str_2);
            System.out.println("double类型转String类型:" + str_3);
            System.out.println("-----------------------");

        //4 —— String replace(String old, String new)
            String str_4 = "You_are_so_beautiful!";
            String str_5 = str_4.replace('_', ' ');    //以' '替换掉'_'
            System.out.println("原字符串:" + str_4);
            System.out.println("新字符串:" + str_5);
            System.out.println("-----------------------");

        //5 —— String[] split(String regex)
            String str_6 = "What hahaa hahacoincidence haha!";
            String[] strings = str_6.split("haha");     //以"haha"来切割字符串。
            for (String string : strings) {
                System.out.print(string);
            }
            System.out.println("\n-----------------------");

        //6 —— String trim()
            String str_7 = "      hey,man!    ";
            String str_8 = str_7.trim();
            System.out.println("去掉两端空白字符前的字符串:" + str_7);
            System.out.println("去掉两端空白字符后的字符串:" + str_8);
            System.out.println("-----------------------");

        //7 —— String concat(String str)
            String str_9 = "I ";
            String str_10 = str_9.concat("love ").concat("programming!");
            System.out.println("拼接后的字符串str_10 = " + str_10);
            System.out.println("-----------------------");

        //8 —— String toUpperCase()
            String str_11 = "i love you!";
            System.out.println("大写之前的字符串:" + str_11);
            System.out.println("大写之后的字符串:" + str_11.toUpperCase());
            System.out.println("-----------------------");

        //9 —— String toLowerCase()
            System.out.println("小写之前的字符串:" + str_11.toUpperCase());
            System.out.println("小写之后的字符串:" + str_11.toUpperCase().toLowerCase());
            System.out.println("-----------------------");

        //10 —— static String format(String format, Object... args)
            String name = "Cyan";
            int age = 21;
            String hobby = "programming!";
            String sss = String.format("My name is %s, and I'm %d years old, my hobby is %s", name, age, hobby);
            System.out.println(sss);
    }
}

                运行结果 : 


六、String类总结

        🆗,以上就是关于String类的全部内容了。希望这篇博文的内容分享,可以帮助大家对String类有进一步的认识。同时,关于String类的常用方法,up都做了较为详细的演示和批注,大家可以多回来看看😆。API专题的下一小节,我们来讲讲常用类StringBuilder和StringBuffer类,不见不散。感谢阅读!

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

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

相关文章

炫云渲染质量功能测试

炫云已经支持优化渲染质量&#xff0c;分别是保守优化、中度优化和深度优化&#xff0c;使用后效果图的渲染时间会有所缩短&#xff0c;尤其对低版本V-Ray和参数设置不当的场景非常有效&#xff0c;能大幅提升渲染速度及节省渲染费用&#xff0c;当然最终效果图有可能有稍许差异…

spark兼容性验证

前言 Apache Spark是专门为大规模数据处理而设计的快速通用的计算引擎&#xff0c;Spark拥有Hadoop MapReduce所具有的优点&#xff0c;但不同于Mapreduce的是Job中间输出结果可以保存在内存中&#xff0c;从而不再需要读写HDFS&#xff0c;因此Spark能更好的适用于数据挖掘与…

二分与三分(备赛中)

A.愤怒的牛儿 思路&#xff1a;找出最长距离&#xff0c;与最小距离&#xff0c;用二分法判断&#xff0c;如果当前距离满足放牛要求&#xff0c;就把距离区间lmid1;如果距离不合适就说明当前距离太大了&#xff0c;把区间变小rmid-1;最后直到l<r不满足时退出&#xff0c;输…

Spark SQL优化机制

Spark SQL优化机制Spark SQLCatalyst 优化器逻辑优化物理优化TungstenUnsafe RowWSCGRDD 缺点 : RDD的算子都是高阶函数 &#xff0c;Spark Core 不知函数内的操作&#xff0c;只能闭包形式发给 Executors&#xff0c; 无法优化 DataFrame 不同点&#xff1a; 数据的表示形式…

AQS底层源码深度剖析-Lock锁

目录 AQS底层源码深度剖析-Lock锁 ReentrantLock底层原理 为什么把获取锁失败的线程加入到阻塞队列中&#xff0c;而不是采取其它方法&#xff1f; 总结&#xff1a;三大核心原理 CAS是啥&#xff1f; 代码模拟一个CAS&#xff1a; 公平锁与非公平锁 可重入锁的应用场景&…

C语言-基础了解-25-C强制类型转换

C强制类型转换 一、强制类型转换 强制类型转换是把变量从一种类型转换为另一种数据类型。例如&#xff0c;如果您想存储一个 long 类型的值到一个简单的整型中&#xff0c;您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为…

【深度学习】BERT变体—ALBERT

ALBERT的初衷是想解决BERT中参数量过多的问题&#xff0c;论文全称为&#xff1a;ALBERT: A Lite BERT for Self-supervised Learning of Language Representations。 相较于BERT&#xff0c;ALBERT模型减少BERT模型的参数量&#xff1b;预训练中的Next Sentence Prediction&a…

【面试系列】线程相关的面试题集锦

线程的状态 public enum State {/*** Thread state for a thread which has not yet started.*/NEW,/*** Thread state for a runnable thread. A thread in the runnable* state is executing in the Java virtual machine but it may* be waiting for other resources from …

最简单的线性回归模型-标量

首先考虑yyy为标量&#xff0c;www为标量的情况&#xff0c;那么我们的线性函数为ywxbywxbywxb。每批输入的量batch size 为111&#xff0c;每批输入的xxx为一个标量&#xff0c;设为x∗x^*x∗&#xff0c;标签yyy同样为一个标量&#xff0c;设为y∗y^*y∗。因此每批训练的损失…

直线模组的优势是什么?

直线模组是可以模拟人工操作的一些功能&#xff0c;通过固定程序来进行抓取&#xff0c;搬运、操作工具&#xff0c;实现自动变速&#xff0c;这也是为何直线模组使用率高的主要原因了&#xff0c;那么直线模组究竟有着怎样的优势呢&#xff1f; 1、整体结构紧凑&#xff0c;重…

k8s-Kubernetes集群部署

文章目录前言一、Kubernetes简介与架构1.Kubernetes简介2.kubernetes设计架构二、Kubernetes集群部署1.集群环境初始化2.所有节点安装kubeadm3.拉取集群所需镜像3.集群初始化4.安装flannel网络插件5.扩容节点6.设置kubectl命令补齐前言 一、Kubernetes简介与架构 1.Kubernetes…

Spark 磁盘作用

Spark 磁盘作用磁盘作用性能价值失败重试ReuseExchangeSpark 导航 磁盘作用 临时文件、中间文件、缓存数据&#xff0c;都会存储到 spark.local.dir 中 在 Shuffle Map 时&#xff0c; 当内存空间不足&#xff0c;就会溢出临时文件存储到磁盘上溢出的临时文件一起做归并计算…

Vue3---语法初探

目录 hello world 实现简易计时显示 反转字符串 显示隐藏 了解循环 了解双向绑定实现简易记事 设置鼠标悬停的文本 组件概念初探&#xff0c;进行组件代码拆分 hello world 最原始形态&#xff0c;找到 id 为 root 的标签&#xff0c;将 Vue 实例的模板放入标签之内 …

剑指 Offer 09. 用两个栈实现队列(java)

用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;deleteHead 操作返回 -1 ) 示例 1&#xff1a; 输入&#xff1a; [“CQu…

SpringBoot中一行代码解决字符串向枚举类型转换的问题

1. 场景 在WEB开发&#xff0c;客户端和服务端传输的数据中经常包含一些这样的字段&#xff1a;字段的值只包括几个固定的字符串。 这样的字段意味着我们需要在数据传输对象&#xff08;Data Transfer Object, DTO&#xff09;中对该字段进行校验以避免客户端传输的非法数据持…

Android Service知识

一. 概览 Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动&#xff0c;而且即使用户切换到其他应用&#xff0c;服务仍将在后台继续运行。此外&#xff0c;组件可通过绑定到服务与之进行交互&#xff0c;甚至是执行进程间通信 (IPC…

你是真的“C”——为冒泡排序升级赋能!

你是真的“C”——为冒泡排序升级赋能&#xff01;&#x1f60e;前言&#x1f64c;冒泡排序升级赋能之境界一&#xff01;冒泡排序升级赋能之境界二&#xff01;qsort库函数的运用和认识总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的…

【CDP】更改solr 存储路径导致ranger-audit 大量报错问题解决

前言 我们生产上公司是使用的CDP集群&#xff0c;一次管理员通知&#xff0c;Solr 组件的数据存放路径磁盘空间不够。 我们的solr 组件时为 Ranger 服务提供日志审计功能&#xff0c; 在我们更改了磁盘路径&#xff0c;并重启了Solr 组件&#xff0c;然后发现相关组件&#…

基于Python的selenium

一、安装 1.1安装Python&#xff0c;安装Python时需要勾选增加环境变量 如果之前已经安装过Python&#xff0c;需要将Python相关文件以及环境变量删除 1.2安装成功&#xff1a;在命令行界面下输入Python&#xff0c;最终展示>>>即可成功 2.1安装pycharm,直接自定义安装…

论文阅读-(GLIP)Grounded Language-Image Pre-training (目标检测+定位)

Paper&#xff1a;Grounded Language-Image Pre-training Code&#xff1a;https://github.com/microsoft/GLIP 简介&#xff1a; 定位任务与图像检测任务非常类似&#xff0c;都是去图中找目标物体的位置&#xff0c;目标检测为给出一张图片找出bounding box&#xff0c;定位…