【深入了解Java String类】

news2025/4/27 15:47:50

目录

String类

常用方法

字符串的不可变性

String的内存分析 

StringBuilder类

解释可变和不可变字符串

常用方法

面试题:String,StringBuilder,StringBuffer之间的区别和联系

String类的OJ练习


String类

【1】直接使用,无需导包:


【2】形象说一下字符串:

【3】


String str = “abc”;
"abc"就是String类下的一个具体的对象

【4】字符串是不可变的:

【5】这个String类不可以被继承,不能有子类:


【6】String底层是一个char类型的数组


验证:

注意:没有用'\0'来标识结尾

String类中的字符实际保存在内部维护的value字符数组
value被final修饰,表明value自身的值不能改变,即不能引用其它字符数组
但是其引用空间中的内容可以修改

常用方法

【1】构造器:底层就是给对象底层的value数组进行赋值操作。

//通过构造器创建对象:
String s1 = new String();
String s2 = new String("abc");
String s3 = new String(new char[]{'a', 'b', 'c'});

【2】常用方法:  

String s4= "abc";
System.out.println("字符串的长度为:"+s4.length());
String s5 = new String("abc");
System.out.println("字符串是否为空:"+s5.isEmpty());
System.out.println("获取字符串的下表对应的字符为:"+s5.charAt(1));

 【3】equals:比较两个值的内容是否相同

String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equals(s7));
/*String s6 = new String("abc");
String s7 = new String("abc");
System.out.println(s6.equalsIgnoreCase(s7));//忽略大小写*/

equals底层:

【4】String类实现了Comparable接口,里面有一个抽象方法叫compareTo,所以String中一定要对这个方法进行重写
比较两个值的内容的大小,相等返回0,大于返回一个整数,小于返回一个负数

String s8 = new String("abc");
String s9 = new String("accdef");
System.out.println(s8.compareTo(s9));
/*String s8 = new String("abc");
String s9 = new String("Abc");
System.out.println(s8.compareToIgnoreCase(s9));//忽略大小写
*/

compareTo底层:

【5】其它常用方法: 

        //字符串的截取:
        String s10 = "abcdefghijk";
        System.out.println(s10.substring(3));
        System.out.println(s10.substring(3,6));//[3,6)
        //字符串的拼接/合并:
        System.out.println(s10.concat("pppp"));
        //字符串中的字符的替换:
        String s11 = "abcdeahija";
        System.out.println(s11.replace('a','u'));
        //按照指定的字符串进行分裂为数组的形式:
        String s12 = "a-b-c-d-e-f";
        String[] strs = s12.split("-");
        System.out.println(Arrays.toString(strs));
        //转大小写的方法:
        String s13 = "abc";
        System.out.println(s13.toUpperCase());
        System.out.println(s13.toUpperCase().toLowerCase());
        //去除首尾空格:
        String s14 = "   a  b  c   ";
        System.out.println(s14.trim());
        //toString()
        String s15 = "abc";
        System.out.println(s15.toString());
        //转换为String类型:传入任何类型的数据都将转换为String类型
        System.out.println(String.valueOf(String.valueOf(false)));

【6】String类的练习: 

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        String str = "  hello  themyth      ";
        System.out.println(str);
        String ret = str.trim();//去掉的字符串开头和结尾的空白字符(空格、换行、制表符等)
        System.out.println(ret);
        String string  = "themyth@ws";
        System.out.println(string.contains("ws"));//判断字符串里面是否包含了这个内容。
    }
    //这是一个main方法,是程序的入口:
    public static void main2(String[] args) {
        //字符串的拆分:
        String str1 = "hello handsome themyth";
        String[] strs = str1.split(" ");
        /*for (String s : strs) {
            System.out.println(s);
        }*/
        for (int i = 0; i < strs.length; i++) {
            System.out.println(strs[i]);
            //hello
            //handsome
            //themyth
        }
        String[] strs2 = str1.split(" ", 2);
        for (int i = 0; i < strs2.length; i++) {
            System.out.println(strs2[i]);
            //hello
            //handsome themyth
        }
        String str2 = "192.168.0.1";
        String[] strs3 = str2.split("\\.");
        for (int i = 0; i < strs3.length; i++) {
            System.out.println(strs3[i]);
            //192
            //168
            //0
            //1
        }
        System.out.println("===");
        String str3 = "192\\168\\0\\1";
        String[] strs4 = str3.split("\\\\");//  "\\"表示一个"\"
        for (int i = 0; i < strs4.length; i++) {
            System.out.println(strs4[i]);
            //192
            //168
            //0
            //1
        }
        System.out.println("===");
        String str4 = "192&168=1";
        String[] strs5 = str4.split("&|=");//
        for (int i = 0; i < strs5.length; i++) {
            System.out.println(strs5[i]);
            //192
            //168
            //1
        }
        System.out.println("===");
        //多次拆分:
        String message = "name=themyth&age=22";
        String[] ms = message.split("&|=");
        for (String s : ms) {
            System.out.println(s);
            //name
            //themyth
            //age
            //22
        }
        System.out.println("===");
        String message2 = "name=themyth&age=22";
        String[] ms2 = message2.split("&");
        for (int i = 0; i < ms2.length; i++) {
            String[] ms3 = ms2[i].split("=");
            for (String s : ms3) {
                System.out.println(s);
                //name
                //themyth
                //age
                //22
            }
        }
        //字符串的截取:
        String str = "abcdefgh";
        String s1 = str.substring(2);//cdefgh 返回从2位置开始所截去的字符
        System.out.println(s1);
        String s2 = str.substring(2,6);//cdef 截取下标区间[2,6)的字符
        System.out.println(s2);
    }
    //这是一个main方法,是程序的入口:
    public static void main1(String[] args) {
        String str1 = "themyth";
        char ch = str1.charAt(1);//h 下标对应的字符
        System.out.println(ch);
        for (int i = 0; i < str1.length(); i++) {
            if (i != str1.length() - 1) {
                System.out.print(str1.charAt(i) + " ");
            } else {
                System.out.println(str1.charAt(i));
            }
        }//t h e m y t h
        String str2 = "ababcabcabc";
        int b = str2.indexOf('b');//1 字符第一次出现位置的下标,默认从下标为0开始查找
        System.out.println(b);
        int b1 = str2.indexOf('b', 5);//6 从下标为5的字符开始查找,字符第一次出现位置的下标
        System.out.println(b1);
        //在主串中 查找子串
        int abc = str2.indexOf("abc");
        System.out.println(abc);//2 返回"abc"首字符a第一次出现的位置
        int b2 = str2.lastIndexOf('b');//9 从后往前找,字符第一次出现位置的下标
        System.out.println(b2);
        int b3 = str2.lastIndexOf('b', 5);//3 从下标为5的字符从后往前开始查找,字符第一次出现位置的下标
        System.out.println(b3);
        int b4 = str2.lastIndexOf("abc", 7);//5 从下标为7的字符从后往前找子串,如果找到了第一个能够匹配的字串,返回该子串的第一个字符
        System.out.println(b4);
        String str3 = String.valueOf(123);//将...转换为字符串
        System.out.println(str3);
        String str4 = "123";
        int data = Integer.parseInt(str4);
        System.out.println(data);
        Double data2 = Double.parseDouble(str4);
        System.out.println(data2);//123.0
        String str5 = "TheMyth";
        String str6 = "themyth";
        System.out.println(str5.toLowerCase());//themyth
        System.out.println(str6.toUpperCase());//THEMYTH
        String str7 = "abcdef";
        char[] chars = str7.toCharArray();//字符串--->字符数组
        for (int i = 0; i < chars.length; i++) {
            if (i != chars.length - 1) {
                System.out.print(chars[i] + " ");
            } else {
                System.out.println(chars[i]);
            }
        }//a b c d e f
        String str8 = new String(chars);//字符数组->字符串
        System.out.println(str8);
        String str9 = String.format("%d-%d-%d", 2021, 6, 16);//格式化打印(用的很少)
        System.out.println(str9);
        //参数不同。replace的参数是char和CharSequence,即可以支持字符的替换,也支持字符串的替    
        //换;replaceAll的参数是regex,即基于规则表达式的替换。
        //替换方式不同。replace是全部替换,即把源字符串中的某一字符或字符串全部换成指定的字符或            
        //字符串;replaceAll也是全部替换,但如果所用的参数据不是基于规则表达式的,则只替换第一 
        //次出现的字符串。
        String str10 = "abcabcdabcde";
        String replace = str10.replace('a', 'o');//obcobcdobcde
        System.out.println(replace);
        String replace1 = str10.replace("abc", "x");//xxdxde
        System.out.println(replace1);
        String replace2 = str10.replaceAll("abc", "ooo");//oooooodooode
        System.out.println(replace2);
        String replace3 = str10.replaceFirst("abc", "520");//520abcabcde
        System.out.println(replace3);
        //注意:字符串是不可变的对象,替换不修改当前字符串!
    }
}

字符串的不可变性

所有涉及到可能修改字符串内容的操作都是创建一个新对象,改变的是新对象
例如:substring,返回的都是一个新的字符串对象

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = new String("abc");
        System.out.println(str1 == str2);//false
    }
}

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        String str1 = "abc";
        String str2 = "abc";
        System.out.println(str1 == str2);//true
    }
}

总结“”双引号里面的值存在字符串常量池中,
如果已经存过一次了,就不会进行第二次存储,
直接返回字符串常量池的对象即可 

【纠正】网上有些人说:字符串不可变是因为其内部保存字符的数组被final修饰了,因此不能改变。这种说法是错误的,不是因为String类自身,或者其内部value被final修饰而不能被修改。
final修饰类表明该类不想被继承,final修饰引用类型表明该引用变量不能引用其他对象,但是其引用对象中的内容是可以修改的
例如: 

import java.util.Arrays;
public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        final int[] array = new int[]{1, 2, 3, 4};
        array[0] = 666;//指向的内容可以修改
        //array = new int[]{1, 2, 3, 4, 5};指向本身不能修改
        System.out.println(Arrays.toString(array));//[666, 2, 3, 4]
    }
}

真实的原因是:
在String类中是压根拿不到value[ ]的值,因为根本就没有提供设置和获取value的方法
所以字符串不可变的

为什么 String 要设计成不可变的?(不可变对象的好处是什么?) 
1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑写时拷贝的问题了. 
2. 不可变对象是线程安全的. 
3. 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中.

String的内存分析 

【1】字符串拼接:

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        String s1 = "a"+"b"+"c";
        String s2 = "ab"+"c";
        String s3 = "a"+"bc";
        String s4 = "abc";
        String s5 = "abc"+"";
    }
}

上面的字符串,会进行编译器优化,直接合并成为完整的字符串,我们可以反编译验证: 

然后在常量池中,常量池的特点是第一次如果没有这个字符串,就放进去,如果有这个字符串,就直接从常量池中取:

内存:

 【2】new关键字创建对象:

String s6 = new String("abc");

内存:开辟两个空间(1.字符串常量池中的字符串 2.堆中的开辟的空间) 

【3】有变量参与的字符串拼接: 

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        String a = "abc";
        String b = a + "def";
        System.out.println(b);
    }
}

a变量在编译的时候不知道a是“abc”字符串,所以不会进行编译期优化,不会直接合并为“abcdef” 

反汇编过程:为了更好的帮我分析字节码文件是如何进行解析的:

利用IDEA中的控制台:

字符串修改:

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        /*String str = "hello";
        str += "abc";
        System.out.println(str);
        for (int i = 0; i < 10; i++) {
            str += "abc";//不建议在循环中使用+对字符进行拼接,要创建很多临时的对象,效率低
        }*/
        //在底层的代码:
        String str = "hello";//对象
        StringBuilder sb = new StringBuilder();//对象
        sb.append(str);
        sb.append("abc");//对象
        str = sb.toString();//对象
        //共创建了4个对象,所以上面那种写法很不好,如果还是在循环里面进行字符拼接,那效率更低
        System.out.println(str);
    }
}

尽量避免直接对String类型对象进行修改,因为String类是不能修改的,所有的修改都会创建新对象,效率非常低下。

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        String s = "";
        for (int i = 0; i < 10000; ++i) {
            s += i;
        }
        long end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        StringBuffer sbf = new StringBuffer("");
        for (int i = 0; i < 10000; ++i) {
            sbf.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
        start = System.currentTimeMillis();
        StringBuilder sbd = new StringBuilder("");
        for (int i = 0; i < 10000; ++i) {
            sbd.append(i);
        }
        end = System.currentTimeMillis();
        System.out.println(end - start);
    }
}

可以看到在对String类进行修改时,效率是非常慢的,
因此:尽量避免对String的直接修改,如果要修改建议尽量使用StringBuffer或StringBuilder 

StringBuilder类

【1】字符串的分类:
(1)不可变字符串:String
(2)可变字符串:StringBuilder,StringBuffer

【2】StringBuilder底层:非常重要的两个属性: 

【3】对应内存分析:  

从源码分析:

因为value数组被使用了,所以count的值要发生改变
最后返回当前构建的那个对象,实际上在底层就是返回一个复制之后的数组。 

注意:count是StringBuilder底层那个value数组被使用的长度
上述说的第几步到第几步不是真正程序执行的步骤,是自定义,方便自己理解的步骤。 

 

 从源码分析新传入的7个o在底层怎样运作的:

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        //创建StringBuilder的对象:
        StringBuilder sb3 = new StringBuilder();
        //表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
        StringBuilder sb2 = new StringBuilder(3);
        //表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
        StringBuilder sb = new StringBuilder("abc");
        System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo").toString());//链式调用方式:return this
    }
}

 

解释可变和不可变字符串

【1】String---》不可变

【2】StringBuilder---》可变
可变,在StringBuilder这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可  

public class Test {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder();
        System.out.println(sb.append("abc") == sb.append("def"));//true,同一个对象
    }
}

常用方法

【1】StringBuilder常用方法:

public class TestStringBuilder {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        StringBuilder sb = new StringBuilder("nihaojavawodeshijie");
        //增
        sb.append("这是梦想");
        System.out.println(sb);//nihaojavawodeshijie这是梦想
        //删
        sb.delete(3,6);//删除位置在[3,6)上的字符
        System.out.println(sb);//nihavawodeshijie这是梦想
        sb.deleteCharAt(16);//删除位置在16上的字符
        System.out.println(sb);//nihavawodeshijie是梦想
        //改-->插入
        StringBuilder sb1 = new StringBuilder("$23445980947");
        sb1.insert(3,",");//在下标为3的位置上插入","
        System.out.println(sb1);//$23,445980947
        //改-->替换
        StringBuilder sb2 = new StringBuilder("$2你好吗5980947");
        sb2.replace(3,5,"我好累");//在下表[3,5)位置上替换字符串
        System.out.println(sb2);//$2你我好累5980947
        sb.setCharAt(3,'!');
        System.out.println(sb);//nih!vawodeshijie是梦想
        //查
        StringBuilder sb3 = new StringBuilder("asdfa");
        for (int i = 0; i < sb3.length(); i++) {
            System.out.print(sb3.charAt(i)+"\t");//a	s	d	f	a
        }
        System.out.println();
        //截取
        String str = sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
        System.out.println(str);//df
                                                                                //反转
                                                                                sb3.reverse();
                                                                                System.out.println(sb3);//afdsa
    }
}

【2】StringBuffer常用方法:   与StringBuilder一致,他们的父类都是AbstractStringBuilder

public class Test03 {
    //这是一个main方法,是程序的入口:
    public static void main(String[] args) {
        StringBuffer sb = new StringBuffer("nihaojavawodeshijie");
        //增
        sb.append("这是梦想");
        System.out.println(sb);//nihaojavawodeshijie这是梦想
        //删
        sb.delete(3,6);//删除位置在[3,6)上的字符
        System.out.println(sb);//nihavawodeshijie这是梦想
        sb.deleteCharAt(16);//删除位置在16上的字符
        System.out.println(sb);//nihavawodeshijie是梦想
        //改-->插入
        StringBuffer sb1 = new StringBuffer("$23445980947");
        sb1.insert(3,",");//在下标为3的位置上插入 ,
        System.out.println(sb1);//$23,445980947
        //改-->替换
        StringBuffer sb2 = new StringBuffer("$2你好吗5980947");
        sb2.replace(3,5,"我好累");//在下表[3,5)位置上插入字符串
        System.out.println(sb2);//$2你我好累5980947
        sb.setCharAt(3,'!');
        System.out.println(sb);//nih!vawodeshijie是梦想
        //查
        StringBuffer sb3 = new StringBuffer("asdfa");
        for (int i = 0; i < sb3.length(); i++) {
            System.out.print(sb3.charAt(i)+"\t");//a	s	d	f	a
        }
        System.out.println();
        //截取
        String str = sb3.substring(2,4);//截取[2,4)返回的是一个新的String,对StringBuilder没有影响
        System.out.println(str);//df
        //反转
        sb3.reverse();                                                                                        
        System.out.println(sb3);//afdsa
    }
}

String和StringBuilder最大的区别在于String的内容无法修改,而StringBuilder的内容可以修改。
频繁修改字符串的情况考虑使用StringBuilder。

注意:String和StringBuilder类不能直接转换。
如果要想互相转换,可以采用如下原则: 
String变为StringBuilder: 利用StringBuilder的构造方法或append()方法 
StringBuilder变为String: 调用toString()方法。

面试题:String,StringBuilder,StringBuffer之间的区别和联系

(1)String、StringBuffer、StringBuilder区别与联系

1. String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。

2. StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String。

3. JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。

StringBuffer采用同步处理,属于线程安全操作;而StringBuilder未采用同步处理,属于线程不安全操作,即StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。

通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder

StringBuilder:JDK1.5开始  效率高   线程不安全

StringBuffer:JDK1.0开始   效率低    线程安全

StringBuilder没有synchronized
而StringBuffer有synchronized

(2)以下总共创建了多少个String对象【前提不考虑常量池之前是否存在】

String str = new String("ab"); // 会创建多少个对象
String str = new String("a") + new String("b"); // 会创建多少个对象

String类的OJ练习

(1)字符串中的第一个唯一的字符

题目链接:https://leetcode.cn/problems/first-unique-character-in-a-string/

class Solution {
    public int firstUniqChar(String s) {
        //int[] count = new int[256];
        int[] count = new int[26];
        // 统计每个字符出现的次数
        for (int i = 0; i < s.length(); ++i) {
            count[s.charAt(i) - 'a']++;
        }
        // 找第一个只出现一次的字符
        for (int i = 0; i < s.length(); ++i) {
            if (1 == count[s.charAt(i) - 'a']) {
                return i;
            }
        }
        return -1;
    }
}

(2)字符串中最后一个单词的长度

题目链接:https://www.nowcoder.com/practice/8c949ea5f36f422594b306a2300315da?tpId=37&&tqId=21224&rp=5&ru=/activity/oj&qru=/ta/huawei/question-ranking

import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        // 注意 hasNext 和 hasNextLine 的区别
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();
            // 1. 找到最后一个空格
            // 2. 获取最后一个单词:从最后一个空格+1位置开始,一直截取到末尾
            // 3. 打印最后一个单词长度
            int index = s.lastIndexOf(" ");
            String ret = s.substring(index+1);
            System.out.println(ret.length());
        }
    }
}

(3)验证回文串

题目链接:https://leetcode.cn/problems/valid-palindrome/ 

class Solution {
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int left = 0;
        int right = s.length() - 1;
        while (left < right) {
            //不是有效字符就++遍历下个字符,有可能有多个空格,所以要用while,还有个前提是全程一直要left < right,因为有可能一直都没有遇到有效字符,left >= right
            while (left < right && !isValidChar(s.charAt(left))) {
                left++;
            }
            //left是有效字符了
            while (left < right && !isValidChar(s.charAt(right))) {
                right--;
            }
            //right是有效字符了
            if (s.charAt(left) != s.charAt(right)) {
                return false;
            } else {
                left++;
                right--;
            }
        }
        return true;
    }
    private boolean isValidChar(char ch) {
        if (Character.isDigit(ch) || Character.isLetter(ch)) {
            return true;
        }
        return false;
        /*if (ch >= '0' && ch <= '9' || ch >= 'a' && ch <= 'z') {
            return true;
        }
        return false;*/
    }
}

 (4)华为研发工程师编程题——字符集合

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            String str = sc.nextLine();
            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < str.length(); i++) {
                char ch = str.charAt(i);
                if (!sb.toString().contains(ch + "")) {//contains里面只能是字符串序列,ch是单个字符,ch+""就变成了字符串
                    sb.append(ch);
                }
            }
            System.out.println(sb.toString());
        }
        sc.close();
    }
}

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

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

相关文章

【FreeRTOS】FreeRTOS移植stm32详细步骤介绍

我在查找FreeRTOS移植的相关教程特别少&#xff0c;所以想非常详细的介绍FreeRTOS移植stm32详细步骤&#xff0c;包括源码的下载&#xff0c;源码介绍&#xff0c;系统移植&#xff0c;代码验证等&#xff0c;每一步都有对应的介绍和解释&#xff0c;希望可以帮助到你们。 文章…

【VINS】苹果手机采集单目相机+IMU数据离线运行VINS-Mono

0.准备工作 开个新坑&#xff0c;之前用Android手机做过离线采集数据的实验&#xff0c;这次用IPhone来测试&#xff01; 1.虚拟机配置Mac OS 下载一个Mac OS 的ios镜像&#xff0c;打开虚拟机按照跟Ubuntu差不多的方式安装&#xff0c;但是发现没有Mac OS的入口。 因为VMwa…

字符函数、字符串函数和内存函数

朋友们&#xff0c;今天追秋给大家带来的是一些函数的介绍&#xff0c;包括字符函数、字符串函数和内存函数。 字符串函数 字符串函数分为以下几类: 1.长度不受限制的字符串函数:strlen;strcpy;strcat;strcmp; 2.长度受限制的字符串函数:strncpy;strncat;strncmp. 3.还有一些特…

【C++杂货铺】set 和 map 使用总结

文章目录 一、前言1.1 关联式容器1.2 键值对1.3 树型结构的关联式容器 二、set2.1 set的介绍2.2 set的使用2.2.1 set 的模板参数列表2.2.2 set 的构造2.2.3 set 的迭代器2.2.4 set 的容量2.2.5 set 修改操作2.2.6 set 的使用举例 三、multiset3.1 multiset 的介绍3.2 multiset …

C++goto语句

在本文中&#xff0c;您将了解goto语句&#xff0c;它是如何工作的&#xff0c;以及为什么应该避免它。在C 编程中&#xff0c;goto语句用于通过将控制权转移到程序的其他部分来更改程序执行的正常顺序。 goto语句的语法 goto label; ... .. ... ... .. ... ... .. ... label…

【C++】笔试训练(三)

目录 一、选择题二、编程题1、字符串中找出连续最长的数字串2、数组中出现次数超过一半的数字 一、选择题 1、以下程序的输出结果是&#xff08;&#xff09; #include <stdio.h> int main() {char a[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 }, * p;int i;i 8;p a i;p…

【考研数学】高等数学第七模块 —— 曲线积分与曲面积分 | 3. 对面积的曲面积分(第一类曲面积分)

文章目录 二、曲面积分2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09;2.1.1 问题引入 —— 曲面的质量2.1.2 对面积的曲面积分定义及性质2.1.3 对面积的曲面积分的计算法 写在最后 二、曲面积分 2.1 对面积的曲面积分&#xff08;第一类曲面积分&#xff09; 2…

小谈设计模式(12)—迪米特法则

小谈设计模式&#xff08;12&#xff09;—迪米特法则 专栏介绍专栏地址专栏介绍 迪米特法则核心思想这里的“朋友”指当前对象本身以参数形式传入当前对象的对象当前对象的成员变量直接引用的对象目标 Java程序实现程序分析 总结 专栏介绍 专栏地址 link 专栏介绍 主要对目…

【自定义类型】--- 位段、枚举、联合

&#x1f493;博客主页&#xff1a;江池俊的博客⏩收录专栏&#xff1a;C语言进阶之路&#x1f449;专栏推荐&#xff1a;✅C语言初阶之路 ✅数据结构探索&#x1f4bb;代码仓库&#xff1a;江池俊的代码仓库&#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐ 文…

Hypermesh联合LS-DYNA的子弹侵彻计算

Hypermesh凭借强大的网格划分和方便的求解设置功能而被广泛用于DYNA求解器的前处理。本文通过bullet穿透铝合金板侵彻计算来简单介绍Hypermesh和LS-DYNA的联合使用。 计算模型如图1所示&#xff0c;为1/4模型&#xff0c;bullet材料为钢材&#xff0c;被穿透的板为铝合金AL202…

python和java类的编写(属性私有化,方法公开化)

初始化类的属性的2种写法&#xff1a; 如下要注意python对文件名称、类、方法名的命名 方式一&#xff1a;原始的定义 class User1: # 初始化账号和密码 def __init__(self):# 账号和密码self.__username Noneself.__password Nonedef getnsername(self):return self.__us…

001 Python开发环境搭建

1、下载python 2023/10 python-3.11.5-amd64.exehttps://www.python.org/ftp/python/3.11.5/python-3.11.5-amd64.exe 2、下载Visual Studio Code 2023/10 VSCodeSetup-x64-1.82.2.exehttps://code.visualstudio.com/docs/?dvwin64 3、安装python 双击打开python-3.11.5-a…

【Linux】RPM包使用详解

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1f338;文…

为什么都说NFS读写性能差,如何进行优化?

使用基于NFS协议存储系统的同学经常遇到的问题是在小文件比较多的情况下性能会比较差。小文件访问性能差本身是可以理解的,但是NFS确实是太差了。不知大家是否深层次分析过,为什么NFS访问小文件性能会这么差? NFS文件系统与本地文件系统的差异在于多了一个网络传输的过程。…

阿里云RDS关系型数据库详细介绍_多版本数据库说明

阿里云RDS关系型数据库大全&#xff0c;关系型数据库包括MySQL版、PolarDB、PostgreSQL、SQL Server和MariaDB等&#xff0c;NoSQL数据库如Redis、Tair、Lindorm和MongoDB&#xff0c;阿里云百科分享阿里云RDS关系型数据库大全&#xff1a; 目录 阿里云RDS关系型数据库大全 …

AI标注,怎么做才能省时省劲,提高效率?有何技巧?

AI标注是一种借助人工智能技术为数据集添加标签的方法&#xff0c;这一过程旨在使机器学习算法能够更好地识别和分类数据。与传统手工标注相比&#xff0c;AI标注具有高效、高准确性和低成本等优势。在本文中&#xff0c;我们将探讨如何实施有效的AI标注策略以提高工作效率。 …

如何使用ChatGPT来辅助写简历

How to ask ChatGPT for resume help https://www.producthunt.com/stories/how-to-ask-chatgpt-for-resume-help #MixCopilot 本文作者&#xff1a; 摘要&#xff1a; 本文介绍了如何使用ChatGPT来辅助写简历。通过ChatGPT&#xff0c;你可以改善简历的格式和结构&#xff0c;…

基于Java的实验室设备借用登记系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09;有保障的售后福利 代码参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作…

Java生态系统的进化:从JDK 1.0到今天

文章目录 JDK 1.0&#xff1a;开启Java时代JDK 1.1&#xff1a;Swing和内部类JDK 1.2&#xff1a;Collections框架和JIT编译器JDK 1.5&#xff1a;引入泛型和枚举JDK 1.8&#xff1a;Lambda表达式和流JDK 11以后&#xff1a;模块化和新特性未来展望1. 云原生和容器化2. 更好的性…