对String中intern()方法的认识

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

归纳一下的话,它的作用在jdk1.7之后是查看常量池中是否存在和调用方法的字符串内容一样的字符串,如果有的话,就返回该常量池中的字符串,若没有的话,就在常量池中写入一个堆中该字符串对象的一个引用,指向堆中的该对象,并返回该引用。

用代码说话吧,注释中有我对intern()方法的理解,过程中查阅了部分源码和相关博客,如果有谬误,请大家指出,互相交流学习,共同进步。

intern方法的测试

public class InternTest { public static void main(String[] args) { String a = new String("abc"); // 第一次,创建了两个对象,一个是堆中的string对象,一个是常量池中的"abc" String b = new String("abc"); // 第二次,创建一个对象,堆中的另外一个string对象 System.out.println(a.intern() == b.intern());// true System.out.println(a.intern() == b);// false System.out.println(a.intern() == a);// false /* * intern方法会到常量池中查找是否存在该对象,如果存在,返回该对象。不存在的话就创建该对象并返回该对象(jdk1.6),(jdk1.7) * 会在常量池中存一个指向堆中的那个对象的引用。 不存在往往是String s3 = new String("1") + new * String("1");这种形式,会在堆中有一个s3指向的11的对象和常量池中的1对象 * 在这里就是体现的堆中的内存地址不一样,但对应的同一个常量池中的string 第一个比较时常量池中的该对象和自身比较 * 下面两个比较则是常量池中的对象和堆中的两个对象进行比较 */ String poolstr = "abc"; // 直接从字符串常量池中获取 System.out.println(a.intern() == poolstr);// true System.out.println(b.intern() == poolstr);// true /* * 这里新声明并赋值了一个poolstr,值为常量池中的字符串"abc",将它和a.intern()和b.inten()比较就是和自身比较 */ String str = new String("a") + new String("b"); System.out.println(str.intern() == str);// true /* * str创建了3个对象,在堆中有一个"ab",在常量池中有一个"a"和"b" 比较str.intern()和str会得到true * 在jdk1.7之后,会在常量池中存一个指向堆中的那个对象的引用。 * 调用str.intern()会在常量池中存储一个指向堆中"ab"的引用,也就是说它和堆中的对象实际是等价的,因此==时返回true */ String strtwo = "ab"; System.out.println(strtwo == str);// true /* * 常量池中已存在ab,所以会直接将strtwo指向常量池中的"ab",即堆中str对象的引用,因此相等 */ } }

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

  • 11

  • 12

  • 13

  • 14

  • 15

  • 16

  • 17

  • 18

  • 19

  • 20

  • 21

  • 22

  • 23

  • 24

  • 25

  • 26

  • 27

  • 28

  • 29

  • 30

  • 31

  • 32

  • 33

  • 34

  • 35

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!**](https://bbs.csdn.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 9
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java String.intern() 方法会返回字符串对象在虚拟机的字符串池的引用(如果池已经包含了一个等于此 String 对象的字符串),否则,它会将此 String 对象添加到池,并且返回对此 String 对象的引用。字符串池是一个由 String 对象组成的集合,用于存储在程序反复使用的字符串。使用字符串池可以减少字符串对象的数量,从而节省内存空间。 举个例子: ``` String s1 = "Hello"; String s2 = "Hello"; String s3 = new String("Hello"); System.out.println(s1 == s2); // true System.out.println(s1 == s3); // false s3 = s3.intern(); System.out.println(s1 == s3); // true ``` 在上面的代码,由于 s1 和 s2 是相同的字面值,所以它们指向的是同一个字符串对象。但是 s3 是通过 new 运算符创建的新对象,所以 s1 和 s3 不是同一个对象。但是通过调用 s3.intern() 方法并将返回值赋给 s3,s3 就指向了字符串池的 "Hello" 字符串,所以 s1 和 s3 指向的是同一个对象。 ### 回答2: Twitter是一家全球著名的社交媒体平台,通过推文(tweets)的方式使用户能够分享自己的想法、看法、图片和链接等内容。String.internJava的一个方法,用于在运行时将字符串实例添加到内部字符串池,并返回对该字符串实例的引用。 在Twitter的背后,有一个庞大的后台系统,用于处理大量的用户数据和内容。在这个系统,处理字符串是非常常见的操作,因此String.intern方法在这里也发挥了重要的作用。 Twitter对String.intern的使用主要是为了优化内存和提高性能。由于用户在推文频繁使用相同的字符、词语和短语,将这些重复的字符串实例添加到内部字符串池可以减少内存消耗。而使用String.intern方法的返回值作为字符串的引用,可以提高字符串的比较效率,从而提高整个系统的性能。 除了内存和性能方面的优化,String.intern还能够在字符串比较时保证唯一性。当多个线程或不同的部分都使用了String.intern方法来获取字符串的引用时,它们得到的引用都是相同的。这样可以有效地避免同样的字符串被多次创建,并且可以确保在比较字符串时得到正确的结果。 综上所述,Twitter对String.intern的使用是为了优化内存、提高性能以及确保字符串的唯一性。通过将重复的字符串实例添加到内部字符串池,并使用String.intern方法返回的引用来进行字符串的操作,Twitter能够更高效地处理用户的大量数据和内容,提供更好的用户体验。 ### 回答3: Twitter对于String.intern()的使用要根据不同的情况。String.intern()方法会在字符串常量池查找是否存在相同值的字符串,如果存在则返回该字符串的引用,否则将该字符串添加到常量池并返回引用。 在Twitter,由于字符串的高频使用,使用String.intern()可以带来一些好处。首先,由于常量池的字符串只会存在一份,使用intern()可以节省内存空间。对于一些频繁创建的字符串对象,如标识符、URL等,通过intern()方法可以使这些对象在内存只存在一份,从而减少内存占用。 其次,使用String.intern()可以提高字符串的比较效率。由于常量池的字符串只存在一份,使用intern()方法可以通过引用比较来判断字符串是否相等,而不需要逐个字符比较的过程。这对于Twitter这样的大规模社交平台来说,可以在处理大量文本数据时提高效率。 然而,需要注意的是,对于较短的字符串或者不频繁使用的字符串,使用intern()可能造成性能损失。String.intern()方法需要在常量池进行查找和添加操作,这可能会消耗一定的时间和资源。因此,在使用intern()方法时需要权衡利弊,并根据实际情况来决定是否使用。 综上所述,Twitter在高频使用字符串的情况下,可以考虑使用String.intern()方法来节省内存和提高效率。但需要注意的是,在使用时需要根据具体情况进行权衡,并在性能损失较大的情况下避免使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值