StringBuffer ,StringBulider,String三者之间的区别和Map遍历的四种方法
StringBuffer,StringBuilder,String
本周做算法题的时候,看到了一些题有关字符串的题解有用的是StringBuffer,StringBuilder的一些方法,学习之后,感觉StringBuffer,StringBuilder对于字符串的修改是真的很方便。
StringBuilder是Java中的一个类,用于处理可变字符串(mutable string)。它提供了一种高效的方式来构建、修改和操作字符串
StringBuffer是Java中的一个类,与StringBuilder类似,用于处理可变字符串(mutable string)。它提供了一种线程安全的方式来构建、修改和操作字符串。
两者的主要方法基本一致,这里用StringBuffer 举例
主要方法:
序号 方法描述
1 :public StringBuffer append(String s
)
将指定的字符串追加到此字符序列。
2 :public StringBuffer reverse()
将此字符序列用其反转形式取代。
3 :public delete(int start, int end)
移除此序列的子字符串中的字符。
4 :public insert(int offset, int i)
将 int 参数的字符串表示形式插入此序列中。
5 :insert(int offset, String str)
将 str 参数的字符串插入此序列中。
6 :replace(int start, int end, String str)
使用给定 String 中的字符替换此序列的子字符串中的字符。
String、StringBuilder和StringBuffer是Java中用于处理字符串的类,它们之间有以下区别:
可变性(Mutability):
String类是不可变的(immutable),一旦创建就不能被修改。每次对字符串进行操作时,都会创建一个新的字符串对象。
StringBuilder和StringBuffer是可变的(mutable),可以直接在原始对象上进行操作而不需要创建新的对象。
线程安全性(Thread Safety):
String类是线程安全的,因为它是不可变的,多个线程可以同时访问和共享相同的字符串对象。
StringBuilder是非线程安全的,适用于单线程环境下的字符串操作。
StringBuffer是线程安全的,适用于多线程环境下的字符串操作,但由于同步开销,性能较StringBuilder略低。
性能(Performance):
在字符串操作较少或短小的情况下,String类具有良好的性能,因为字符串常量池可以重用字符串对象。
StringBuilder在单线程环境中具有最好的性能,因为它不需要额外的同步操作。
StringBuffer在多线程环境中提供线程安全的操作,但由于同步机制,性能稍低于StringBuilder。
适用场景:
String适用于存储和操作不经常改变的字符串,例如常量、配置值等。
StringBuilder适用于单线程环境中需要频繁修改字符串内容的场景。
StringBuffer适用于多线程环境中需要共享、安全操作字符串的场景。
综上所述,String、StringBuilder和StringBuffer在可变性、线程安全性和性能方面有所不同。选择合适的类取决于你的需求,如果需要频繁修改字符串且在单线程环境中操作,可以使用StringBuilder;如果在多线程环境中需要共享和安全地操作字符串,可以使用StringBuffer;如果字符串是固定的或者只读取操作,可以使用String。
Map的四种遍历方法
//第一种
System.out.println("通过Map.keySet遍历key和value:");
for (String key : map.keySet()) {
System.out.println("key= "+ key + " and value= " + map.get(key));
}
//第二种
System.out.println("通过Map.entrySet使用iterator遍历key和value:");
Iterator<Map.Entry<String, String>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<String, String> entry = it.next();
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第三种:推荐使用这一种
System.out.println("通过Map.entrySet遍历key和value");
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println("key= " + entry.getKey() + " and value= " + entry.getValue());
}
//第四种
System.out.println("通过Map.values()遍历所有的value,但不能遍历key");
for (String v : map.values()) {
System.out.println("value= " + v);
}