1、String在什么包,使用时需要导入吗?
String属于java.lang包,是系统自己提供的,直接使用就好,不需要导入
2、==和equals方法
==用于比较两者的地址
equals是覆写了Object类中的方法,先比较地址是否一样,如果一样返回true,如果不一样,比较类型是否一样,如果类型不一样,直接返回false,如果类型一致,对象不一致,需要先还原回去,然后两个数组分别把每一个元素取出来比,完全一样返回true,否则返回false。默认也是比较地址,如果需要修改其比较规则,我们可以重写equals方法
例题一、String str=“abc”;
String str1=“abc”;
String str2=new String(“abc”);
String str3=“ab”+“c”;
System.out.println(str= =str1); //true 直接赋值后,字符串就被存入常量池,下一次再有相同字符,就直接引用常量池中的相同字符串,因此地址也是相等的
System.out.prinln(str1= =str2); //false new在堆上开辟了新的空间,而str1是在常量池内,因此地址不等
System.out.println(str1.equals(str2)); //true 两个内容相等,因此返回true
System.out.println(str= =str3); //true
System.out.println(str.equals(str3)); //true
例题二、String str=“a”+“b”+“c”+“d”;
以上语句一共创建了多少个对象?
七个;
str=“a”;第一个
str=“b”;第二个
str=“ab”;第三个
str=“c”;第四个
str=“abc”;第五个
str=“d”; 第六个
str=“abcd”; 第七个
3、关于String的特性
不可变性:看String源码可知,String底层存储使用char[]实现,这个char[]是被final所修饰的,我们知道数组是引用数据类型,而被final修饰时,地址与数组长度都不可变,因此String类型的数据是不可变的
4、String、StringBuffer、StringBuilder区别
1>版本:String、StringBuffer是JDK1.0版本,StringBuilder是Jdk1.5版本
2>继承的接口:String实现的Serializable、Charsequence、Comparable接口,StringBuilder、StringBuffer实现的Serializable、Charsequence、Appendable接口。直接造成的结果的就是,String含有compareTo()方法,StringBuffer、StringBuilder含有append()方法
3>关于多线程:String、StringBuffer,底层用了synchronized修饰,因此是同步的,线程安全;StringBuilder是异步的,线程不安全
4>关于效率:String<StringBuffer<StringBuilder,版本越靠后性能被优化的越好
5>关于是否可变性:String家族底层都用char[]存储实现,而String底层的char[]用了final修饰,数组被fianl修饰则地址不可变,数组长度不可变,所以String是不可变的,而StringBuffer、StringBuilder底层则不被final修饰,因此不具有可变性
6>关于拼接是否创建新对象:String底层是char[]并用final修饰,所以在拼接时,每拼接一次都会创建一个新对象;StringBuilder、StringBuffer在拼接时,每拼接一次都扩容一次,不必创建新对象
7>关于创建对象:String可以向基本数据类型一样直接赋值,而其他的只能调用构造函数
5、关于String的compareTo方法
compareTo方法是实现自Comparable接口的,按照字典索引的顺序(Unicode编码)比较,返回值是int类型
6、关于String对象的储存
String a="abc” —>字符串常量池
Stirng a=new String(“abc”) ----->堆内存上
“a”+“b”+“c”+“d” ------>如上,看字符串常量池产生七个对象