intern()方法用于将字符串对象加入常量池中。

public native String intern();

intern()方法返回的是一个常量池中的String对象(即常量池中某个String对象的引用)。

String s = new String("1");

s.intern();

s是一个位于堆中的String对象,其字符串值为 "1" , 调用s的intern()方法,可在常量池中创建一个字符串值与s相同的String对象。

创建过程为:

首先查找常量池中是否已存在值为 "1" 的String对象,若存在则返回该对象。

若不存在,在JDK1.6及之前,会在常量池中创建一个新的值为 "1" 的String对象,并返回该对象。

在JDK1.7及之后,会将s的引用添加至常量池中,堆中的String对象s间接的成为了常量池中的一员,此时返回的是对象s。

示例:

public static voidmain(String[] args) {

String s= new String("1");

s.intern();

String s2= "1";

System.out.println(s==s2);

String s3= new String("1") + new String("1");

s3.intern();

String s4= "11";

System.out.println(s3==s4);}

jdk1.6下输出结果为 false  false

jdk1.7下输出结果为 false  true

jdk1.6下解释:

jdk6中的常量池是放在 Perm 区中的,Perm区和正常的 JAVA Heap 区域是完全分开的。使用引号声明的字符串都是会直接在字符串常量池中生成,而 new 出来的 String 对象是放在 JAVA Heap 区域。

String s = new String("1"); 创建了两个String对象,一个位于堆中即是s,一个位于常量池中,值为"1"。

String s2 = "1"; 由于常量池中已经存在值为"1"的String对象,所以s2指向的是常量池中的String对象。

所以s == s2 结果为false,s与s2指向的并不是同一个对象。

String s3 = new String("1") + new String("1"); 在堆中创建了一个值为"11"的String对象即是s3。

s3.intern();由于常量池中没有值为"11"的String对象,所以在池中创建了一个。

String s4 = "11";常量池中已经存在值为"11"的String对象,所以s4指向了常量池中的String对象。

所以s3 == s4 结果为false,s3与s4指向的并不是同一个对象。

jdk1.7下解释:

String s = new String("1");

s.intern();

String s2= "1";

System.out.println(s==s2);

String s3= new String("1") + new String("1");

s3.intern();

String s4= "11";

System.out.println(s3==s4);

System.out.println(s3.intern()== s3);

在 jdk7 及以后的版本中,字符串常量池从Perm区移到Java Heap区域。

String s = new String("1"); 创建了两个String对象,一个位于堆中即是s,一个位于常量池中,值为"1"。

String s2 = "1"; 由于常量池中已经存在值为"1"的String对象,所以s2指向的是常量池中的String对象。

所以s == s2 结果为false,s与s2指向的并不是同一个对象。

String s3 = new String("1") + new String("1"); 在堆中创建了一个值为"11"的String对象即是s3。

s3.intern();由于常量池中没有值为"11"的String对象,所以在常量池中添加对象s3的引用。

String s4 = "11";常量池中已经存在值为"11"的String对象(这个对象实际是s3),所以s4指向了s3指向的String对象。

所以s3 == s4 结果为true,s3与s4指向的是同一个对象,都是堆中值为 "11" 的String对象。

其它示例:

//在堆中创建了一个值为"11"的String对象即是s3

String s3 = new String("1") + new String("1");//常量池中没有值为"11"的String对象//所以在池中创建了一个新的String对象

String s4 = "11";//常量池中存在值为"11"的String对象,即是s4指向的对象//intern返回s4指向的对象

s3.intern();//intern返回的是s4指向的对象

System.out.println(s3.intern() == s4); //true//s3指向的是堆中的对象//s4指向的是常量池中新建的对象//故结果为false

System.out.println(s3 == s4); //false

String str1 = new String("Hello") + new String("World");

System.out.println(str1.intern()== str1); //true

String str2 = "HelloWorld";

System.out.println(str1== str2); //true

String str2 = "HelloWorld";

String str1= new String("Hello") + new String("World");

System.out.println(str1.intern()== str1); //false

System.out.println(str1 == str2); //false

java的string的intern_java String的intern()方法相关推荐

  1. String中intern方法的作用

    前言 读完这篇文章你可以了解,String对象在虚拟机内存中的存放,intern的作用,这么多String对象的创建到底有什么区别,String 创建的对象有几个!! 进入正题 先科普几个知识点 1. ...

  2. java intern_java String的intern方法

    我们知道再jvm的运行时内存可以分为堆.方法区.程序计数器.虚拟机栈和本地方法栈.而在方法区中有一个字符串常量池,用来保存字符串这个不可变量.如果我们使用String str=new String(& ...

  3. Java提升篇:理解String 及 String.intern() 在实际中的应用

    String的深入解析 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些 ...

  4. 关于Java中String类的intern()方法

    首先intern()方法的定义:当调用这个方法的时候,如果字符串常量池中有这个对象,就把常量池中的这个对象返回,没有就把当前对象加入到常量池并且返回当前对象的引用: jdk1.6之前:将对象存入常量池 ...

  5. java 创建string对象机制 字符串缓冲池 字符串拼接机制 字符串中intern()方法...

    字符串常量池:字符串常量池在方法区中 为了优化空间,为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池.如果字符串已经存在池中,就 ...

  6. JAVA中String类的intern()方法的作用

    2019独角兽企业重金招聘Python工程师标准>>> 一般我们变成很少使用到 intern这个方法,今天我就来解释一下这个方法是干什么的,做什么用的 首先请大家看一个例子: [ja ...

  7. Java技术——你真的了解String类的intern()方法吗

    0.引言 什么都先不说,先看下面这个引入的例子: [java] view plain copy String str1 = new String("SEU")+ new Strin ...

  8. Java之String系列--intern方法的作用及原理

    原文网址:Java之String系列--intern方法的作用及原理_IT利刃出鞘的博客-CSDN博客 简介 本文介绍Java的String的intern方法的原理. 常量池简介 在 JAVA 语言中 ...

  9. Java String的intern方法

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. ne ...

  10. java String的intern()方法

    本文已参与「新人创作礼」活动,一起开启掘金创作之路. 本文章所用jdk版本为jdk1.8 先看第一个例子 public class HelloWorld {public static void mai ...

最新文章

  1. Java线程的两种实现方式
  2. 【原创】用户空间死循环导致memcached访问变慢问题排查
  3. mysql默认几个库_MySQL 安装初始化mysql后,默认几个库介绍
  4. python怎么安装本地的egg_python egg怎么安装
  5. [云炬创业基础笔记] 第四章测试4
  6. eclipse android开发环境搭建_聊聊Spring boot2.X开发环境搭建和基本开发
  7. 开源sip客户端 linux,开源SIP服务器 Kamailio
  8. 《C和指针》读书笔记
  9. Spring boot升级到2.3.2.Release和Spring framework升级到5.28.Release踩过的坑
  10. Mac 实用开发工具
  11. 阿里云的工程师要被祭天了?
  12. poj 2406 Power Strings(KMP)
  13. 我是如何次次《头脑王者》获得满分的
  14. 《猎头局中局》作者萧东楼访谈摘录
  15. 不同终端通信用c语言实现,采用蓝牙技术的北斗终端通信模块的设计
  16. 【Java:JDBC+MySQL实现学生信息管理系统】
  17. 播放量破4亿。《梦华录》创2022年国产剧豆瓣最高开分,它凭何爆火?
  18. CMD命令行高级教程精选合编合集
  19. 基于RTL—SDR及Simulink的FM收音机仿真
  20. 学python历程中

热门文章

  1. setup maven plugin connection
  2. Win7更换锁屏和开机画面
  3. 蓝桥杯 算法训练 寂寞的数
  4. 神策 FM | 桑文锋:2018,行与思
  5. 2018年清华美院交叉学科保研面试经验
  6. AntD Pro Footer自定义
  7. Python Pandas PK esProc SPL,谁才是数据预处理王者?
  8. 在64位win10中开启64位ie浏览器的方法(IE11)
  9. 服务器通过无线modem接入4g网络,24-4G Modem管理配置
  10. face++ 行驶证OCR识别