Java String深入解析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chenbetter1996/article/details/88059114

① 基础

String虽然不是基本数据类型,但是很像基本数据类型。

String s1 = "test";
String s2 = new String("test");
  1. 对于第一条,会在常量区创建一个"test"字符串(如果没有),然后s1是压入栈中的一个变量,指向常量区中的"test"
  2. 对于第二条,new的对象都是在堆中创建的,s2作为对象的引用也是存放在栈中,指向堆中的这个对象。
  3. 所有 s1 == s2 为 false, “==” 的是判断左右两边的变量所指向的地址是否一样(如果都是变量)

② 字符串相加

public class App 
{
	private static final String MESS = "taobao";
	
    public static void main( String[] args )
    {
    	String s1 = "tao";
    	String s2 = "bao";
    	String s3 = "taobao";
    			
    	final String s4 = "tao";
    	final String s5 = "bao";
    	
    	String s6 = "tao" + "bao";
    	String s7 = "tao" + s2;
    	
    	
    	System.out.println((s1 + s2) == MESS);  // false
    	System.out.println(s3 == MESS);  // true
    	System.out.println((s4 + s5) == MESS);  // true
    	System.out.println(s6 == MESS);   // true
    	System.out.println(s7 == MESS);   // false
    	System.out.println((s1 + s2) == s7);   // false
    }
}
  1. MESS是一个静态常量,其值“taobao”存储在常量区。s3也指向常量区的"taobao"。所有 MESS == s3为true。
  2. (s1 + s2) == MESS为false的原因是Java的字符串变量加其实是用StringBuffer实现的,因为它不知道你在相加的时候会不会已经对s1或者s2做了修改。相对于s6的这种直接相加不一样。因为新建了一个StringBuffer(“tao” + “bao”)则存在了堆区。所有就是不等的。
  3. s7 = “tao” + s2同理,也是在堆区新创建了一个StringBuffer对象,栈中的s7指向这个对象
  4. 堆区的对象都是新创建的,所有(s1 + s2) == s7也是false

猜你喜欢

转载自blog.csdn.net/chenbetter1996/article/details/88059114