java 字符串拼接以及intern() 方法的使用

今天我们来一起研究一下java8中字符串拼接和intern方法的使用 

直接上代码

public static void main(String[] args) {

		String a = "a";

		String b ="bc";

		String c ="a"+"bc";

		String d="abc";
		System.out.println(c==d);


	}

运行结果

true

这是非常简单的一种 c 拼接后是“abc” 直接就放到了字符串常量池当中了 d 取到的 “abc” 是相同的一个。


public static void main(String[] args) {
		String a = "a";
		String ab = a+"b"; 1️⃣
		String ab1 = ab.intern();2️⃣
		String ab2 = "ab";3️⃣
		System.out.println(ab == ab1);// true
		System.out.println(ab ==ab2);//true
		System.out.println(ab1 == ab2);//true


	}

运行结果

true
true
true

 1️⃣只要涉及到变量拼接的底层就需要new 对象 ,只要new 对象 那么就有点不同了

ab 相当于是new String(“ab”)此时 字符串常量池中还没有“ab” 只在堆中有

2️⃣intern方法将对象ab所对应的字符串“ab” 放到字符串常量池中(intern方法的作用在这里我就不阐述了)此时字符串常量池中“ab” 存储的并不是 真正的字符串 “ab” 而是 堆空间中变量ab 的地址,之所以这样做是为了节省空间。

3️⃣变量ab2 对应的ab就是字符串常量池中的ab也就是 对象ab 的地址引用


 相同的原理,再来看一下下面的代码也是对象拼接

public static void main(String[] args) {
		String ab = new String("a")+new String("b");
		String ab1 = ab.intern();
		System.out.println(ab =="ab");
		System.out.println(ab1 == "ab");


	}

运行结果 

true

true

如果我们变一下 提前把字符串 "ab" 定义出来

public static void main(String[] args) {
		String ab2 = "ab";1️⃣
		String ab = new String("a")+new String("b");
		String ab1 = ab.intern();2️⃣
		System.out.println(ab =="ab");
		System.out.println(ab1 == "ab");


	}

运行结果就变量

false
true

原因是 :  1️⃣已经提前把字符串“ab” 放到了字符串常量池当中了 所以说2️⃣ 返回的就不是对象ab的地址了而是字符串常量池中的“ab” 所以导致了结果的不同


还哟一种情况,注意和上面几种进行区分

public static void main(String[] args) {
		String s = new String("1");1️⃣
		s.intern();
		String s2 = "1";
		System.out.println(s == s2);
		String s3 = new String("1")+new String("1");
		s3.intern();
		String s4 = "11";
		System.out.println(s3 == s4);


	}

运行结果

false
true

1️⃣ 这种自己new 不存在拼接的情况 他会在字符串常量池中和堆中各存一个 所以说s和s2是不同的,s3 就是上面讲的对象拼接问题。

少年辛苦终身事,莫向光阴惰寸功

ok,大家加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值