String类的基本特点

来源:互联网 发布:远程桌面连接软件 编辑:程序博客网 时间:2024/05/29 02:48

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2);
输出为ture。

String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1 == str2);
此时输出的是false,原因是此时比较的为str1和str2的地址,要想使结果为ture,使用str1.equals(str2)比较字符串相等函数。
String类中“==” 和equals()的比较:
“==”进行的是数值比较,比较的是两个字符串的地址的数值;
equals()进行的是字符串内容的比较。

字符串为匿名对象:
String str1 = "hello";
其实是将一个匿名的String类对象设置有名字,匿名对象存放在堆内存中。
任何一个字符串常量均为String类的一个匿名对象,所以该对象永远不可能为null。

String类的两种实例化:
1. 采用直接赋值:
在jvm底层会自动维护一个对象池(可以理解为对象数组),若采用直接赋值的操作,那么该实例化对象(字符串)将自动保存到对象池中,如果下次继续使用直接赋值声明了String类对象,那么如果此时对象池之中存在指定内容,则直接进行引用,若没有,则开辟新的字符串对象,然后将其保存在新的对象池之中以供下次使用。
2.采用构造方法:String str = new string("hello");
如果使用构造方法则会开辟两块堆内存空间,而且有一块会成为垃圾,且对字符串共享产生影响。
String类中对象两种实例化的区别:
1.直接赋值只会开辟一块堆内存空间,且字符串对象可以保存在对象池中以供下次使用;
2.采用构造方法会开辟两块堆内存空间,使用intern()方法后可以手工入池。

所有的语言对于字符串的底层实现都是通过字符数组实现的,所以字符串常量不可改变。我们所见的字符串的变更,是字符串对象的变更。

原创粉丝点击