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 void main(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()方法的更多相关文章

  1. java String 中 intern方法的概念

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

  2. String 的intern() 方法说明

    1.说明 Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 2.源码说明 public native ...

  3. 通过反编译深入理解Java String及intern(转)

    通过反编译深入理解Java String及intern 原文传送门:http://www.cnblogs.com/paddix/p/5326863.html 一.字符串问题 字符串在我们平时的编码工作 ...

  4. 通过反编译看Java String及intern内幕--费元星站长

    通过反编译看Java String及intern内幕   一.字符串问题 字符串在我们平时的编码工作中其实用的非常多,并且用起来也比较简单,所以很少有人对其做特别深入的研究.倒是面试或者笔试的时候,往 ...

  5. String 的 intern() 方法解析

    一.概述 JDK7 之前和之后的版本,String 的 intern() 方法在实现上存在差异,本文的说明环境是 JDK8,会在文末说明 intern() 方法的版本差异性. intern() 方法是 ...

  6. String中intern方法的作用

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

  7. String的intern方法的使用场景

    在讲intern方法前,我们先简单回顾下Java中常量池的分类. 常量池的分类 Java中常量池可以分为Class常量池.运行时常量池和字符串常量池. 1. Class文件常量池 在Class文件中除 ...

  8. Java - 记录String中intern()方法的学习与理解

    intern()方法:把堆中的引用丢入常量池中,然后返回这个引用.当常量池中已经存在这个引用,就直接返回这个引用.(jdk1.8) 由于jdk1.7中将字符串常量池改为存放在堆中,因此intern() ...

  9. String的intern方法的用处

    今天第一次翻看Effective java,在其第一个item中讲静态工厂方法的有点的时候说到“它们每次被调用 的时候,不要非得创建一个新的对象”并在结尾处提到---"String.inte ...

随机推荐

  1. 2019.3.22 Week 11 : ZigBee power test and field test

    Test require Zigbee sample:EFR32MG13  (RF layout has ) Gateway N4010A : 2.5Ghz 1Power test 2Field te ...

  2. error_log

    对于我们做php开发的人员,上了生产环境,一定要把相关debug,display_errors错误提示等关掉.谁还难免不犯个错呢?这样能防止非致命性报错下,导致项目路径.数据库等信息泄漏. 问:那么问 ...

  3. async/await学习笔记

    async/await 的目的是简化使用 promises 的写法.     让我们来看看下面的例子: // 一个标准的 JavaScript 函数 function getNumber1() { r ...

  4. 如何通过创建切片器窗格节省PowerBI报告空间

    许多用户在使用Power BI的过程中,都会有这么一个困扰:在Power BI 开发中,切片器一旦过多就会占用非常多的空间.发生这种情况时,您显示数据的页面也会更加小.但另一方面,如果您没有切片器,报 ...

  5. 【linux基础】linux远程登录

    可以用ssh命令行方式登录.对方需要开启ssh服务. 1. https://blog.csdn.net/zilaike/article/details/78922524 2. https://blog ...

  6. WEBBASE篇: 第二篇, HTML知识2

    HTML知识2 <!doctype html> <html lang="en"> <head> <meta charset="U ...

  7. php-fpm高并发配置[1000+]

    Dell R430 2个物理CPU,每个CPU有6个内核: www.conf: pm = dynamic pm.max_children = 120 pm.start_servers = 8 pm.m ...

  8. Beta周第14次Scrum会议(11/23)【王者荣耀交流协会】

    一.小组信息 队名:王者荣耀交流协会 小组成员 队长:高远博 成员:王超,袁玥,任思佳,王磊,王玉玲,冉华 小组照片 二.开会信息 时间:2017/11/23 17:02~17:14,总计12min. ...

  9. KMP算法自我理解 和 模板

    字符串   abcd abc abcd abc 匹配串   cdabcd 匹配串的 next  0 0 0 0 1 2: 开始匹配 abcd abc abcd abc cd abc d a,d 匹配失 ...

  10. Centos6.8 搭建Tomcat服务器

    Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,是一个可以提供web服务同时也支持Servlet的JSP服务器. ...