------- android培训、java培训、期待与您交流! ---------
1.equals是Object的方法所以它的使用者是对象,而“==”的使用者既可以是对象也可以是数据类型如(int)
Object.equals()与“==”是相同的,比较的都是对象的物理内存地址,
2.而很多类的equals()都复写这个方法如(String,Integer),他们比较的的是对象的内容
3.这里我们还要介绍一下特殊的String
String对象具有唯一性,共享性。
3.1唯一性:修改一个String是将变量指向了另一个对象,而不是修改原来对象的值
原理在于:String 使用 private final char value[]来实现字符串的存储。
3.2共享性:相同内容的内容,String是不会新创建一个对象的,但实际上只有字符串常量是共享的,
replace等操作的结果是不共享的。
再详细点就是:
JVM中一块独立的区域存放字符串常量和基本类型常量,我们称之为常量池。
String的创建分为两种形式:
编译期创建:使用“”或者“”+“”形式的字符串都是字符串常量,一开始都存储在常量池中,
所以他们的物理内存是相同的
运行期创建:使用 new String("")创建的对象会存储到堆内存中,是运行期新创建的;
同样使用了String.replace()等方法产生字符串也是新创建了一个String
所以运行期才创建的字符串的地址是不同的。
下面举几个例子:
- //唯一性
- String s1 = new String("amit");
- System.out.println(s1.replace('m','r')); //打印结果为arit
- System.out.println(s1); //amit
- //共享性
- String s3 = "arit";
- String s4 = "arit";
- System.out.println(s3 == s4);//true,说明在同一块内存中
- //
- String s2 = s1.replace('m','r');
- String s6 = s1.replace('m','r');
- System.out.println(s2.equals(s3));//true,说明string复写了equales,比较的是内容
- System.out.println(s2 == s3); //false,replace等操作的结果是不共享的。
- System.out.println(s2 == s6);//false
- //
- String s2 = s1.replace('m','r');//运行期创建的String对象
- String s6 = s1.replace('m','r'); //运行期创建的String对象
- System.out.println(s2.equals(s3));//true,说明string复写了equales,比较的是内容
- System.out.println(s2 == s3); //false,replace等操作的结果是不共享的。
- System.out.println(s2 == s6);//false
- String s7 = "a"+"b";//编译期,字符串常量就已经存在
- String s8 = "ab";//编译期
- System.out.println(s7==s8);//true