JavaSE学习值之--String类

news2024/11/19 14:50:27

 

  💕"不要同情自己,同情自己是卑劣懦夫的勾当!"💕

作者:Mylvzi 

 文章主要内容:JavaSE学习值之--String类 

目录

前言:

一.String类

1.String类的属性

2.字符串的构造

注意:

1.String类有求字符串长度的方法通过:str.length()   

2.isEmpty方法用于判断字符串的长度是否为0

3.被" "引起来的就是字符串,可直接调用方法 

3.String类对象的比较

1.==判断是否是同一引用(地址相同)

2.equals 方法

3.compareTo以及他的接口

4. 字符串查找

1.charAt方法--》返回对应索引上的字符

2.indexOf方法,lastIndexOf 方法--》不止一个,有多个,构成了方法的重载

1.单个字符(从前往后找)

 2.查找子字符串(从前往后找)

5.字符串的转化

1.数值和字符串之间的转化

2.大小写互换--》toUpperCase  toLowerCase

3.. 字符串转数组 

4. 格式化(以特定的格式输出字符串)

6.字符串替换

7.字符串的拆分

1.split方法--》返回值是String[],所以要用字符串数组接收

2.特殊字符的拆分

1.拆分IP地址

2.多次分割(开发常用)

7.字符串截取

8.其他操作方法

1.trim方法:

8.字符串的不可变性

1.这张图能反应很多信息:

2.所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

二.StringBuilder和StringBuffer的介绍

一.StringBuilder

常见方法总结:

1.append--》字符串追加

2.setCharAt(int index, char ch)-->将index位置的字符重置为ch

3.insert(int offset, String str) -->在offset位置插入:八种基类类型 & String类型 & Object类型数据

 4.deleteCharAt(int index)--》删除index位置字符 

5.replace(int start, int end, String str)--》将指定区间的字符串设置为str

6.StringBuffer reverse()-->倒置字符串

7.toString方法-->以字符串(String)类型返回


 

前言:

  在C语言中我们已经接触过字符串,在C语言中不存在字符串类型,存储字符串往往是通过字符数组或字符指针,同时C语言的库中也提供了很多与字符串有关的函数,如strcpy,strcat,strstr等等,但是这种将数据和操作方法分割的做法不符合面向对象编程的思想,所以在Java中提供了字符串类型--》String

  String类本质上是class,含有属性和方法,方法之中存放了大量且实用的与字符串有关的方法

下面就为大家详细讲解String类

一.String类

1.String类的属性

注意:Java中的字符串区别于C语言,并不存在“字符串以\0结尾”这种说法 

2.字符串的构造

  下面介绍常见的三种字符串构造方法:

        /**
         * 字符串构造
         */

        // 1.直接构造
        String str1 = "hello";
        System.out.println(str1);

        // 2.实例化一个String类对象
        String str2 = new String("hello");
        System.out.println(str2);

        // 3.通过字符数组的转化
        char[] arr = {'h','e','l','l','o'};
        String str3 = new String(arr);
        System.out.println(str3);

注意Java中String类是一种引用数据类型,存放的引用对象的地址,而不存储对象本身

        // String类是一种引用类型,存储的是对象的地址
        // s1和s2引用的是不同对象 s1和s3引用的是同一对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        System.out.println(s1.length()); // 获取字符串长度---输出5
        System.out.println(s1.isEmpty()); // 如果字符串长度为0,返回true,否则返回false

注意:

1.String类有求字符串长度的方法通过:str.length()   

 STtring类里面的length是一种方法,数组里面的是一种属性,方法有一个();

2.isEmpty方法用于判断字符串的长度是否为0

注意isEmpty判断的是字符串的长度,如果字符串是null,此时代表空引用,编译器会报错 

        String s1 = "";
        System.out.println(s1.length());// 输出0
        String s2 = null;
        System.out.println(s2.length());// 报错

3.被" "引起来的就是字符串,可直接调用方法 

        System.out.println("hello".length());// 输出5

3.String类对象的比较

1.==判断是否是同一引用(地址相同)

== 

左右两边都是基本数据类型,比较的是值的大小,根据值是否相等返回false/true

左右两边都是引用数据类型,比较的是引用对象的地址是否相同,也就是是否是同一引用

        // String类是一种引用类型,存储的是对象的地址
        // s1和s2引用的是不同对象 s1和s3引用的是同一对象
        String s1 = new String("hello");
        String s2 = new String("world");
        String s3 = s1;
        System.out.println(s1 == s2);// false
        System.out.println(s2 == s3);// false
        System.out.println(s1 == s3);// true

来看一种特殊情况:

  当我们直接引用字符串”hello“ 时,str1和str2却相等了?这是为什么?引用类型比较的不是地址吗?是的,比较的是地址。但对于"hello"这样的字符串来说,他是存储在堆区之中的”常量池“上,地址是固定的。也就是说,当第一次使用hello给str1赋值后,常量区上就已经存放了hello这个字符串,再次赋值是会先从常量池中的"hello"获取,获取的和str1是一样的"hello"(地址和值都是一样的)

2.equals 方法

  ==只能用来比较两个引用对象的地址是否相同,而大多数情况下我们是通过引用类型的内容来判断是否相等的,对于String类来说也是这样的,我们要比较的是字符串的具体内容,而String类中有一个自带的比较内容的方法-->equals(本质还是继承于Object类的

)

        String str1 = "hello";
        String str2 = "hello";
        String str3 = "world";
        System.out.println(str1.equals(str2));// true
        System.out.println(str1.equals(str3));// false

总结:
  equals方法用来判断两个字符串的内容是否相同 

3.compareTo以及他的接口

再来看String类的定义:

可以看见String类实现了Comparable接口,所以就要重写接口中的compareTo方法

 

比较思路: 

如果两个字符串的长度不一样,先比较长度相同的部分,如果长度相同部分完全相同,则直接返回长度的差值(共同长度是最短字符串的长度) 

代码示例: 

        String str1 = "hello";
        String str2 = "hello";
        String str3 = "world";
        String str4 = "helloworld";

        System.out.println(str3.compareTo(str1));// 15
        System.out.println(str1.compareTo(str2));// 0
        System.out.println(str4.compareTo(str1));// 输出5
        System.out.println("====================");

        String str5 = "abc";
        String str6 = "acc";
        System.out.println(str5.compareTo(str6));// 输出-1
compareToIgnoreCase方法

  在一些情况下,我们认为大写和小写只是形式上的不同,内容却是相同的,比如"hello"=="HELLO",在不考虑大小写的情况下进行比较,就可以利用方法

compareToIgnoreCase
        String str1 = "hello";
        String str2 = "HELLO";
        String str3 = "HEllo";
        System.out.println(str1.compareToIgnoreCase(str2));// 0
        System.out.println(str1.compareToIgnoreCase(str3));// 0

总结:
1.compareTo方法返回的Int类型的数据,本质上是对应字符串在字典上的顺序(字典中,前面的字母是小的,后面的字母大,小写比所有大写大) 

2.忽略大小写带来的形式上的不同,我们可以利用compareToIgnoreCase方法

3.自定义类型一定要重写equals方法和hashcode方法,因为你的逻辑是根据自定义类型的内容进行比较的

4. 字符串查找

  字符串查找也是字符串中非常常见的用法,String类中也提供了很多字符串查找的方法

1.charAt方法--》返回对应索引上的字符

        String str1 = "abcdef";
        System.out.println(str1.charAt(0));// 输出a
        System.out.println(str1.charAt(1));// 输出b
        System.out.println(str1.charAt(2));// 输出c
        System.out.println(str1.charAt(-1));// 异常
        System.out.println(str1.charAt(100));// 异常

2.indexOf方法,lastIndexOf 方法--》不止一个,有多个,构成了方法的重载

1.单个字符(从前往后找)
            String str1 = "abcdefghcde";
        System.out.println(str1.indexOf('a'));// 0
        System.out.println(str1.indexOf('b'));// 1
        System.out.println(str1.indexOf('c'));// 2
        System.out.println("==================");
        System.out.println("从指定index开始访问");
        System.out.println(str1.indexOf('c', 3));// 8  返回的是第二个c出现的位置
        System.out.println(str1.indexOf('a', 1));// -1  1代表从b开始,后面不含有a

        System.out.println("==================");
        System.out.println("从后往前找");
        System.out.println(str1.lastIndexOf('c'));// 8
        System.out.println(str1.lastIndexOf('e'));// 10
        System.out.println(str1.lastIndexOf('c', 4));// 2

 

注意:indexOf方法只返回第一次出现的下标(从左往右)

 2.查找子字符串(从前往后找)
        String str1 = "abcdefghcde";
        // 返回子字符串第一次出现位置的下标
        System.out.println(str1.indexOf("ab"));
        System.out.println(str1.indexOf("cd"));
        System.out.println(str1.indexOf("de"));
        System.out.println("===================");
        System.out.println("从指定索引位置之后返回子字符串出现的位置");
        System.out.println(str1.indexOf("cd", 4));// 8
        System.out.println(str1.indexOf("de",6));// 9
        System.out.println("===================");

        System.out.println("从后往前查找");
        /**
         * 注意返回都是第一个字符的下标
         */
        System.out.println(str1.lastIndexOf("cd"));// 8
        System.out.println(str1.lastIndexOf("de"));// 9
        System.out.println(str1.lastIndexOf("cd", 5));// 2

5.字符串的转化

1.数值和字符串之间的转化

class Student {
    String name;
    int age;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
}
public class Test1 {
    public static void main(String[] args) {
        /**
         * 其他类型转字符串(布尔类型和引用类型也能转化)
         * String.valueOf方法
         */
        String s1 = String.valueOf(1234);
        String s2 = String.valueOf(12.34);
        String s3 = String.valueOf(true);
        String s4 = String.valueOf(new Student("Hanmeimei", 18));
        System.out.println(s1);
        System.out.println(s2);
        System.out.println(s3);
        System.out.println(s4);
        System.out.println("=======================");
        /**
         * 字符串转其他类型
         * 通过其他类型的包装类中的parse方法
         */
        int a = Integer.parseInt("12345");
        double b = Double.parseDouble("12.20");
        boolean c = Boolean.parseBoolean("true");
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);

2.大小写互换--》toUpperCase  toLowerCase

        String str1 = "hello";
        String str2 = "WROLD";
        String str3 = "Hello";

        // 小写转大写
        System.out.println(str1.toUpperCase());
        // 大写转小写
        System.out.println(str2.toLowerCase());
        System.out.println(str3.toLowerCase());

3.. 字符串转数组 

        String str1 = "hello";
        char[] value = str1.toCharArray();
        for (int i = 0; i < value.length ; i++) {
            System.out.print(value[i] + " ");
        }

        System.out.println();
        System.out.println("====================");
        // 字符数组转字符串(字符串的构造)
        char[] value2 = {'h','e','l','l','o'};
        String str2 = new String(value2);
        System.out.println(str2);

 

4. 格式化(以特定的格式输出字符串)

        String s = String.format("%d-%d-%d", 2019, 9,14);
        System.out.println(s);// 输出2019-9-14

6.字符串替换

  用另一个字符串代替当前字符串中的某些内容

        String str1 = "hello world";
        // 单个字符替换
        System.out.println(str1.replace('o', 'x'));// hellx wxrld 两个o都被替换了
        // 字符串替换
        System.out.println(str1.replace("hello", "xxxxxxx"));
        // 替换首个位置
        // replaceFirst的参数只能是字符串
        System.out.println(str1.replaceFirst("o","x"));// hellx world  只替换第一个o
        // replaceAll 用于基于正则表达式的文本替换
        System.out.println(str1.replaceAll("o", "x"));


        // replace的返回值是一个新的字符串,不是对原字符串进行修改
        // java中字符串是常量,无法被修改
        String str2 = str1.replace('e','d');

7.字符串的拆分

1.split方法--》返回值是String[],所以要用字符串数组接收

        String str1 = "how are you man?";
        String[] value = str1.split(" ");
        for (String s:value) {
            System.out.println(s);
        }

        System.out.println("===================");
        // 就分两组
        String[] value2 = str1.split(" ",2);
        for (String s:value2) {
            System.out.println(s);
        }

  

2.特殊字符的拆分

  在使用split方法时,传递的参数是字符,但是有些字符本身就有特定的作用(+-*\等等),需要使用转义字符进行转义

1.拆分IP地址
        String str = "192.168.1.1" ;
        String[] result = str.split("\\.") ;
        for(String s: result) {
            System.out.println(s);
        }

1. 字符"|","*","+"都得加上转义字符,前面加上 "\\" .

2. 而如果是 "\" ,那么就得写成 "\\\\" .

3. 如果一个字符串中有多个分隔符,可以用"|"作为连字符 

        String str = "192\\168\\1\\1" ;// 在字符串中使用\需要先进行转义
        String[] result = str.split("\\\\") ;
        for(String s: result) {
            System.out.println(s);
}
2.多次分割(开发常用)

   在进行分割时,一个字符串内往往含有多个不同的符号,一次split只能以一个符号进行分割,如果想实现多次分割,可以利用嵌套的for循环进行多次分割

    public static void main(String[] args) {
        String str = "name=李四&age=17";
        String[] arr1 = str.split("&");
        for (int i = 0; i <arr1.length ; i++) {
            String[] tmp = arr1[i].split("=");
            System.out.println(tmp[0]+" = "+ tmp[1]);
            }
        }

7.字符串截取

从当前字符串某个索引位置处进行截取

        String str = "helloworld";
        System.out.println(str.substring(5));// 输出world
        System.out.println(str.substring(0, 5));// 输出hello java中的区间都是左闭右开的

注意事项:

1. 索引从0开始

2. 注意前闭后开区间的写法, substring(0, 5) 表示包含 0 号下标的字符, 不包含 5 号下标 

8.其他操作方法

1.trim方法:

代码示例: 

        String str = "            hello            world               !!!!!!!!!";
        System.out.println(str.trim());

注意:

1.trim方法只能去除字符串左右两边的空格,中间的空格无法删除

2.trim方法其实在搜索引擎中经常出现,比如你故意在搜索时在前面添加了一大堆的空格,而你在搜索的时候,浏览器会自动把字符前面的所有空格进行删除,这就是调用了trim方法

8.字符串的不可变性

  String类型的数据是一种不可改变的数据类型,来看她的定义

1.这张图能反应很多信息:

1.String类被final修饰,代表不能被其他类继承

2.字符串实际上是存储在Value数组之中的,value也是一种引用类型

3.value数组被private修饰,代表无法在类外使用该数组,也就证明该数组的内容无法改变,也就是字符串的内容无法改变

一个误区:

  很多人说String类无法改变是因为value数组被final修饰,这是错误的,因为value数组被final修饰,只能说明value不能指向其他的引用,但是其所指向的对象是可以改变的(类似于const char*) 

        final int[] arr = {1,2,3,4,5};
        arr[0] = 10000;
        System.out.println(Arrays.toString(arr));

2.所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象

StringBuilder也是与字符串相关的一个类,其中有一个append方法,用于字符串的追加

可以发现,在对字符串s进行追加时,实际上是又重新创建了一个字符串,使这个字符串为两个字符串append之后的结果,最后再将这个字符串重新赋值给s 

二.StringBuilder和StringBuffer的介绍

前言:

  由于stirng的不可改变性,对于字符串的操作有了一定的限制,为了更加方便地操作字符串,引入两个新的类:StringBuilder和StringBuffer,这两个类的基本用法一致

一.StringBuilder

常见方法总结:

1.append--》字符串追加
        //StringBuilder是一个类,必须先进行实例化对象
        StringBuilder str = new StringBuilder("hello");
        StringBuilder str2 = str;
        
        // 利用append进行追加  可追加字符,数字,字符串
        str.append(' ');
        str.append(123);
        str.append("world");
        str.append('!');
        System.out.println(str);

注意:

1.append方法的存在大大提高了新建字符串的效率,因为append方法在执行的时候是直接在位于缓冲区的字符数组之后添加字符的,并没有新建临时对象,减少了内存的不必要开辟和释放

2.可直接打印StringBuilder类的对象,因为其内部重写了toString方法

 

2.setCharAt(int index, char ch)-->将index位置的字符重置为ch
        StringBuilder str = new StringBuilder("hello");
        str.setCharAt(0,'!');
        str.setCharAt(1,'!');
        str.setCharAt(2,'!');
        System.out.println(str);

3.insert(int offset, String str) -->在offset位置插入:八种基类类型 & String类型 & Object类型数据
        StringBuilder str = new StringBuilder("hello");

        // insert方法
        // 并没有删除原位置的字符,而是在其之前插入另一个数据
        str.insert(0,'!');
        System.out.println(str);// !hello

        str.insert(6,"world");
        System.out.println(str);// !helloworld

        str.insert(0,123456);
        System.out.println(str);// 123456!helloworld

注意: insert方法并没有删除原位置的字符,而是在其之前插入另一个数据

 4.deleteCharAt(int index)--》删除index位置字符 
        StringBuilder str = new StringBuilder("hello");
        System.out.println(str.deleteCharAt(0));// ello
        System.out.println(str.deleteCharAt(0));// llo

        // delete 删除指定区间内的所有字符
        StringBuilder str2 = new StringBuilder("hello");
        System.out.println(str2.delete(0, 2));// llo
5.replace(int start, int end, String str)--》将指定区间的字符串设置为str
        StringBuilder str = new StringBuilder("hello!!!!");
        str.replace(1,6,"world");
        System.out.println(str);// hworld!!!
6.StringBuffer reverse()-->倒置字符串
        StringBuilder str = new StringBuilder("hello!!!!world");
        System.out.println(str.reverse());// dlrow!!!!olleh

这是一个非常有用 的方法,在很多刷题网站中都有倒置字符串的实现,通过S听Builder自带的reverse方法可以快速实现!!! 

源码:

public AbstractStringBuilder reverse() {
        boolean hasSurrogates = false;
        int n = count - 1;
        for (int j = (n-1) >> 1; j >= 0; j--) {
            int k = n - j;
            char cj = value[j];
            char ck = value[k];
            value[j] = ck;
            value[k] = cj;
            if (Character.isSurrogate(cj) ||
                Character.isSurrogate(ck)) {
                hasSurrogates = true;
            }
        }
        if (hasSurrogates) {
            reverseAllValidSurrogatePairs();
        }
        return this;
    }

 

7.toString方法-->以字符串(String)类型返回

 String和StringBuffer不能直接赋值,必须通过StringBuffer的toString方法才能转换

        StringBuilder str = new StringBuilder("hello!!!!world");
//        String str2 = str;// err

        String newstr = str.toString();
        System.out.println(newstr);// hello!!!!world

StringBuilder和StringBuffer也包含String类型中常见的方法,如indexOf,charAt,substring,length等方法,其用法和String类基本一致,此处不再详细阐述

总结:

String类是一个非常常用的类,要掌握其包含的常见方法的使用,深入理解String不能被改变和继承的原因;同时为了解决String类的一些缺陷,引入了两个新的类 StringBuilder和StringBuffer,这两个类可以看作String类的更高效的版本,其中有很多方法与String类重合,但也有很多自己独有的,非常有效的方法,了解这些方法会大大提高我们的开发效率!!!

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

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

相关文章

基于YOLOv8模型的塑料瓶目标检测系统(PyTorch+Pyside6+YOLOv8模型)

摘要&#xff1a;基于YOLOv8模型的塑料瓶目标检测系统可用于日常生活中检测与定位塑料瓶目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的目标检测&#xff0c;另外本系统还支持图片、视频等格式的结果可视化与结果导出。本系统采用YOLOv8目标检测算法训练数…

翻译docker官方文档(残缺版)

Build with docker(使用 Docker 技术构建应用程序或系统镜像) Overview (概述) 介绍&#xff08;instruction&#xff09; 层次结构&#xff08;Layers&#xff09; The order of Dockerfile instructions matters. A Docker build consists of a series of ordered build ins…

“高级Vue状态管理 - Vuex的魅力与应用“

目录 引言1. Vuex的简介1.1 什么是Vuex&#xff1f;1.2 Vuex的核心概念 2. Vuex的值获取与改变(综合案例)3. Vuex的异步请求总结 引言 在现代Web开发中&#xff0c;前端应用变得越来越复杂。随着应用规模的扩大和数据流的复杂性增加&#xff0c;有效地管理应用的状态成为了一项…

Android---Synchronized 和 ReentrantLock

Synchronized 基本使用 1. 修饰实例方法 public class SynchronizedMethods{private int sum 0;public synchronized void calculate(){sum sum 1;} } 这种情况下的锁对象是当前实例对象&#xff0c;因此只有同一个实例对象调用此方法才会产生互斥效果&#xff1b;不同的…

APP测试常见功能测试点汇总

1、安装和卸载 安装和卸载是任何一款APP中都属于最基本功能。一旦出错&#xff0c;就属于优先级为紧要的BUG。因此APP的安装和卸载应作为一个测试点多加重视。 1 应用是否可以正常安装&#xff08;命令行安装&#xff1b;豌豆荚&#xff0f;手机助手等第三方软件安装&#xff…

B树、B+树详解

B树 前言   首先&#xff0c;为什么要总结B树、B树的知识呢&#xff1f;最近在学习数据库索引调优相关知识&#xff0c;数据库系统普遍采用B-/Tree作为索引结构&#xff08;例如mysql的InnoDB引擎使用的B树&#xff09;&#xff0c;理解不透彻B树&#xff0c;则无法理解数据…

【通信系列 1 -- GSM 和 LTE】

文章目录 1. LTE(Long Term Evolution)1.1 FDD&TDD简介1.1.1 3G与4G差异1.1.2 频点与band关系1.1.3 band 与运营商的关系 1.2 TDD&FDD区别1.2.1 FDD帧结构1.2.2 TDD帧结构1.2.3 TDD&FDD优势对比1.2.4 TDD缺点 1.3 VoLTE1.3.1 VoLTE 优点11.3.2 VoLTE 优点21.3.3 Vo…

redis-6.2.7 集群安装3主3从

因为资源有限准备了3 台 服务器&#xff0c;先查看防火墙的端口是否开放&#xff0c;如果没有开放先开放端口我使用的 6379 和 6380 这两个端口 所以将这两个端口放开。去redis 官网下载redis 安装包。下载地址 &#xff1a; redis 安装包下载 3. 安装redis 上传上去之后 3 台…

【Java 进阶篇】JavaScript 数据类型详解

JavaScript是一种弱类型脚本语言&#xff0c;具有动态类型。这意味着JavaScript中的变量可以容纳不同类型的数据&#xff0c;并且它们的类型可以在运行时更改。在本文中&#xff0c;我们将深入探讨JavaScript中的数据类型&#xff0c;包括原始数据类型和引用数据类型&#xff0…

TCP/IP(十)TCP的连接管理(七)CLOSE_WAIT和TCP保活机制

一 CLOSE_WAIT探究 CLOSE_WAIT 状态出现在被动关闭方,当收到对端FIN以后回复ACK,但是自身没有发送FIN包之前 ① 服务器出现大量 CLOSE_WAIT 状态的原因有哪些? 1、通常来讲,CLOSE_WAIT状态的持续时间应该很短,正如SYN_RCVD状态2、但是在一些特殊情况下,就会出现大量连接长…

【动态库】Ubuntu 添加动态库的搜索路径

在运行程序时&#xff0c;经常遇到下面这种动态库加载失败的情况&#xff0c;这时往往是系统在动态库的搜索路径下没有找到对应的库文件导致的。 目录 一、使用 LD_LIBRARY_PATH 二、修改 /etc/ld.so.conf 一、使用 LD_LIBRARY_PATH 环境变量 LD_LIBRARY_PATH是动态库的搜索…

【例题】逆波兰表达式求值(图解+代码)

【例题】逆波兰表达式求值(图解代码) 这里写目录标题 【例题】逆波兰表达式求值(图解代码)逆波兰表达式解释优点转换计算代码 题目描述 : 逆波兰表示法是一种将运算符&#xff08;operator&#xff09;写在操作数&#xff08;operand&#xff09;后面的描述程序&#xff08;算式…

1600*A. Linova and Kingdom(DFS优先队列贪心)

Problem - 1336A - Codeforces Linova and Kingdom - 洛谷 解析&#xff1a; 开始认为分情况讨论 k 小于等于叶子结点和大于叶子结点的情况&#xff0c;然后选择深度最深的叶子结点和子孙数量最小的结点&#xff0c;但是发现如果把某一个非叶子结点选取&#xff0c;那么其子孙…

VTP协议

VTP的概念 个人简介 VTP--------------VLAN Trunking protocol VLAN干道协议&#xff08;思科私有协议&#xff09; 同步VLAN编号 VTP&#xff08;Virtual Trunking Protocol&#xff09;是思科&#xff08;Cisco&#xff09;网络设备中的一种协议&#xff0c;用于在交换机之…

Qt QMultiMap

QMultiMap 文章目录 QMultiMap摘要QMultiMapQMultiMap 特点代码示例 关键字&#xff1a; Qt、 QMultiMap、 容器、 键值、 键值重复 摘要 今天在观摩小伙伴撸代码的时候&#xff0c;突然听到了QMultiMap自己使用Qt开发这么就&#xff0c;竟然都不知道&#xff0c;所以趁没…

【环境】我决定半场开香槟!ubuntu20.04 安装 pytorch

还在下载当中&#xff0c;我决定半场开香槟&#xff01;自信稳定安装成功&#xff01; ubuntu20.04 安装 pytorch 硬件及其他环境&#xff1a;win10 ubuntu20.04 3080显卡查找pytorch的版本是最重要的、也是最耽误时间的 PyTorch中torch、torchvision、torchaudio版本对应关…

使用IntelliJ Idea必备的插件!

趁手的工具让开发事半功倍&#xff0c;好用的IDEA插件让效率加倍。 今天给大家分享几个优秀的IDEA插件。 插件安装 首先得知道在IDEA哪安装插件&#xff1f; 点击File---->Settings---->找到Plugins标签&#xff0c;即可搜索想要的插件进行安装了。 现在来看下有哪些值…

bigemap制作专题地图-标绘图斑-标绘设计地图

制作专题地图-标绘图斑-标绘设计地图 发布时间&#xff1a;2018-01-17 版权&#xff1a;BIGEMAP 同步视频教程&#xff1a;卫星地图_高清卫星地图_卫星地图视频_制作专题地图-设计规划测量地图应用详解 专题地图制作视频教程&#xff1a;卫星地图_高清卫星地图_卫星地图视频_地…

点餐小程序实战教程09-订单功能开发

目录 1 创建数据源2 订单确认功能3 提交订单4 订单成功页面总结 我们上一篇已经将商品加入了购物车&#xff0c;如果购买完毕&#xff0c;点击选好了按钮就进入到订单确认页面&#xff0c;确认无误后就写入到订单表。为了实现上述的业务逻辑&#xff0c;我们需要先创建数据源来…

压缩包过大,如何使用split命令拆分压缩包

split命令介绍 1. 使用案例 将文件rebar_count_datasets.zip拆分为N个大小不超过100M的文件&#xff01; split -b 100M -d rebar_count_datasets.zip datasets.zip.运行效果 2. 常用方式 2.1 压缩 & 文件拆分 # tar -czf - <被压缩的内容> | split -b <目…