1.Java中操作字符串都有哪些?它们之间有什么区别?
操作字符串的类有:String、StringBuffer、StringBuilder
1.String和StringBuffer、StringBuilder的区别在于String声明的是不可变的对象,每次操作都会生成新的String对象、然后将指针指向新的String对象。而StringBuffer、StringBuilder可以在原有对象的基础上进行操作,所以在经常改变字符串内容的情况下最好不要使用String
2.StringBuffer和StringBuilder最大的区别在于,StringBuffer是线程安全的,而StringBuilder是非线程安全的,但StringBuilder的性能却高于StringBuffer,所以单线程环境下推荐使用StringBuilder,多线程情况下推荐使用StringBuffer
2.String、StringBuffer、StringBuilder区别(类似上一题)
1.数据可变和不可变
1.String底层使用一个不可变的字符数组private final char value[];所以内容不可变
2.StringBuffer和StringBuilder都继承了AbstractStringBuilder,底层使用的是可变字符数组;char[] value;
2.线程安全
StringBuilder是线程不安全的,效率较高;而StringBuffer是线程安全的,效率较低。通过他们的append方法来看,StringBuffer有同步锁,而StringBuilder没有
@Override
public synchronized StringBuffer append(Object obj) {
toStringCache = null;
super.append(String.valueOf(obj));
return this;
}
@Override
public StringBuilder append(String str) {
super.append(str);
return this;
}
3.String str = "i"和String str = new String(“i”)一样吗?
不一样,因为内存分配的方式不一样。String str = "i"的方式,Java虚拟机会将其分配到常量池中,而String str = new String(“i”)则会被分配到堆内存中。
4.String常用的方法有哪些
- indexOf() 返回指定字符串的索引
- charAt() 返回指定索引处的字符
- replace() 字符串替换
- trim() 去除字符串两端空白
- split() 分割字符串
- getBytes() 返回字符串的byte类型数组
- length() 返回字符串的byte类型数组
- toLowerCase() 将字符串转成小写字母
- toUpperCase() 将字符串转成大写字母
- subString() 截取字符串
- equals() 字符串比较
5.String s = new String(“xyz”),创建了几个StringObject?
一个或者两个,当常量池中存在“xyz"时,则只会在堆中创建new String(“xyz”)这一个,否则在给s = ”xyz"赋值的时候,会在常量池中创建一个xyz的对象。
6.下面这条语句一共创建了几个对象:String s = “a”+“b”+“c”+“d”
一个,因为编译器会对代码进行优化,相当于直接定义了一个"abcd"字符串
本文详细介绍了Java中String、StringBuffer和StringBuilder的区别。String是不可变对象,每次操作都会创建新对象,而StringBuffer和StringBuilder支持在原对象基础上操作,其中StringBuffer是线程安全的。在单线程环境中推荐使用StringBuilder以提高性能。此外,文章还讨论了字符串常量池和堆内存的分配,以及常见的字符串方法如indexOf、charAt、replace等。
3052

被折叠的 条评论
为什么被折叠?



