广州安隽笔试+面试
写在前面
已挂,是个贝壳外包
实习
动态数据源切换,动态加解密,动态数据权限,人工客服
项目
不记得了,没问什么项目
八股
基本还是mysql的常见八股
笔试
MYSQL
设计一个员工表和一个部门表,其中一个行列转换的不会
StringBuffer和String的区别
StringBuffer
和String
是Java中处理字符串的两种不同类型,主要区别在于可变性、线程安全性以及性能方面。
- 可变性 (Mutability)
**
String
**:String
对象是不可变的。一旦创建了一个String
对象,它的值就不能被改变。任何修改String
值的操作都会创建一个新的String
对象。
1
2String str = "Hello";
str = str + " World"; // 创建了一个新的String对象**
StringBuffer
**:StringBuffer
对象是可变的。它允许在不创建新对象的情况下修改字符串的内容。
1
2StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 修改了同一个StringBuffer对象
- 线程安全性 (Thread Safety)
**
String
**:String
是线程安全的,因为它是不可变的。多个线程可以安全地共享同一个String
对象而不需要同步。
**
StringBuffer
**:StringBuffer
是线程安全的。它的所有公共方法都是同步的,确保了多线程环境中的安全性。
1
2StringBuffer sb = new StringBuffer("Hello");
sb.append(" World"); // 线程安全
- 性能 (Performance)
**
String
**:- 因为
String
是不可变的,每次对字符串进行操作都会创建一个新的String
对象,这可能导致较多的内存消耗和较差的性能,特别是在进行大量字符串操作时。
- 因为
**
StringBuffer
**:StringBuffer
由于是可变的,且方法是同步的,在多线程环境中性能比String
好。但是由于同步机制,单线程环境中的性能可能不如StringBuilder
(后面会提到)。
1
2
3
4StringBuffer sb = new StringBuffer("Hello");
for (int i = 0; i < 1000; i++) {
sb.append(" World");
}
- 使用场景
**
String
**:- 适用于少量的、对字符串不频繁修改的场景,例如定义常量、少量拼接操作等。
**
StringBuffer
**:- 适用于需要频繁修改字符串且在多线程环境中使用的场景,例如构建复杂字符串、在多线程应用中累积字符串内容等。
StringBuilder
的比较
另外,还有一个与StringBuffer
类似的类,叫做StringBuilder
,它也是可变的,但它不是线程安全的。
**
StringBuilder
**:StringBuilder
与StringBuffer
几乎相同,唯一的区别是StringBuilder
的所有方法都是非同步的,因此它在单线程环境中比StringBuffer
性能更好。
1
2StringBuilder 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的区别
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 PlanB's Blog!