本文基于jdk8

使用双引号声明的字符串
使用双引号声明的字符串,先在常量池中查找。如果有相同的,就直接把引用返回;否则就在常量池中创建并返回引用

        //因为用双引号声明的String对象会直接放在常量池中。String s1 = "abc";//常量池中的引用String s2 = "abc";//常量池中的引用//使用双引号声明的字符串,先在常量池中查找,//如果有相同的,就直接把引用返回,如果没有就在常量池中创建并返回引用System.out.println(s1 == s2);//true

使用new关键字创建的字符串
采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有该字符串,如果有则在堆中创建对象返回堆中的引用;如果常量池中没有该字符串则先在常量池中创建字符串,之后在在堆中创建字符串对象,并返回堆中的引用

        //采用new关键字新建一个字符串对象时,JVM首先在字符串池中查找有没有"xyz"这个字符串对象,// 如果有,则不在池中再去创建"xyz"这个对象了,直接在堆中创建一个"xyz"字符串对象,// 然后将堆中的这个"xyz"对象的地址返回赋给引用s3,// 这样,s3就指向了堆中创建的这个"xyz"字符串对象;// 如果没有,则首先在字符串池中创建一个"xyz"字符串对象,然后再在堆中创建一个"xyz"字符串对象,// 然后将堆中这个"xyz"字符串对象的地址返回赋给s3引用,// 这样,s3指向了堆中创建的这个"xyz"字符串对象。s4则指向了堆中创建的另一个"xyz"字符串对象。// s3 、s4是两个指向不同对象的引用,结果当然是falseString s3 = new String("xyz");//在常量池中创建xyz,在堆中创建对象并返回引用String s4 = new String("xyz");//在堆中创建对象并返回引用System.out.println(s3 == s4);//false

s.intern()的作用
如果常量池中没有该字符串,调用了该方法,会将常量池中开辟空间,里面保存堆中字符串的地址

{//在常量池中创建“1”字符串,并且在堆中创建字符串1对象,s1是堆中的引用String s1 = new String("1");String s3 = s1.intern(); //s3是常量池中的引用String s2 = "1"; //s2是常量池中的引用System.out.println(s1 == s2);//falseSystem.out.println(s2 == s3);//trueSystem.out.println(s1 == s3);//false//第二种情况// 第一个new String("1")先在常量池中创建“1”,在堆中创建“1”对象。// 第二个new String("1")因为常量池中已经有“1”了,常量池中就不创建了,在堆中创建“1”;// 因为用加号连接了所以在堆中还要创建“11”对象,s3是堆中的11对象String s3 = new String("1") + new String("1"); // 常量池中没有11,先创建(并不是创建“11”,而是存储堆中的引用)再返回常量池中的引用。String s5 = s3.intern();String s4 = "11";//直接返回常量池的引用System.out.println(s3 == s4);//true// s3指向的是堆中的11对象String s3 = new String("1") + new String("1");// s5指向的常量池中的地址,该地址存的是堆中11对象的引用,String s5 = s3.intern();// s4指向常量池中的地址String s4 = "11";// 因为常量池的保存的是堆中的引用,三个变量指向是一样的System.out.println(s5 == s3);//trueSystem.out.println(s5 == s4);//trueSystem.out.println(s3 == s4);//trueSystem.out.println("======================");//        String s6 = new String("go") +new String("od");
//        String s7 = s6.intern();
//        String s8 = "good";
//        System.out.println(s6 == s7);//true
//        System.out.println(s7 == s8);//true
//        System.out.println(s6 == s8);//trueString s1 = "Hello";//直接在常量池中创建“hello”//现在常量池中创建He,之后再堆中创建He//之后在常量池中创建llo//因为常量池中已经有hello了,所以不再常量池中创建了,直接在堆中创建hello;String s2 = new StringBuffer("He").append("llo").toString();String s3 = s2.intern();//返回常量池中的引用。System.out.println("s1 == s2? " + (s1 == s2));//falseSystem.out.println("s1 == s3? " + (s1 == s3));//trueString m = "hello,world";String n = "hello,world";String u = new String(m);String v = new String("hello,world");System.out.println(m == u); //false m是常量池中的,u是堆中的,并不相等System.out.println(u == v); //false u,v是堆中的不同对象,并不相等// 发现原来是在JVM启动的时候调用了一些方法,在常量池中已经生成了"java"字符串常量,
//        String s2 = new String("ja") + new String("va");
//        String s3 =  s2.intern();
//        String s4 = "java";
//        System.out.println(s2 == s3);//false
//        System.out.println(s3 == s4);//true}

String:字符串常量池详解相关推荐

  1. JVM——字符串常量池详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   在Java开发中不管是前后端交互的JSON串,还是数据库中的数据存储,我们常常需要使用到String类型的字符串.作为最常用也是 ...

  2. JVM_04 字符串常量池(详解intern( ))

    一.String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式 String s2 = ...

  3. Java字符串常量池详解(StringTable)

    前言:在介绍字符串常量池之前,我们先来简单了解下Java中字符串的概念以及常见的一些问题. 参考书籍: <Java核心技术> 参考网站:牛客 作者水平很有限,如果发现错误,麻烦及时告知作者 ...

  4. 《性能调优之JVM》❤️04JVM常量池详解之深入理解Class常量池、运行时常量池、字符串常量池、八种基本数据类型的包装类和对象池

    JVM常量池详解 一.Class常量池 1.1字面量 1.2符号引用 二.运行时常量池 三.字符串常量池 3.1设计思想 3.2设计原理 3.3字符串常量池位置 3.4三种字符串操作 四.八种基本数据 ...

  5. java class文件常量池_《Java虚拟机原理图解》 1.2.3、Class文件中的常量池详解(下)...

    Java内存区域         1.程序计数器(Program Counter Register)(线程私有的)         2.Java虚拟机栈 (Java Virtual Machine S ...

  6. 常量池详解(含栈、堆、方法区简析)

    1 位置分布图 2 内存区域类型 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制: 堆:存放所有new出来的对象: 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈 ...

  7. java 常量池详解

    参考资料:http://chenzehe.iteye.com/blog/1727062 注意: 1.首先,我们平时在讨论字符串新建问题时所说的常量池其实指的是字符串常量池.并不是运行时常量池,更加不是 ...

  8. jvm中方法区和常量池详解_Java常量池(静态常量池与运行时常量池)

    1.什么是常量 用final修饰的成员变量表示常量,值一旦给定就无法改变! final修饰的变量有三种:静态变量.实例变量和局部变量,分别表示三种类型的常量. Java中的常量池,实际上分为两种形态: ...

  9. String 字符串常量池

    java.lang.String类的使用 1.概述 String:字符串,使用一对""引起来表示. 1.String声明为final的,不可被继承 2.String实现了Seria ...

  10. JDK1.8 String常量池详解

    jdk 1.8 先抛结论 1.只在常量池上创建常量 2.只在堆上创建对象 3.在堆上创建对象,在常量池上创建常量 4.在堆上创建对象,在常量池上创建引用 注意: 常量池有两种情况:引用(指针) 或 常 ...

最新文章

  1. 马斯克炮轰微软:OpenAI不是你的工具人
  2. 自己的电脑上怎么用python-如何做一个任何电脑都能用的python程序?
  3. 使用Fiddler解析WCF RIA Service传输的数据
  4. java前后端用json传值_前后端——json的传值与接收(springMvc)
  5. jquery 选择器,模糊匹配
  6. redis——持久化
  7. cmake could not find openssl_使用CMake构建C++项目
  8. atcoder 2643 切比雪夫最小生成树
  9. ios UITableview 刷新某一个cell 或 section
  10. 用C语言多线程描述哲学家,并行程序设计-哲学家就餐问题
  11. 有才!学生发文言文请假条,老师连称赞
  12. CKEditor富文本编辑器使用
  13. 泡妞高手的经典三十六计
  14. 10个让你相见恨晚的iOS Swift动画框架!
  15. Encrypt加密解密
  16. 自适应滤波:递归最小二乘
  17. 关于计算机的英语作文初中,关于电脑的英语作文
  18. Android studio 利用MPAndroidChart制作饼图
  19. Linux运维与架构工程实践
  20. Reflex WMS入门系列十八:如何看年终盘点的Inventory report数据?

热门文章

  1. mysql where 中能否使用update_mysql – 可以在WHERE中执行UPDATE子句吗?
  2. 算法:移除数组中的数字,不用额外空间27. Remove Element
  3. Mac OS 区块链hyperledger环境搭建、环境架构介绍、环境如何用、部署 Chaincode、智能合约的调用
  4. hadoop 如何连beeline_Hadoop家族新成员Hbase重磅来袭
  5. Python全局解释锁
  6. 随机过程第二章part2
  7. Pycharm连接远程服务器环境搭建
  8. 好题汇总(持续更新)
  9. Linux sed命令之删除文件第一行,第n行
  10. Neural NILM: Deep Neural Networks Applied to Energy Disaggregation