==和equals区别 分析 String创建字符串

public class Test {
 
 public static void main(String[] args) {
  
  String string1 = "a";
  String string2 = "b";
  String string3 = "c";
  String string4 = "abc";
  String string5 = "a"+"b"+"c";
  String string6 = string1+string2+string3;
  String string7 = new String("abc");
  
  System.out.println(string4 == string5);
  System.out.println(string4 == string6);
  System.out.println(string5 == string6);
  System.out.println(string4 == string7);
  System.out.println(string5 == string7);
  System.out.println(string6 == string7);

  System.out.println(string4.equals(string5));
  System.out.println(string5.equals(string6));
  System.out.println(string6.equals(string7));

 }
}

输出结果:

true
false
false
false
false
false

true
true
true

这里面主要涉及String类equals方法及String创建字符串方式

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;
}
}
return false;
}

 

另外还需要注意几个概念:String池、String常量、对象。

 

1、String string4 ="abc";

创建步骤:

1) 栈中开辟一块空间存放引用string4; 
2) 由于本来不存在,String池中开辟一块空间,存放String常量"abc"; 
3) 引用string4指向池中String常量"abc"; 

2、String string7 = new String("abc");

创建步骤:

1) 栈中开辟一块空间存放引用string7 ; 
2) 堆中开辟一块空间存放一个新建的String对象"abc",并不是String池中的String常量,而是一个对象; 
3) 引用string7 指向堆中的新建的String对象"abc"; 

3、String string5 = "a"+"b"+"c";

创建步骤:

1) 栈中开辟一块空间存放引用string5 ; 
2) 根据编译器合并已知量的优化功能,池中存在常量"abc"; 
3) 引用str4指向池中常量"abc"; 

4、

String string1 = "a";
String string2 = "b";
String string3 = "c";
String string6 = string1+string2+string3;

创建步骤:

1) 栈中开辟一块中间存放引用string1 ,string1 指向池中String常量”a”;
2) 栈中开辟一块中间存放引用string2 ,string2 指向池中String常量”b”;
3) 栈中开辟一块中间存放引用string3 ,string3 指向池中String常量”b;
4) 栈中开辟一块中间存放引用string6;
5) string1+string2+string3通过StringBuilder的最后一步toString()方法还原一个新的String对象”abc”,因此堆中开辟一块空间存放此对象; 
6) 引用str6指向堆中(string1+string2+string3)所还原的新String对象;

 

这样子大家差不多明白了吧,有不明白的欢迎留言讨论。

posted @ 2019-03-07 17:44  孤城丶闭  阅读(127)  评论(0编辑  收藏  举报