String的创建和常量池的关系,intern()相关问题
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()相关问题相关推荐
- JDK1.8+的String(字符串)常量池理解
在工作中使用String的地方很多,但是有时候会产生一点疑问,那就是项目中用到了这么多String,会不会对内存造成一定的压力,会不会降低程序的性能,字符串的值都存放到哪里去了?所以就深入了解了一下. ...
- JVM_04 字符串常量池(详解intern( ))
一.String的基本特性 String:字符串,使用一对""引起来表示. String sl = "hello"://字面量的定义方式 String s2 = ...
- Java中String类、字符串常量池、字符串常用方法
String类: String代表字符串类,java中所有双引号中的内容都称为字符串,如:"hello".字符串是不可改变的,因此字符串是可以共享使用的,相当于char字符数组,但 ...
- 使用枚举创建枚举常量池
date: 2018/11/12 10:08:31 常量类:常量枚举 /*** @description: 枚举常量由相当的优势相对于类常量(项目中推荐优先使用枚举常量)* @Author: yim* ...
- java 常量池 和 堆 的关系_Java堆、栈和常量池以及相关String的详细讲解(经典中的经典)...
博客分类: Java综合 一:在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register). 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有 ...
- 运行时常量池_从String的intern()到常量池
前言 在知乎上遇到一个刚学Java就接触的字符串比较的问题: 通常,根据"==比较的是地址,equals比较的是值"介个定理就能得到结果.但是String有些特殊,通过new St ...
- java string 常量池_用了这么久Java String,你真的懂字符串常量池吗?
字符串问题可谓是 Java 中经久不衰的问题,尤其是字符串常量池经常作为面试题出现.可即便是看似简单而又经常被提起的问题,还是有好多同学一知半解,看上去懂了,仔细分析起来却又发现不太明白. 本文以 J ...
- 字符串equal_Java String:字符串常量池
作者:Seven_Nee 来自:https://segmentfault.com/a/1190000009888357 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以 ...
- Java String 常量池理解
Java String 常量池理解 String:字符串常量池 作为最基础的引用数据类型,Java 设计者为 String 提供了字符串常量池以提高其性能,那么字符串常量池的具体原理是什么,我们带着以 ...
- Java中,那些关于String和字符串常量池你不得不知道的东西
老套的笔试题 在一些老套的笔试题中,会要你判断s1==s2为false还是true,s1.equals(s2)为false还是true. String s1 = new String("xy ...
最新文章
- 关于SpringMVC和Struts2的区别
- iwork11旗舰版 linux,苹果 iWork 11 套件来了,Pages/Numbers/Keynote iOS/macOS 版大升级
- 好程序员大数据培训技术分享:Hadoop集群同步
- Node.js:Web模块、文件系统
- 算法每日学打卡:java语言基础题目打卡(19-21)
- 基于ARM A53开发板,使用按键中断及中断底半部实现《led灯状态取反》的驱动
- 最短路径问题 --- Dijkstra算法详解
- PYPL 12月榜单发布,编程语言、IDE与数据库市场如何?
- android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果
- X-Mas Musings –在Grails集成测试中不要使用随机服务器端口
- linux增加调整虚拟内存
- Ural 1627 Join(生成树计数)
- nacos 本地测试_本地调试和服务器调试都无法连通-问答-阿里云开发者社区-阿里云...
- 给大家推荐一本书啊啊~
- Android 科大讯飞、语音听写集成指南
- java电商网站源码_java 的电商系统的完整源码+文档
- 回溯法 子集和问题
- csharp基础练习题:卡塔劳尔【难度:1级】--景越C#经典编程题库,不同难度C#练习题,适合自学C#的新手进阶训练
- 计算机运行异常怎么办,电脑开机出现windows错误恢复怎么办
- SpringBoot 就这一篇全搞定