String intern的理解
2024-09-08 18:32:27
String s1 = "Programming"; s1在栈内存中,Programming在常量池中。
String s2 = new String("Programming"); s2在栈内存中,new String("Programming")在堆内存中,Programming字面量在常量池中(方法区?还不太清楚是不是一回事)。
s1指向常量池,s2指向堆内存中的new对象,故s1==s2为false。
s3和s4和s1道理相同。
s5在JVM优化后同s1相同。故s1==s5为true。
s6相当于创建了新的对象,把s3+s4赋值给s6。
s1指向常量池,s6指向堆内存中的新创建对象,故s1==s6为false。
s6.intern(),首先检查s6的值是否在常量池中,如果在,则返回对常量池中的引用(此处是jdk1.7以上版本,以下的则是返回指向堆内存中的引用),如果不在则把值加入到常量池中后并返回指向常量池的引用。故s1==s6.intern()为true。
同理,s2.intern(),因常量池中已存在值,故返回指向常量池的引用,s2本身是指向堆内存的引用,故s2==s2.intern()为false。
最新文章
- 终端指令操作创建Django项目
- HTML之CSS学习
- 将一个Asp.Net网站改为MVC
- AngularJS - Passing data between pages
- 【随笔】从gitHub上获取源码
- wamp密码设置
- iOS开发备忘录:实现多StoryBoard之间跳转
- WCF与ASMX Web服务差异比较[译]
- PHP使用CURL上传|下载文件
- ./configure会报错:pr command not found
- C++ IO 详细用法
- BZOJ 1816: [Cqoi2010]扑克牌( 二分答案 )
- 转:【Java并发编程】之二:线程中断(含代码)
- OpenCV 透视变换实例
- 【链表问题】打卡9:将单链表的每K个节点之间逆序
- opencv学习之路(30)、分水岭算法及图像修补
- 20172302 《Java软件结构与数据结构》第七周学习总结
- win10更新后,可以远程桌面ping也没问题,但是无法访问共享文件夹的解决方法
- Access-Control-Allow-Origin实现跨域访问 跨域
- redis高可用 - redis集群