【Java】Java中的String类

news2024/11/16 17:38:23

文章目录

  • 一、认识 String 类
  • 二、String 类的常用方法
    • 2.1 构造方法
    • 2.2 String 类对象之间的比较
    • 2.3 字符串查找
    • 2.4 字符串的转换
    • 2.5 字符串替换
    • 2.6 字符串拆分
    • 2.7 字符串截取
    • 2.8 字符串常量池
    • 2.9 字符串的不可变性
  • 三、StringBuilder 和 StringBuffer
    • 3.1 StringBuilder
    • 3.2 StringBuffer
    • 3.3 String、StringBuffer 和 StringBuilder 之间的区别


一、认识 String 类

在C语言中如果想要表示字符串,就只能使用字符数组或者字符指针,然后通过标准库提供的一系列字符串操作函数对字符串进行操作。但是这是数据与操作数据的方法分离的方式显然不符合面向对象的思想。因此在Java中,String类就是一种符合面向对象思想的字符串类,String类是用于表示字符串的类。它是Java的核心类库中的一部分,因此无需特殊导入就可以在任何Java程序中使用。

String类是不可变的,这意味着一旦创建了一个字符串对象,就不能修改其内容。每当对字符串进行修改操作时,实际上是创建了一个新的字符串对象。这种设计是为了确保字符串的不可变性,以提高性能和安全性。因此如果在频繁的字符串拼接或修改场景中,建议使用StringBuilder类或StringBuffer类,它们提供了可变的字符串操作方法,可以避免不必要的对象创建。

二、String 类的常用方法

2.1 构造方法

String类提供了多个构造方法来创建字符串对象。下面是一些常用的构造方法:

  1. String():创建一个空字符串对象。
String str = new String();
  1. String(String original):通过将指定的字符串复制一份来创建一个新的字符串对象。
String str = new String("Hello");
  1. String(char[] value):通过字符数组创建一个新的字符串对象。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
  1. String(char[] value, int offset, int count):通过字符数组的指定部分创建一个新的字符串对象。offset表示起始索引,count表示要复制的字符数量。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars, 1, 3); // 结果为 "ell"
  1. String(byte[] bytes):通过字节数组创建一个新的字符串对象,使用默认的字符集解码字节数组。
byte[] bytes = {72, 101, 108, 108, 111};
String str = new String(bytes); // 结果为 "Hello"
  1. String(byte[] bytes, int offset, int length):通过字节数组的指定部分创建一个新的字符串对象,使用默认的字符集解码字节数组。offset表示起始索引,length表示要复制的字节数量。
byte[] bytes = {72, 101, 108, 108, 111};
String str = new String(bytes, 1, 3); // 结果为 "ell"
  1. 通过直接赋值一个常量字符串创建一个新的字符串对象。
String str = "Hello";

这些是String类的一些常用构造方法,更多的方法可见Java的在线文档。

另外需要注意的是:

  1. String类型是引用类型,内部储存的并不是字符串本身,在String类的源码中,String类实例变量的结构如下:


String类的内部,最主要的两个成员变量是value数组和hash变量。在早期的Java版本中,value数组的类型是char[]类型的数组,现在新版本的都是byte[]类型的数组,其作用就是储存字符串的字符内容,数组的长度就是字符串的长度,并且有final修饰,表明字符串对象被初始化后就不能再修改了。

hash是一个缓存的哈希码值,用于快速获取字符串的哈希码。哈希码是由字符串的内容计算得到的一个整数,用于在哈希表等数据结构中进行快速查找。hash 的值在字符串对象创建时被计算并缓存起来,以避免每次调用 hashCode() 方法时都重新计算。

public static void main(String[] args) {
	// 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. 在Java中使用""引起来的字符串也是String类型对象。

比如:

public static void main(String[] args) {
    System.out.println("Hello".getClass());
}

其输出结果是:class java.lang.String,表明使用""引起来的字符串的类型就是String

2.2 String 类对象之间的比较

字符串的比较是一种常见的操作,在Java中提供了四种字符串的比较方式:

  1. 使用equals()方法

equals()方法用于比较两个字符串的内容是否相等。它是在Object类中定义的,因此所有的Java对象都可以使用该方法。在String类中,equals()方法已经被重写,以便比较字符串的内容而不是引用。例如:

String str1 = "Hello";
String str2 = "World";
if (str1.equals(str2)) {
    System.out.println("Strings are equal.");
} else {
    System.out.println("Strings are not equal.");
}
  1. 使用compareTo()方法

compareTo()方法用于比较两个字符串的大小关系。它是在Comparable接口中定义的,String类实现了Comparable接口,因此可以使用该方法进行比较。compareTo()方法返回一个整数值,表示字符串之间的比较结果

  • 如果返回值为负数,则表示当前字符串小于被比较字符串;
  • 如果返回值为零,则表示两个字符串相等;
  • 如果返回值为正数,则表示当前字符串大于被比较字符串。

例如:

String str1 = "Apple";
String str2 = "Banana";
int result = str1.compareTo(str2);
if (result < 0) {
    System.out.println("str1 is less than str2.");
} else if (result > 0) {
    System.out.println("str1 is greater than str2.");
} else {
    System.out.println("str1 is equal to str2.");
}
  1. 使用equalsIgnoreCase()方法

equalsIgnoreCase()方法用于比较两个字符串的内容是否相等,但忽略大小写。例如:

String str1 = "Hello";
String str2 = "hello";
if (str1.equalsIgnoreCase(str2)) {
    System.out.println("Strings are equal (ignoring case).");
} else {
    System.out.println("Strings are not equal.");
}
  1. 使用==运算符

==运算符用于比较两个字符串对象的引用是否相等。它判断两个字符串对象是否指向同一个内存地址。如果两个字符串对象引用的是同一个对象,则返回true,否则返回false。例如:

String str1 = "Hello";
String str2 = "Hello";
if (str1 == str2) {
    System.out.println("References are equal.");
} else {
    System.out.println("References are not equal.");
}

需要注意的是,对于字符串的比较,通常使用equals()方法进行内容比较,而不是使用==运算符比较引用。因为==运算符比较的是对象的引用,而不是内容,只有在比较字符串的引用时才会使用==运算符。对于字符串的内容比较,应该使用equals()方法。

2.3 字符串查找

String类提供了多个用于字符串查找的方法。下面是一些常用的字符串查找方法:

  1. indexOf(String str):返回指定子字符串在原字符串中第一次出现的索引位置。如果找不到子字符串,则返回-1。
String str = "Hello, World!";
int index = str.indexOf("World");
System.out.println("Index of 'World': " + index); // 输出:Index of 'World': 7
  1. indexOf(String str, int fromIndex):从指定的起始索引位置开始,在原字符串中查找指定子字符串的第一次出现位置。
String str = "Hello, World!";
int index = str.indexOf("o", 5);
System.out.println("Index of 'o' starting from index 5: " + index); // 输出:Index of 'o' starting from index 5: 8
  1. lastIndexOf(String str):返回指定子字符串在原字符串中最后一次出现的索引位置。如果找不到子字符串,则返回-1。
String str = "Hello, World!";
int lastIndex = str.lastIndexOf("o");
System.out.println("Last index of 'o': " + lastIndex); // 输出:Last index of 'o': 8
  1. lastIndexOf(String str, int fromIndex):从指定的起始索引位置开始,从后往前在原字符串中查找指定子字符串的最后一次出现位置。
String str = "Hello, World!";
int lastIndex = str.lastIndexOf("o", 7);
System.out.println("Last index of 'o' starting from index 7: " + lastIndex); // 输出:Last index of 'o' starting from index 7: 4
  1. startsWith(String prefix):检查原字符串是否以指定的前缀开头,返回布尔值。
String str = "Hello, World!";
boolean startsWithHello = str.startsWith("Hello");
System.out.println("Starts with 'Hello': " + startsWithHello); // 输出:Starts with 'Hello': true
  1. endsWith(String suffix):检查原字符串是否以指定的后缀结尾,返回布尔值。
String str = "Hello, World!";
boolean endsWithWorld = str.endsWith("World!");
System.out.println("Ends with 'World!': " + endsWithWorld); // 输出:Ends with 'World!': true
  1. charAt(int index):返回index位置上字符,如果index为负数或者越界,抛出IndexOutOfBoundsException异常。
String str = "Hello, World!";
char ch = str.charAt(1);
System.out.println(ch); // 输出:e

这些方法可以用于在字符串中查找特定的子字符串、前缀或后缀、获取指定位置的字符等。它们提供了灵活的查找功能,可以帮助处理字符串中的特定内容。

2.4 字符串的转换

String类提供了多个用于字符串转换的方法。下面是一些常用的字符串转换方法:

  1. toCharArray():将字符串转换为字符数组,返回一个新的char[]数组。
String str = "Hello";
char[] charArray = str.toCharArray();
System.out.println(charArray); // 输出:Hello
  1. getBytes():将字符串转换为字节数组,使用默认的字符集编码。
String str = "Hello";
byte[] byteArray = str.getBytes();
System.out.println(Arrays.toString(byteArray)); // 输出:[72, 101, 108, 108, 111]
  1. toLowerCase():将字符串中的所有字符转换为小写形式,返回一个新的字符串。
String str = "Hello";
String lowercase = str.toLowerCase();
System.out.println(lowercase); // 输出:hello
  1. toUpperCase():将字符串中的所有字符转换为大写形式,返回一个新的字符串。
String str = "Hello";
String uppercase = str.toUpperCase();
System.out.println(uppercase); // 输出:HELLO
  1. trim():去除字符串开头和结尾的空白字符(空格、制表符、换行符等),返回一个新的字符串。
String str = "  Hello  ";
String trimmed = str.trim();
System.out.println(trimmed); // 输出:Hello
  1. valueOf():将其他类型的数据转换为字符串。valueOf()是一个静态方法,可以通过类名直接调用。它接受不同类型的参数,包括基本数据类型和对象类型,返回相应类型的字符串表示。
int num = 42;
String str = String.valueOf(num);
System.out.println(str); // 输出:42

boolean flag = true;
String boolStr = String.valueOf(flag);
System.out.println(boolStr); // 输出:true

这些方法可以用于将字符串与其他数据类型进行转换,或者对字符串进行大小写转换、去除空白字符等操作。它们提供了灵活的字符串转换功能,帮助处理字符串与其他数据类型之间的转化需求。

2.5 字符串替换

String类提供了多个用于字符串替换的方法。下面是一些常用的字符串替换方法:

  1. replace(char oldChar, char newChar):将字符串中所有的指定字符 oldChar 替换为新的字符 newChar,并返回替换后的新字符串。
String str = "Hello, World!";
String replaced = str.replace('o', '0');
System.out.println(replaced); // 输出:Hell0, W0rld!
  1. replace(CharSequence target, CharSequence replacement):将字符串中所有的指定子字符串 target 替换为新的子字符串 replacement,并返回替换后的新字符串。CharSequence是一个接口,String类实现了该接口,因此可以接受字符串作为参数。
String str = "Hello, World!";
String replaced = str.replace("World", "Java");
System.out.println(replaced); // 输出:Hello, Java!
  1. replaceAll(String regex, String replacement):使用正则表达式 regex 匹配字符串中的内容,并将匹配到的部分替换为指定的字符串 replacement,并返回替换后的新字符串。正则表达式可以用于更复杂的模式匹配和替换。
String str = "Hello, 123 World!";
String replaced = str.replaceAll("\\d", "*");
System.out.println(replaced); // 输出:Hello, *** World!
  1. replaceFirst(String regex, String replacement):使用正则表达式 regex 匹配字符串中的第一个匹配项,并将其替换为指定的字符串 replacement,并返回替换后的新字符串。
String str = "Hello, World!";
String replaced = str.replaceFirst("o", "O");
System.out.println(replaced); // 输出:HellO, World!

这些方法可以用于替换字符串中指定的字符、子字符串或模式匹配项,并返回替换后的新字符串。

2.6 字符串拆分

String类提供了多个用于字符串拆分的方法。下面是一些常用的字符串拆分方法:

  1. split(String regex):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。
String str = "Hello, World!";
String[] parts = str.split(", ");
System.out.println(Arrays.toString(parts)); // 输出:[Hello, World!]
  1. split(String regex, int limit):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。limit 参数指定了拆分的限制,即最多拆分出多少个子字符串。如果超过限制,剩余的部分将作为最后一个元素包含在结果中。
String str = "one,two,three,four,five";
String[] parts = str.split(",", 3);
System.out.println(Arrays.toString(parts)); // 输出:[one, two, three,four,five]

这些方法可以根据指定的分隔符或正则表达式将字符串拆分成多个子字符串,并返回拆分后的结果。

2.7 字符串截取

String类提供了多个用于字符串截取的方法。下面是一些常用的字符串截取方法:

  1. substring(int beginIndex):从指定的索引位置开始截取字符串,截取从 beginIndex 到字符串末尾的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7);
System.out.println(substr); // 输出:World!
  1. substring(int beginIndex, int endIndex):截取字符串中从 beginIndex 开始到 endIndex(不包括 endIndex)之间的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7, 12);
System.out.println(substr); // 输出:World
  1. substring(int beginIndex, int endIndex):截取字符串中从 beginIndex 开始到 endIndex(不包括 endIndex)之间的部分,并返回截取后的新字符串。
String str = "Hello, World!";
String substr = str.substring(7, 12);
System.out.println(substr); // 输出:World
  1. split(String regex):根据正则表达式 regex 将字符串拆分成子字符串数组,并返回拆分后的结果。拆分时将字符串按照匹配正则表达式的部分进行分割。
String str = "Hello, World!";
String[] parts = str.split(", ");
System.out.println(parts[0]); // 输出:Hello
System.out.println(parts[1]); // 输出:World!

这些方法可以根据指定的索引或正则表达式来截取字符串的特定部分,并返回截取后的新字符串或拆分后的子字符串数组。

2.8 字符串常量池

字符串常量池是Java中的一种特殊存储区域,用于存储字符串常量。在Java中,字符串是不可变的,即创建后不能被修改。为了提高性能和节省内存空间,Java使用了字符串常量池来共享字符串常量对象。

当我们创建一个字符串常量时(例如,使用双引号括起来的字符串字面值),Java会首先检查字符串常量池中是否存在相同值的字符串。如果存在,则返回常量池中的引用,而不会创建新的对象。这样可以避免重复创建相同内容的字符串,节省了内存空间。

例如,下面的代码中,虽然使用了两个不同的字符串对象,但它们的值相同,因此只会在字符串常量池中创建一个对象:

String str1 = "Hello";
String str2 = "Hello";

在Java中,字符串常量池位于堆内存中的特殊区域,与其他对象的存储不同。可以通过调用intern()方法来将一个字符串对象添加到字符串常量池中,或者获取字符串常量池中相同值的字符串对象的引用。intern()方法会返回字符串常量池中的引用,如果常量池中已经存在相同值的字符串,则直接返回该引用。

例如,下面的代码中,通过intern()方法将字符串对象添加到字符串常量池中,并且后续的字符串对象调用equals()方法进行比较时,将返回true

String str1 = new String("Hello").intern();
String str2 = new String("Hello");

System.out.println(str1 == str2); // 输出:true

需要注意的是,字符串常量池中的字符串是不可变的,一旦创建就不能修改。如果对字符串进行修改操作,将会创建新的字符串对象,而不会在常量池中进行修改。

字符串常量池在Java中起到了重要的作用,可以提高字符串的共享和重用,有助于节省内存空间,并提高字符串操作的效率。

2.9 字符串的不可变性

在Java中,String类的对象是不可变的,也就是说一旦创建了一个字符串对象,它的值就不能被修改。这意味着对字符串对象进行操作时,实际上是创建了一个新的字符串对象,而原始的字符串对象保持不变。

这种不可变性的特性有以下几个方面的影响和好处:

  1. 线程安全:由于字符串是不可变的,多个线程可以同时访问和共享字符串对象,而不需要担心数据的修改和同步的问题。

  2. 缓存哈希值:由于字符串的值不变,可以在创建字符串对象时计算并缓存其哈希值,以便后续的哈希操作更高效。

  3. 安全性:字符串作为参数传递给方法时,不可变性确保方法内部无法改变传递的字符串对象,避免了潜在的安全漏洞。

  4. 字符串常量池:字符串常量池利用字符串的不可变性,可以实现字符串的共享,节省内存空间。

由于字符串的不可变性,对字符串进行拼接、替换、截取等操作时,实际上是创建了一个新的字符串对象,而不是在原始对象上进行修改。这样的设计决策可以避免意外的修改和数据竞争,同时提供了更可靠和可预测的行为。

需要注意的是,尽管字符串对象本身是不可变的,但可以通过引用变量重新指向新的字符串对象来实现对字符串的修改。例如:

String str = "Hello";
str = str + ", World!"; // 创建了一个新的字符串对象,并将新的引用赋值给str变量

在这个例子中,原始的字符串对象"Hello"保持不变,而str变量指向了一个新创建的字符串对象"Hello, World!"。这也是字符串不可变性的一种表现形式。

总之,字符串的不可变性在Java中是一个重要的特性,它带来了线程安全性、安全性、哈希缓存等好处,并为字符串常量池的实现提供了基础。

三、StringBuilder 和 StringBuffer

3.1 StringBuilder

StringBuilder是Java中提供的一个可变的字符串类,它允许对字符串进行动态修改,而不会创建多个对象。与String类不同,StringBuilder对象的值是可变的,可以进行插入、追加、替换、删除等操作。

以下是StringBuilder类的一些常用方法:

  1. append(String str):将指定的字符串追加到当前字符串的末尾。
StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. insert(int offset, String str):在指定的偏移量位置插入指定的字符串。
StringBuilder sb = new StringBuilder("Hello");
sb.insert(5, ", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. replace(int start, int end, String str):用指定的字符串替换从指定起始位置到结束位置的子字符串。
StringBuilder sb = new StringBuilder("Hello, World!");
sb.replace(7, 12, "Java");
System.out.println(sb.toString()); // 输出:Hello, Java!
  1. delete(int start, int end):删除从指定起始位置到结束位置的子字符串。
StringBuilder sb = new StringBuilder("Hello, World!");
sb.delete(7, 12);
System.out.println(sb.toString()); // 输出:Hello, !
  1. reverse():反转当前字符串。
StringBuilder sb = new StringBuilder("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出:olleH

StringBuilder类提供了许多其他方法来操作和处理字符串,如查询长度、获取指定位置的字符、获取子字符串等。它的使用类似于String,但具有可变性的特点,适合在需要频繁修改字符串的场景下使用。

需要注意的是,StringBuilder是非线程安全的,如果在多线程环境下使用,应考虑使用线程安全的StringBuffer类代替。

3.2 StringBuffer

StringBuffer是Java中提供的一个可变的、线程安全的字符串类,它与StringBuilder类似,可以进行动态修改字符串的操作。与StringBuilder不同的是,StringBuffer的方法是线程安全的,适用于多线程环境。

以下是StringBuffer类的一些常用方法:

  1. append(String str):将指定的字符串追加到当前字符串的末尾。
StringBuffer sb = new StringBuffer("Hello");
sb.append(", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. insert(int offset, String str):在指定的偏移量位置插入指定的字符串。
StringBuffer sb = new StringBuffer("Hello");
sb.insert(5, ", World!");
System.out.println(sb.toString()); // 输出:Hello, World!
  1. replace(int start, int end, String str):用指定的字符串替换从指定起始位置到结束位置的子字符串。
StringBuffer sb = new StringBuffer("Hello, World!");
sb.replace(7, 12, "Java");
System.out.println(sb.toString()); // 输出:Hello, Java!
  1. delete(int start, int end):删除从指定起始位置到结束位置的子字符串。
StringBuffer sb = new StringBuffer("Hello, World!");
sb.delete(7, 12);
System.out.println(sb.toString()); // 输出:Hello, !
  1. reverse():反转当前字符串。
StringBuffer sb = new StringBuffer("Hello");
sb.reverse();
System.out.println(sb.toString()); // 输出:olleH

StringBuffer类提供了许多其他方法来操作和处理字符串,类似于StringBuilderString。不同的是,StringBuffer的方法是同步的,它使用了内部的同步机制来确保线程安全,因此适用于多线程环境下的操作。

由于StringBuffer的同步性,它在性能上可能比StringBuilder稍慢。因此,如果在单线程环境下进行字符串操作,推荐使用StringBuilder;而在多线程环境下,或需要保证线程安全性时,应使用StringBuffer

3.3 String、StringBuffer 和 StringBuilder 之间的区别

在Java中,StringStringBufferStringBuilder是用于操作字符串的三个类,它们之间有以下区别:

  1. 不可变性:

    • String是不可变的,一旦创建就不能修改,任何对String的操作都会创建新的字符串对象。
    • StringBufferStringBuilder是可变的,允许对字符串进行动态修改。StringBuffer是线程安全的,而StringBuilder是非线程安全的。
  2. 线程安全性:

    • String是不可变的,因此在多线程环境下是线程安全的。
    • StringBuffer是线程安全的,它的方法使用了同步机制来保证线程安全性。
    • StringBuilder是非线程安全的,它的方法没有同步机制,适用于单线程环境。
  3. 性能:

    • String的不可变性带来了一些性能优化,例如字符串常量池和缓存的哈希值。然而,频繁的字符串拼接和修改会导致大量的临时对象创建,性能较低。
    • StringBufferStringBuilder的可变性使得字符串的操作更高效,避免了不必要的对象创建和拷贝。由于StringBuffer的线程安全性,它在性能上可能稍慢于StringBuilder
  4. 适用场景:

    • String适用于字符串不需要修改的情况,例如常量、参数传递等。
    • StringBuffer适用于多线程环境或需要线程安全的场景,例如多线程共享字符串的修改。
    • StringBuilder适用于单线程环境,不需要线程安全的场景,例如字符串的拼接、修改等操作。

综上所述,String适用于不需要修改的字符串,StringBuffer适用于多线程环境或需要线程安全的字符串操作,StringBuilder适用于单线程环境下的字符串操作。根据具体的需求和性能要求,选择适合的类来操作字符串。

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

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

相关文章

robotframework接口自动化测试详解

我们在使用rebotframework的时候&#xff0c;不只是能做UI自动化&#xff0c;接口自动化也是可以的。 那么这里就整理一下rebotframework_接口自动化的应用&#xff1a; 一、编写接口测试 由上图可知&#xff0c;该接口如下信息&#xff1a; 接口功能描述&#xff1a;预诊模…

Spring6快速入门

Spring6快速入门 各工具版本要求&#xff1a; JDK:Java17 Maven:3.6 Spring:6.0.9 简介 Spring是一个控制反转(IOC)&#xff0c;面向切面(AOP)编程的轻量级框架。 2002年&#xff0c;Rod Johnson首次推出Spring框架的雏形&#xff0c;interface21(https://interface21.io/) 200…

python爬虫-获取cookie实例小记

注意&#xff01;&#xff01;&#xff01;&#xff01;某XX网站逆向实例仅作为学习案例&#xff0c;禁止其他个人以及团体做谋利用途&#xff01;&#xff01;&#xff01; 第一步&#xff1a;请求拿到响应内容。并分析。 第二步&#xff1a;关键步骤分析(这部分参考的B站图灵…

2023 年互联网 Java 工程师高级面试八股文汇总(1260 道题目附解析)

今年的行情&#xff0c;让招聘面试变得雪上加霜。已经有不少大厂&#xff0c;如腾讯、字节跳动的招聘名额明显减少&#xff0c;面试门槛却一再拔高&#xff0c;如果不用心准备&#xff0c;很可能就被面试官怼得哑口无言&#xff0c;甚至失去了难得的机会。 现如今&#xff0c;…

concurrenthashmap原理

目录 一、Concurrent类型的容器 二、HashMap多线程死链问题 三、Concurrenthashmap8原理 1、构造器 2、get流程 3、put流程 4、initTable 5、addCount方法 6、size流程 四、Concurrenthashmap7原理 1、put流程 2、rehash扩容流程 3、get流程 一、Concurrent类型的…

如何选型低代码平台

编者按&#xff1a;近年来&#xff0c;在数字经济迅速发展的背景下&#xff0c;越来越多的企业开始建立健全业务系统&#xff0c;借助数字化工具提升管理效率。企业如何选自己合适的产品&#xff0c;本文从低代码定义&#xff0c;特点技术路线做了介绍。其中MyApps低代码平台拥…

git常用命令之tag

11. Tag 11.1 创建tag 命令作用轻量标签git tag v1.0基于本地当前分支最新commit创建tag v1.0git tag v.0325 125a1d1给指定commit 125a1d打标签附注标签git tag -a v.0329 -m "给标签添加说明" 125a1d1基于指定commit创建标签并添加说明git tag -a v.0329 -m &quo…

联邦学习中怎样对数据质量进行评估

目录 联邦学习中怎样对数据质量进行评估 联邦学习中怎么在不暴露数据的情况下&#xff0c;证明数据量条目数 联邦学习中怎样进行数据质量评估 联邦学习中怎样对数据质量进行评估 在联邦学习中&#xff0c;评估数据质量是至关重要的&#xff0c;因为数据质量直接影响到模型的…

Redis 简介与数据类型介绍

目录 ​编辑 一、Redis是什么&#xff1f; 二、redis五大基本类型 2.1 String(字符串) 2.1.1 应用场景 1&#xff09;缓存功能 2&#xff09;计数器 3&#xff09;统计多单位的数量 4&#xff09;共享用户session 2.2 List(列表) 2.2.1 应用场景 1&#xff09;消息队列 2…

07 redux的使用

总结 一.reduxjs/toolkit使用 1.1安装 安装&#xff1a; npm install reduxjs/toolkit在src目录中的store目录中的index.js中添加 1.2导入包中的对象 导入包中的对象 import { createSlice, configureStore } from reduxjs/toolkit1.3创建切片对象 创建切片对象 //这个…

霍夫变换车道线识别-车牌字符识别代码(matlab仿真与图像处理系列第5期)

1.车道线识别 当使用霍夫变换进行车道线识别时,可以按照以下步骤来编写 MATLAB 代码: 读入图像:使用imread函数读取包含车道线的图像。image = imread(lane_image.jpg);图像预处理:为了减少噪音和突出车道线,可以对图像进行预处理。通常,可以采用以下步骤:将图像转换为…

kafka入门,Kafka Broker工作流程、Broker重要参数(十一)

Zookeeper 存储的 Kafka 信息 在zookeeper的服务端存储的Kafka相关信息 1&#xff09;/kafka/brokers/ids [0,1,2] 记录有哪些服务器 2&#xff09;/kafka/brokers/topics/first/partitions/0/state 记录谁是leader,有哪些服务器可用 3&#xff09;/kafka/controller 辅助选举l…

Java中的「接口」到底是什么?

&#x1f482; 个人网站:【海拥】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 目录 前言什么是接口接口的定…

浅浅的复习一下sql

DISTINCT 语法&#xff1a; SELECT DISTINCT 列名称 FROM 表名称1、现在有一个表如下&#xff1a; 2、执行sql语句-1 SELECT DISTINCT ename,email FROM emp 结果&#xff1a; 说明&#xff1a;由于小刘的ename和email重复了&#xff0c;所以结果只显示一次&#xff01; 3…

面试最爱问的浏览器的缓存机制问题

老规矩&#xff0c;想要了解学会一项技术&#xff0c;先从定义下手&#xff01; 浏览器的缓存的定义 浏览器的缓存是指浏览器在处理网络资源时&#xff0c;将这些资源存储在本地磁盘或内存中&#xff0c;并在后续的请求中重复使用这些缓存的资源。它旨在提高网页加载速度、减少…

AI画图——十二生肖

适当放下代码&#xff0c;有益身心健康。 AI绘画&#xff0c;码农必备&#xff0c;超解压。 多少没被和谐算多少~~~ 子鼠 丑牛 寅虎 卯兔 辰龙 巳蛇 午马 未羊 申猴 酉鸡 戌狗 亥猪

在期刊的参考文献中如何设置引用书中的一个章节

前言&#xff1a; 在bib文件中&#xff0c;使用book形式来引用书中的章节或文章。因为有些书籍是按照章节进行排列的&#xff0c;有些书籍收集了相关主题下的论文&#xff0c;当我们想要引用书中的要给章节或者书中的某篇文章的时候&#xff0c;我们该如何做呢&#xff1f; 下…

mysql不同隔离级别事务插入数据

文章目录 前言一、问题二、测试2.1.RR级别&#xff0c;mysql默认级别2.1.1 打开一个mysql窗口&#xff0c;事务A2.1.2 打开另一个窗口&#xff0c;事务B2.1.3 提交事务A&#xff0c;再看结果如下 2.2 READ-COMMITTED 级别下测试2.2.1修改数据库的my.ini文件修改隔离级别2.2.2 查…

国产MCU-CW32F030开发学习-OLED模块

国产MCU-CW32F030开发学习-OLED模块 硬件平台 CW32_48F大学计划板CW32_IOT_EVA物联网开发评估套件0.96 IIC oled模块 软件平台 Keil MDK 5.31IAR串口调试助手 IIC总线 处理器和芯片间的通信可以形象的比喻成两个人讲话&#xff1a;1、你说的别人得能听懂&#xff1a;双…

【AUTOSAR】AUTOSAR开发工具链(五)----polyspace-bug-finder 简单操作说明

1、打开polyspace-bug-finder&#xff0c;新建工程文件&#xff1a;File New Project&#xff0c;命名&#xff0c;选择保存路径&#xff0c;然后点击Next。 2、找到需要检测的文件&#xff0c;然后点击“Add Source Files” Finish 3、在Configuration左边窗口点击“…