String、StringBuilder和StringBuffer有什么区别
Java 语言中有4个类可以对字符或字符串进行操作,它们分别是Character、String、StringBuffer 和StringTokenizer,其中Character 用于单个字符操作,String 用于字符串操作,属于不可变类,而StringBuffer 也是用于字符串操作,不同之处是StringBuffer 属于可变类。
public final class String implements Serializable, Comparable<String>, CharSequence {
可以看到,String 是不可变类,也就是说,String 对象一旦被创建,其值将不能被改变,而StringBuffer 是可变类,当对象被创建后任然可以对其值进行修改。由于String 是不可变类,因此适合在需要被共享的场合中使用,而当一个字符串经常需要被修改时,最好使用StringBuffer 来实现,因为在字符串被修改时String 会比StringBuffer 多很多附加操作,同时生成很多无用的对象,由于这些无用的对象会被GC,故影响程序性能。实例如下:
String s = "Hello";
s += "World";
以上代码等同于:
StringBuffer sb = new StringBuffer();
s.append("World);
s = sb.toString();
String与StringBuffer 还有一个区别就是在实例化String 时,可以利用构造函数来new,也可以用赋值(String = “Hello”)的方式,而StringBuffer 只能用构造函数的方式。
StringBuilder 与StringBuffer 类似,都是字符串缓冲区,但StringBuider 是线程不安全的,但若只在单线程中使用,则效率高于StringBuffer。
在执行效率方面,StringBuilder 最高,StringBuffer 次之,String 最低。因此,在实际使用时,如果要操作的数据量比较小的,应优先使用String 类;如果在单线程下操作大量数据,应优先使用StringBuilder 类;如果在多线程下操作大量数据,应优先考虑StringBuffer 类。
==和equals的区别
” == “运算符用来比较两个变量的值是否相等。也就是说,该运算符用于比较变量对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能使用” == “运算符。
具体来说,如果两个变量是基本数据类型,可以直接使用“==”运算符来比较其值是否相等。如果一个变量指向的数据是对象(引用类型),此时就涉及了两块内存,对象本身占用一块内存,变量也占用一块内存,例如:对于String s = new String(),变量s 占用一块存储空间,而new String() 则存储在另一块存储空间中,此时,变量s 所对应内存中所存储的数值就是对象那快内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即这两个变量所指向的内存地址是否相等,这时候就可以使用“ == ”进行比较。但是。如果要比较这两个对象的内容是否相同,那么“ == ”就无法实现了。
equals 是Object 类提供的方法,故每一个对象都具有equals 方法。Object 类定的equals()方法是直接使用“ == ”比较的两个对象,所以在没有覆盖equals方法的情况下,equals 与“ == ”一样,比较的是引用。
相比于“ == ”运算符,equals() 特殊之处在于它可以被覆盖,所以可以通过覆盖方法使其不比较引用而比较数据内容,例如String 类的equals 方法用于比较两个独立对象的内容是否相同。
String s1 = new String("Hello");
String s2 = new String("Hello");
s1 == s2;//指向不同的对象,其内存首地址不同,故return false
s1.equals(s2);//两个对象中的内容是相同的,故return true