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.intern()方法(String两种创建方式的区别)
- java中equals和==之间的区别?clone方法的作用,及其为什么要使用clone方法?如何使用clone复制对象?以及深克隆浅克隆
- Java中两种String对象创建和初始化方式比较
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- Java中String两种不同创建方式的区别及intern的用法
- java中“==”和equals方法的区别,再加上特殊的String引用类型
- Java中两种String对象创建和初始化方式比较
- 第2章 Java编程基础——FAQ2.22 创建String对象时, 使用String s=new String (“abc”)和String s=“abc”语句有什么区别?
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- 细说java面试“=="和"equals"方法的区别以及常量池的概念及使用
- 对于String对象,可以使用"="赋值,也可以使用"new"关键字赋值,两种方式有什么区别?
- java两种创建String对象的区别
- java面试题:String字面值对象和构造方法创建对象的区别
- Java和C#中String直接赋值与使用new创建(==与equals进行比较)的区别
- String字面值对象和构造方法创建对象的区别的两个有关==和equals的面试题。
- java基础复习之对于String对象,能够使用“=”赋值,也能够使用newkeyword赋值,两种方式有什么差别?
- Java 创建字符串String的各种方法以及区别
- 1105 Java中String字面值对象和构造方法创建对象的区别
- 用类名做方法的返回值类型 在学习Java的初始阶段,很多同学使用基本数据类型定义变量和引用类型定义变量以及使用类名做方法的返回值类型常常不知所以。今天我以自己的解读方式和个人的理解作一个简单的解释,和
- java语言基础(53)——String 字面值对象和构造方法创建对象的区别