一、String类型
字符串一旦定义是不可改变的,为什么呢?因为声明一个String类型的对象给其赋值的过程,是String类型中存放常量池中相应值的地址的过程。每次对String重新赋值,相当于在常量池中先查找是否有相应的值,若有则存放该值在常量池的地址;若没有,则在常量池中新开辟空间存放该值,然后String对象存放该值在常量池的地址。
二、==与equals区别(String)
==两个对象的地址相同(==比较内存地址)
1. java.lang.String aString="abc";
java.lang.String bString="abc";
这样声明aString与bString指向的字符串常量池中地址相同,故值也相同
2. java.lang.String aString=new String("abc");
java.lang.String bString=new String("abc");
这样通过new方法新建对象,在堆区中新建了两个地区,aString和bString分别指向堆中的两个地区。
故两个对象的值相同,但指向的堆中的地址不相同
String类中的equals方法确实重写了,只比较值相同
注:基本类型equals方法未被重写,若使用包装类equals方法都被重写
三、 拼接字符串
拼接字符串禁止使用+=的方式,而使用StringBuilder或者Stringbuffer
1. StringBuilder和StringBuffer的区别:
StringBuilder非线程安全,单线程使用
StringBuffer线程安全,多线程使用
2. String+= StringBuilder StringBuffer性能比较:
String+=和StringBuilder在jdk1.8之后 性能一样,因为String+=的方式在jdk1.8之后做了优化,StringBuffer差一些
3.拼接字符串的方法:
先new对象,使用append方法追加内容
StringBuilder builder=new StringBuilder();
builder.append("a").append("b").append("c");
System.out.println(builder.toString());