写在前面

已挂,是个贝壳外包

实习

动态数据源切换,动态加解密,动态数据权限,人工客服

项目

不记得了,没问什么项目

八股

基本还是mysql的常见八股

笔试

MYSQL

设计一个员工表和一个部门表,其中一个行列转换的不会

Snipaste_2024-06-19_12-06-21

StringBuffer和String的区别

StringBufferString是Java中处理字符串的两种不同类型,主要区别在于可变性、线程安全性以及性能方面。

  1. 可变性 (Mutability)
  • **String**:

    • String对象是不可变的。一旦创建了一个String对象,它的值就不能被改变。任何修改String值的操作都会创建一个新的String对象。
    1
    2
    String str = "Hello";
    str = str + " World"; // 创建了一个新的String对象
  • **StringBuffer**:

    • StringBuffer对象是可变的。它允许在不创建新对象的情况下修改字符串的内容。
    1
    2
    StringBuffer sb = new StringBuffer("Hello");
    sb.append(" World"); // 修改了同一个StringBuffer对象
  1. 线程安全性 (Thread Safety)
  • **String**:

    • String线程安全的,因为它是不可变的。多个线程可以安全地共享同一个String对象而不需要同步。
  • **StringBuffer**:

    • StringBuffer线程安全的。它的所有公共方法都是同步的,确保了多线程环境中的安全性。
    1
    2
    StringBuffer sb = new StringBuffer("Hello");
    sb.append(" World"); // 线程安全
  1. 性能 (Performance)
  • **String**:

    • 因为String是不可变的,每次对字符串进行操作都会创建一个新的String对象,这可能导致较多的内存消耗和较差的性能,特别是在进行大量字符串操作时。
  • **StringBuffer**:

    • StringBuffer由于是可变的,且方法是同步的,在多线程环境中性能比String好。但是由于同步机制,单线程环境中的性能可能不如StringBuilder(后面会提到)。
    1
    2
    3
    4
    StringBuffer sb = new StringBuffer("Hello");
    for (int i = 0; i < 1000; i++) {
    sb.append(" World");
    }
  1. 使用场景
  • **String**:

    • 适用于少量的、对字符串不频繁修改的场景,例如定义常量、少量拼接操作等。
  • **StringBuffer**:

    • 适用于需要频繁修改字符串且在多线程环境中使用的场景,例如构建复杂字符串、在多线程应用中累积字符串内容等。
  1. StringBuilder的比较

另外,还有一个与StringBuffer类似的类,叫做StringBuilder,它也是可变的,但它不是线程安全的。

  • **StringBuilder**:

    • StringBuilderStringBuffer几乎相同,唯一的区别是StringBuilder的所有方法都是非同步的,因此它在单线程环境中比StringBuffer性能更好。
    1
    2
    StringBuilder sb = new StringBuilder("Hello");
    sb.append(" World"); // 非线程安全,但性能更好

总结:

  • **String**:不可变、线程安全、适用于少量字符串操作。
  • **StringBuffer**:可变、线程安全、适用于多线程环境中频繁修改字符串的场景。
  • **StringBuilder**:可变、非线程安全、适用于单线程环境中频繁修改字符串的场景。

选择使用哪个类取决于具体的使用场景和性能需求。

深拷贝和浅拷贝的区别

引用关系

  • 浅拷贝:新对象与原对象共享嵌套对象的引用。
  • 深拷贝:新对象包含与原对象完全独立的嵌套对象。

bootstrap.yml和application.yml的区别

线程的-Xss参数是什么意思

-Xss参数是JVM(Java Virtual Machine)的一个选项,用于设置每个线程的栈大小。线程栈用于存储方法调用帧、局部变量、操作数栈等信息。当你创建一个新的线程时,JVM会为这个线程分配一个栈,用来保存该线程运行时的所有必要信息。

map,list,set的区别,hashmap和hashtable的区别