String的intern()
预备知识:
- 对于jdk1.7以下的版本,常量池在方法区;对于jdk1.7及以上版本,常量池被放入到了堆空间中。
- 对象在堆区,对象引用在栈区,对象引用存储的是对象所在地址(对象访问有句柄方式和直接指针方式两种)。
- "=="用于判定两端的值是否相等。偷偷对值做一个定义:对于引用s来说,s的值表示s的内容所存放的地址。
以下参考SEU_Calvin的文章
String s = new String("1");//生成常量池中的“1” 和堆空间中的字符串对象,但引用s是指向堆区的对象的s.intern();//s对象去常量池中寻找后发现"1"已经存在于常量池中了String s2 = "1";//引用s2直接指向常量池中的“1”对象System.out.println(s.intern() == s2);//true。二者都指向常量池中的对象System.out.println(s == s2);//false。s指向堆区,s2指向常量池(对不同的jdk版本来说这都是两个位置)//注意:下面这句只在常量池中生成了"1",并没有在常量池中生成"11"String s3 = new String("1") + new String("1");//对于jdk1.7以下,s3.intern()的做法是直接在常量池中生成一个 "11" 对象;//对于jdk1.7及以上,s3.intern()直接在常量池中存储指向堆区的s3(这是个对象引用),// 注意在此之前常量池中没有“11”,如果有的话s3.intern()就会直接指向"11"在常量池中的位置,这一点不同jdk是一样的。System.out.println(s3==s3.intern());//true//去常量池中创建对象,但是已经被s3.intern()创建过了,// 所以其值等于s3.intern()创建的值,即s3的值String s4 = "11";//如果没有上面的s3.intern()语句的话下面的结果就会是false,//即与s3.intern()相比,String s4 = "11"这句代码不会考虑堆区已存在的s3对象System.out.println(s3 == s4);//true
以下参考Eric新之助的文章
StringBuilder的情形和String不太一样,StringBuilder并不对常量池进行操作。
String str1=new StringBuilder("计算机").append("软件").toString();//对jdk1.7及以上,下一条语句为true,即str1.intern()直接在常量池中存储了str1。//如果按照String的情况,如果上面一条语句在常量池分配了"计算机软件",//那么str1.intern()应指向常量池中的位置,下一条语句应该为false。System.out.println(str1.intern()==str1);String str2=new StringBuilder("ja").append("va").toString();//为false,"java"这个字符串在执行StringBuilder.toString()之前已经出现过,//字符串常量池中早已有它的引用。涉及JVM的初始化操作。System.out.println(str2.intern()==str2);
String的intern()相关推荐
- 运行时常量池_从String的intern()到常量池
前言 在知乎上遇到一个刚学Java就接触的字符串比较的问题: 通常,根据"==比较的是地址,equals比较的是值"介个定理就能得到结果.但是String有些特殊,通过new St ...
- String中intern的方法
原文地址:http://www.cnblogs.com/wanlipeng/archive/2010/10/21/1857513.html String中intern的方法 首先查看官方API那个的解 ...
- 字符斜杠是合法常量吗_【面试秘籍】你对String的intern方法了解吗
我们先来看个例子: public class StringTest { public static void main(String[] args) { String a = "A" ...
- Java中String类intern()详解
1.背景 在开发过程中很多朋友,由于不会正确使用intern(),导致开发的程序,执行效率比较差.同时最近发现一道非常有意思的关于intern()的面试题,这道面试题还是有不小的难度,相信很多朋友看到 ...
- Java之String系列--intern方法的作用及原理
原文网址:Java之String系列--intern方法的作用及原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中 ...
- Java String的intern方法
1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...
- intern string java_聊聊java String的intern
序 本文主要研究一下java String的intern String.intern() java.base/java/lang/String.java public final class Stri ...
- intern string java_Java-String.intern的深入研究
When---什么时候需要了解String的intern方法: 面试的时候(蜜汁尴尬)!虽然不想承认,不过面试的时候经常碰到这种高逼格的问题来考察我们是否真正理解了String的不可变性.String ...
- [转]String 之 new String()和 intern()方法深入分析
引入 String,是 Java 中除了基本数据类型以外,最为重要的一个类型了.很多人会认为他比较简单.但是和 String 有关的面试题有很多,下面我随便找两道面试题,看看你能不能都答对: Q1:S ...
- 深入了解String和intern
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String.这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念.常量池就类似一个JAVA系统级别提供的缓存. 8 ...
最新文章
- 1行Python代码制作动态二维码
- anaconda 设置python3为主_关于在Windows、Linux和Mac上安装设置Python的问题
- python27安装-linux安装python2.7
- 工作队列 order linux,linux 工作队列(workqueue)
- LeetCode之Sqrt(x)
- C++中 类与类之间的关系
- PhpStorm下Laravel代码智能提示
- C++中栈区 堆区 常量区
- 【java笔记】网络编程:文件上传案例
- BGP路由反射器原理及配置实例
- 数字化赋能全零售 国美按下战略加速键
- python累乘怎么写_Python3 实现列表元素求累和,求累乘
- 鼠标追踪技术:研究内部信息加工过程
- 分析Padavan的代码二
- Class6 基于ECS和NAS搭建个人网盘
- TMS运输系统价格昂贵?中小物流运输企业数字化,原来可以这么做。
- ORA-12505, TNS:listener does not currently know of SID given in connect descript
- Matplotlib进阶教程:布局讲解
- 因安装搜狗输入法而引发的一系列惨案
- 孙源的Runloop视频整理
热门文章
- Matlab调用ANSYS的三种方法
- 偏最小二乘法PLS分类,多输入单输出模型。
- Pycharm社区版下载与安装
- 【空间天气】中高层大气
- Ubuntu18.04安装g2o报错(bal_example.cpp:96:52: error: template argument 2 is invalid)
- 通俗易懂!看完你就是半个天线专家了
- iOS逆向 - 环境搭建
- 为什么是base64编码,而不是base32、base16、base63?
- 数字孪生工厂丨智慧工厂孪生驾驶舱,实现智能化精益生产管理
- 解决字符终端下fbterm打不开yong输入法的问题