博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java String类中的intern()方法
阅读量:6679 次
发布时间:2019-06-25

本文共 1171 字,大约阅读时间需要 3 分钟。

  今天在看一本书的时候注意到一个String的intern()方法,平常没用过,只是见过这个方法,也没去仔细看过这个方法。所以今天看了一下。个人觉得给String类中加入这个方法可能是为了提升一点点性能,因为从常量池取数据比从堆里面去数据要快一些。(个人感觉)

  API上的那几句关于这个方法,其实总结一句就是调用这个方法之后把字符串对象加入常量池中,常量池我们都知道他是存在于方法区的,他是方法区的一部分,而方法区是线程共享的,所以常量池也就是线程共享的,但是他并不是线程不安全的,他其实是线程安全的,他仅仅是让有相同值的引用指向同一个位置而已,如果引用值变化了,但是常量池中没有新的值,那么就会新开辟一个常量结果来交给新的引用,而并非像线程不同步那样,针对同一个对象,new出来的字符串和直接赋值给变量的字符串存放的位置是不一样的,前者是在堆里面,而后者在常量池里面,另外,在做字符串拼接操作,也就是字符串相"+"的时候,得出的结果是存在在常量池或者堆里面,这个是根据情况不同不一定的,我写了几行代码测试了一下。

  先上结果:

    1.直接定义字符串变量的时候赋值,如果表达式右边只有字符串常量,那么就是把变量存放在常量池里面。

    2.new出来的字符串是存放在堆里面。

    3.对字符串进行拼接操作,也就是做"+"运算的时候,分2中情况:

      i.表达式右边是纯字符串常量,那么存放在栈里面。

      ii.表达式右边如果存在字符串引用,也就是字符串对象的句柄,那么就存放在堆里面。

    String str1 = "aaa";        String str2 = "bbb";        String str3 = "aaabbb";        String str4 = str1 + str2;        String str5 = "aaa" + "bbb";        System.out.println(str3 == str4); // false        System.out.println(str3 == str4.intern()); // true        System.out.println(str3 == str5);// true

  结果:str1、str2、str3、str5都是存在于常量池,str4由于表达式右半边有引用类型,所以str4存在于堆内存,而str5表达式右边没有引用类型,是纯字符串常量,就存放在了常量池里面。其实Integer这种包装类型的-128 ~ +127也是存放在常量池里面,比如Integer i1 = 10;Integer i2 = 10; i1 == i2结果是true,估计也是为了性能优化。

转载地址:http://ysyao.baihongyu.com/

你可能感兴趣的文章
mysql设置远程访问
查看>>
Extjs4中tree的拖拽功能(可以两棵树之间拖拽) 简单实例
查看>>
VDR 2.0安装部署
查看>>
jackjson解决 Unrecognized field
查看>>
百度ueditor 1.4.3 jsp开发版简单配置及图片上传
查看>>
git使用
查看>>
日志分析-2.发送windows日志到一个远程的rsyslog服务器上
查看>>
分析现在互联网上信息可信性的现状
查看>>
centos 安装yum网络源
查看>>
Android JSBridge的原理与实现
查看>>
基于Spring Boot + Dubbo的全链路日志追踪(一)
查看>>
002 centos 安装hadoop
查看>>
puppet on windows
查看>>
岁末说安全 详解U-Mail邮件服务器多重防护盾
查看>>
数组顺序存储二叉树
查看>>
excel導出框架
查看>>
maven 编译 run test的时候控制台输出乱码信息
查看>>
SpringMVC实现上传和下载
查看>>
C#基础知识整理:基础知识(14) 数组
查看>>
HashMap源码理解
查看>>