String对象创建的几种方式及创建过程中和String常量池的交互

1."" :最简单的创建方式;先判断常量池中是否有此字符串:没有 在常量池创建,返回常量池中的地址;有:直接返回常量池中的地址
2. new String(""):等价于""+new String(param);先判断常量池中是否有此字符串:没有 先在常量池创建,再在堆上创建,返回堆地址;有:只在堆上创建,返回堆地址
3. new String(param):先判断常量池中是否有此字符串:没有 在堆上创建,返回堆地址(jdk1.7+可能会被加入到常量池);有:只在堆上创建,返回堆地址
4. +:连接两个编译期可确定(""+"“或者两个final类型的变量)的两个变量等价于”";其他+相当于调用StringBuilder的append()方法,本质new String(param)

intern()方法

官方注释 :When the intern method is invoked, if the pool already contains a string equal to this {@code String} object as determined by the {@link #equals(Object)} method, then the string from the pool is returned. Otherwise, this {@code String} object is added to the pool and a reference to this {@code String} object is returned.
当调用intern方法时,如果池中已经包含了一个与这个对象相等的字符串,则返回池中的字符串。否则,将这个对象添加到池中,并返回对这个对象的引用.不存在时jdk1.6将该对象的copy加入到常量池,返回常量池中的地址(多创建一个对象在常量池);jdk1.7将该对象加入到常量池,返回常量池中的地址(同一个对象).

下面看一些String的面试题

        String s1 = "Hel" + new String("lo");String s2 = s1.intern();String s3 = "Hello";String s4 = "Hel" + "lo";String s5 = new String("Hello");String s6 = s5.intern();String s7 = "H";String s8 = "ello";String s9 = s7 + s8;final String s10 = "H";final String s11 = "ello";String s12 = s10 + s11;//jdk1.7+结果System.out.println(s3 == s1);// trueSystem.out.println(s3 == s2);// trueSystem.out.println(s3 == s4);// trueSystem.out.println(s3 == s5);// falseSystem.out.println(s3 == s6);// trueSystem.out.println(s3 == s9);// falseSystem.out.println(s3 == s12);// true//jdk1.6结果System.out.println(s3 == s1);// falseSystem.out.println(s3 == s2);// trueSystem.out.println(s3 == s4);// trueSystem.out.println(s3 == s5);// falseSystem.out.println(s3 == s6);// trueSystem.out.println(s3 == s9);// falseSystem.out.println(s3 == s12);// true

jdk1.7+测试常量池中是否有某一个常量

 //判断常量池是否有helloString s1 = "he";String s2 = "llo";String s3 = new String(s1) + new String(s2);String s4 = s3.intern();System.out.println(s3==s4);//true:不存在,false:存在//判断常量池是否有b(字符串"b",不是字符'b')char[] cs1 = { 'b' };String s1 = new String(cs1);String s2 = s1.intern()System.out.println(s1 == s2);//true:不存在,false:存在

另外jdk1.8常量池中内置一些字符串(a,10,11,12,java等等)

        String s1 = new String("ja") + new String("va");String s2 = new String("he") + new String("llo");//jdk1.7System.out.println(s1 == s1.intern());// trueSystem.out.println(s2 == s2.intern());// true//jdk1.8System.out.println(s1 == s1.intern());// falseSystem.out.println(s2 == s2.intern());// true

String的创建和常量池的关系,intern()相关问题相关推荐

  1. JDK1.8+的String(字符串)常量池理解

    在工作中使用String的地方很多,但是有时候会产生一点疑问,那就是项目中用到了这么多String,会不会对内存造成一定的压力,会不会降低程序的性能,字符串的值都存放到哪里去了?所以就深入了解了一下. ...

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

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

  3. Java中String类、字符串常量池、字符串常用方法

    String类: String代表字符串类,java中所有双引号中的内容都称为字符串,如:"hello".字符串是不可改变的,因此字符串是可以共享使用的,相当于char字符数组,但 ...

  4. 使用枚举创建枚举常量池

    date: 2018/11/12 10:08:31 常量类:常量枚举 /*** @description: 枚举常量由相当的优势相对于类常量(项目中推荐优先使用枚举常量)* @Author: yim* ...

  5. java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...

    博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有 ...

  6. 运行时常量池_从String的intern()到常量池

    前言 在知乎上遇到一个刚学Java就接触的字符串比较的问题: 通常,根据"==比较的是地址,equals比较的是值"介个定理就能得到结果.但是String有些特殊,通过new St ...

  7. java string 常量池_用了这么久Java String,你真的懂字符串常量池吗?

    字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 本文以 J ...

  8. 字符串equal_Java String:字符串常量池

    作者:Seven_Nee 来自:https://segmentfault.com/a/1190000009888357 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以 ...

  9. Java String 常量池理解

    Java String 常量池理解 String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以 ...

  10. Java中,那些关于String和字符串常量池你不得不知道的东西

    老套的笔试题 在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true. String s1 = new String("xy ...

最新文章

  1. 关于SpringMVC和Struts2的区别
  2. iwork11旗舰版 linux,苹果 iWork 11 套件来了,Pages/Numbers/Keynote iOS/macOS 版大升级
  3. 好程序员大数据培训技术分享:Hadoop集群同步
  4. Node.js:Web模块、文件系统
  5. 算法每日学打卡:java语言基础题目打卡(19-21)
  6. 基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动
  7. 最短路径问题 --- Dijkstra算法详解
  8. PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?
  9. android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果
  10. X-Mas Musings –在Grails集成测试中不要使用随机服务器端口
  11. linux增加调整虚拟内存
  12. Ural 1627 Join(生成树计数)
  13. nacos 本地测试_本地调试和服务器调试都无法连通-问答-阿里云开发者社区-阿里云...
  14. 给大家推荐一本书啊啊~
  15. Android 科大讯飞、语音听写集成指南
  16. java电商网站源码_java 的电商系统的完整源码+文档
  17. 回溯法 子集和问题
  18. csharp基础练习题:卡塔劳尔【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
  19. 计算机运行异常怎么办,电脑开机出现windows错误恢复怎么办
  20. SpringBoot 就这一篇全搞定

热门文章

  1. 机器学习算法总结(六)——EM算法与高斯混合模型
  2. bzoj1927最小费用最大流
  3. 携程第二场预赛 1003:位图像素的颜色(水题,判断点是否在矩形内)
  4. CentOS 关闭蜂鸣器声音
  5. HCIE-Security Day27:IPSec:实验(二)两个网关之间通过手工方式创建IPSec PN隧道
  6. shell第二次练习
  7. yum安转软件包提示nokey错误时的处理办法。
  8. 深度强化学习DQN(Deep Q Network)原理及例子:如何解决迷宫问题,附源码
  9. 玛莎拉蒂品牌与酷客多小程序达成官方合作!
  10. Linux C Serial串口编程