String中两种初始化方式比较

1.String s1 = “abc”

首先要分清楚这一句话做了什么操作,这句话
  1. 首先在常量池中查找“abc”,如果没有则创建对象
  2. 在栈中创建s1的引用,
  3. 将s1直接指向对象abc

因此在这里abc是常量池中的对象,如果声明另一个String类型的对象引用,并将它指向对象‘abc’,则这两个引用指向的是同一个常量池中的对象。

String s1 = "abc";//"abc"是一个对象,将对象赋予类变量s1
String s2 = new String("abc");//这里是两个对象,在内存中存在两个,包括对象abc 和 new 出来的对象
String s3 = "abc";  //因为String类型数据是不可变的,所以‘abc’被放在了常量池中,这里的‘abc’ַ和s1的‘abc’是
							//同一个常量abc对象,因此二者的内存地址是一样的。
							
System.out.println(s1==s2);//false
System.out.println(s1==s3);//true 这是这号i
	

2. String s = new String(“abc”);

这句话和常规的对象创建是一样的,就是在内存开辟空间,在堆内存创建String对象,将内存地址赋予栈内存中的引用变量。

3.说一个特殊的

String s = "aa";
s =s + "bb";
String s2 = "aabb";
s == s2;???

这个的结果是false,这时候s 和s2已经不是一样的了,首先看 s2,s2指向的是常量池中的对象,这是确定的。所以尽管s的值和s2是一样的,但是s指向的不是常量池的中的对象,而是一个新的new出来的对象。 解释之前,先了解一下 + 这个符号,在字符串拼接里面,相当于+ 源码大意为: (new StringBuffer()).append(s3).append(“bbb”).toString; 所以,这里的s指向的是一个新的对象。

总结: 在String的两种声明方式,直接赋予字符值的是,String对象引用获取常量池中对象的地址,所以String声明出来是不可以改变的。new String()出来的是在堆内存创建对象。如果要给每个对象中的String属性赋予一个初始值,采用String s = ‘abc’方式,这样创建的是常量池中的一个对象,其他对象是获取这个常量的地址。要是new 则每次都要创建,加大内存消耗。还要注意,字符串拼接不要用+ ,会创建对象。
public class Demo1 {

	@Test
	public void test1() {
		String s1 = "abc";//"abc"是一个对象,将对象赋予类变量s1
		String s2 = new String("abc");//这里是两个对象,在内存中存在两个,包括对象abc 和 new 出来的对象
		String s3 = "abc";  //因为String类型数据是不可变的,所以‘abc’被放在了常量池中,这里的‘abc’ַ和s1的‘abc’是
							//同一个常量abc对象,因此二者的内存地址是一样的。
		
		System.out.println(s1==s2);//false
		System.out.println(s1==s3);//true 这是这号i
		
		//+ 源码大意为: (new StringBuffer()).append(s3).append("bbb").toString;
		//是新new出一个新的StringBuffer对象,
		s3 = s3+"bbb";//这时候s3已经不指向"abc",源对象依旧存在,s3是新的string类型的对象
		String s4 = "abcbbb";
		String s5 = new String("abcbbb");
		System.out.println(s3);
		System.out.println(s3==s4);//false  s3是一个新的String对象
		System.out.println(s4=="abcbbb");//true  这个“abcbbb”属于同一个常量池中的对象
		System.out.println(s3==s5);
	}
	}

关于String详解请看 https://blog.csdn.net/mahao25/article/details/99692056

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值