关于字符串的自我总结(字符串的创建原理,常见的题目,intern方法)

看本章内容前需要知道的东西

== 比较的是对象的地址是否相同,即 是否指向同一个对象

equals()方法,一般和 == 是一样的(因为Object的equals()方法就是return (this == obj);)
但是 String 重写了 equals()方法,所以 String的 equals() 方法比较的是内容是否相同(具体还有其他的
判断,在这里就不多说了)

intern()方法,当调用intern()方法时,如果字符串常量池中已经包含了 一个等于此String对象值的字符串,则返回池中的字符串的地址。否则,现在池里创建 该String对象,然后返回这个对象的地址。b.intern()最终返回的是常量池的地址

字符串的创建

方式一:String name = "jack"

方式二:String name = new String("jack")

方式一的原理:

在字符串常量池里创建一个 字符串"jack",然后让 name 指向常量池里"jack"的地址
方式一的图示
方式二的原理:

先查找常量池里是否有 “jack” 这个字符串,如果没有,那么先在常量池里创建一个字符串 “jack”,然后在堆里创建一个对象,对象里有一个char类型的数组 value,然后将value指向常量池中"jack"的地址,最后再让栈中的 name 指向 堆中的这个对象的地址;如果常量池里已经存在 “jack”,那么跳过常量池里创建字符串的那一步,直接进行后面的步骤
方法二的原理示意图

例题:

String a = "jack";
String b = new String("jack");
System.out.println(a.equals(b));	//true
System.out.println(a == b);		//false
System.out.println(a == b.intern());	//true
System.out.println(b == b.intern());	//false

本题中,a指向的是常量池里的地址,b指向的是堆中对象的地址,b.intern()返回的是常量池里的地址,即a所指向的地址。

字符串的特性


String a = “hello” + “abc”

String a = "hello" + "abc";		//创建了1个对象

字面量的相加,在编译阶段就会直接给拼接起来,然后在常量池里创建拼接后的对象,相当于
String a = “helloabc”

String c = a+b

String a = "hello";		//创建了1个对象
String b = "abc";		//创建了1个对象
String c = a + b;		//创建了2个对象,加上StringBuilder的话,就是3个对象

String a = “hello”:
在常量池创建了一个"hello“,然后把地址返回给a;

String b = “abc”:
在常量池中创建了一个"abc",然后把地址返回给b;

String c = a + b:
1、先创建了一个 StringBuilder sb = new StringBuilder()
2、执行sb.append(“hello”)
3、sb.append(“abc”)
4、String c = sb.toString(),相当于String c = new String(“helloabc”)
这四步的最终结果就是:c指向堆中的的对象,堆中的对象的value指向常量池里的"helloabc"


总结

  • String c = “a” + “b” 这种字面量的直接相加,是在编译阶段,直接给字符串拼接起来,然后在运行时,在字符串常量池中 创建拼接后的字符串的对象。这种方式,只会创建一个对象
  • 除了上面的那种方式之外,其他时候都是在底层 利用StringBuilder来进行字符串的拼接,最后调用Stringbuilder的toString()方法,相当于 new String();

这只是我个人对字符串相关内容的总结,如果有错误的地方,欢迎大佬指正

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值