您的位置:首页 > 编程语言 > Java开发

java中创建String类型对象的两种方式以及在使用equals()和“==”两种方法时的区别

2017-07-11 14:53 1111 查看

string 对象创建的两种方式

String aString="a";
String bString = new String("a");

其中aString是通过直接赋值的方式创建,bString是通过String类型的构造方法创造对象。相同的地方在于他们两都是两个值都为“a”字符串对象。但他们在创建对象的方式是不同的。现在通过常见的判断两个字符串对象的值是否相等的例子来引入。

String aString = "aa";
String bString = new String("aa");
String cString="aa";
System.out.println(aString==bString);
System.out.println(aString.equals(bString));
System.out.println(aString==cString);

此段代码得到的结果是 false,true,true。接下来对这三个答案进行一一解析。
那么接下需要了解equals和==的区别

equals和==的区别

1.首先看看string类中对于equals方法的写法:
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}


这说明equals方法是通过取到字符串对象的value值来进行比较,故aString.equals(bString)的结果是true就显而易见,因为他们的value都是aa。

2 那对于==布尔运算符来讲,如果参与运算的对象 不是八大基础类型(int,boolean,char,,,,,,,),那么就是将参加运算的对象的内存地址进行比较。而不同对象的内存地址一定不相同,所以对于aString==bString来说是两个不同的对象的内存地址进行比较,尽管他们的Value都是等于aa,但显然==运算是忽略Value的。所以是false.

此时各位读友可能会产生了疑问了,既然==对于string对象是进行内存地址的比较,那么aString==cString的结果应该是false才对,他们属于value值相等的两个不同的对象,所以内存地址也一定不相同。这样讲貌似是有道理的,但忽略了一点,那就是string
类型对象通过new来创建和直接赋值创建是有着本质的区别的。接下来请看二者的区别。

string类型通过new创建对象和直接赋值创建的区别

1.字符串缓存池:当创建字符串对象时,jvm中会存在一个.字符串缓存池,其中可看做类似于hashmap的一个容器,key为字符串对象的内存地址,value为该字符串对象的值value。
当通过new来创建字符串对象时,相当于强制创建新的字符串对象,然后加入字符串缓存池中。
而当通过类似String aString = "aa"这样的直接赋值创建对象时,jvm会首先在缓存池中检查是否已经存在value等于aa的字符串,若已经存在相同值的字符串对象,则不会创建新的aString对象,也不会加入缓存池中,是直接根据缓存池中已有的对象直接赋给aString,所以aString就相当于是已经存在对象的一个别名。只有缓存池中不存在value值等于aa的对象时,才会创建一个新的对象,然后加入缓存池。

故 aString==cString 中 cString和aString一样都是直接赋值aa,所以cString不会创建新的对象,而是成为了aString 对象的别名,都指向的是同一个对象的内存地址。故
aString==cString 的结果是true.


本人的第一篇小博客,如有疏忽请谅解和指正!嘿嘿


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java string equals
相关文章推荐