前言
  本文的测试环境是JDK1.8。

String.intern()分析在文中偏后
一.创建字符串分析
1.直接使用双引号创建字符串

判断这个常量是否存在于常量池,
  如果存在,
   判断这个常量是存在的引用还是常量,
    如果是引用,返回引用地址指向的堆空间对象,
    如果是常量,则直接返回常量池常量,
  如果不存在,
    在常量池中创建该常量,并返回此常量

     String a1 = "AA";//在常量池上创建常量AAString a2 = "AA";//直接返回已经存在的常量AASystem.out.println(a1 == a2); //trueString a3 = new String("AA");    //在堆上创建对象AAa3.intern(); //在常量池上创建对象AA的引用String a4 = "AA"; //常量池上存在引用AA,直接返回该引用指向的堆空间对象,即a3System.out.println(a3 == a4); //false,如果这个例子不理解,请看完整篇文章再回来看这里

2.new String创建字符串

首先在堆上创建对象(无论堆上是否存在相同字面量的对象),
 然后判断常量池上是否存在字符串的字面量,
  如果不存在
   在常量池上创建常量
  如果存在
   不做任何操作

String a1 = new String("AA");
String a2 = new String("AA");
System.out.println(a1 == a2); //false//如果常量池上不存在常量AA,也不存在引用AA,则创建常量AA
String a1 = new String("AA");
System.out.println(a1 == a1.intern()); //false

3.双引号相加

判断这两个常量、相加后的常量在常量池上是否存在
  如果不存在
   则在常量池上创建相应的常量
  如果存在
   判断这个常量是存在的引用还是常量,
    如果是引用,返回引用地址指向的堆空间对象,
    如果是常量,则直接返回常量池常量,

String a1 = "AA" + "BB";//在常量池上创建常量AA、BB和AABB,并返回AABB//常量池上存在常量AABB
String a2 = "AABB";
String a3 = "AA" + "BB";
System.out.println(a2 == a3); //true
//常量池上存在引用AABB
String a4 = new String("AA") + new String("BB"); //在堆上创建对象AA、BB和AABB,在常量池上创建常量AA和BB
a4.intern();
String a5 = "AA" + "BB";
System.out.println(a4 == a5); //true

4.两个new String相加

首先会创建这两个对象以及相加后的对象
 然后判断常量池中是否存在这两个对象的字面量常量
  如果存在
   不做任何操作
  如果不存在
   则在常量池上创建对应常量

//常量AA不存在,所以第一步在常量池中创建了常量AA
String a2 = new String("AA") + new String("BB");
String a3 = new String("A")+new String("A"); //创建对象AA
System.out.println(a3 == a3.intern()); //false
//只在堆上创建AABB对象,没有在常量池中创建常量AABB
String a2 = new String("AA") + new String("BB");
System.out.println(a2 == a2.intern()); //true

5.双引号字符串与new String字符串

首先创建两个对象,一个是new String的对象,一个是相加后的对象
 然后判断双引号常量与new String的字面量在常量池是否存在
  如果存在
   不做操作
  如果不存在
   则在常量池上创建对象的常量

String a1 = "AABB";
String a2 = "AA" + new String("BB");
System.out.println(a1 == a2.intern());//true
System.out.println(a2 == a2.intern()); //false

二.String.intern()分析

判断这个常量是否存在于常量池。
  如果存在
   判断存在内容是引用还是常量,
    如果是引用,
     返回引用地址指向堆空间对象,
    如果是常量,
     直接返回常量池常量
  如果不存在,
   将当前对象引用复制到常量池,并且返回的是当前对象的引用

  String a1 = "AA";System.out.println(a1 == a1.intern()); //trueString a2 = new String("B") + new String("B");a2.intern();String a3 = new String("B") + new String("B");System.out.println(a2 == a3.intern());//trueSystem.out.println(a3 == a3.intern());//falseString a4 = new String("C") + new String("C");System.out.println(a4 == a4.intern()); //true

三.总结
1.只在常量池上创建常量

String a1 = "AA";

2.只在堆上创建对象

String a2 = new String("A") + new String("A");

3.在堆上创建对象,在常量池上创建常量

String a3 = new String("AA");

4.在堆上创建对象,在常量池上创建引用

String a4 = new String("A") + new String("A");//只在堆上创建对象AA
a4.intern();//将该对象AA的引用保存到常量池上

5.在堆上创建对象,在常量池上创建常量,在常量池上创建引用(不可能)

String a5 = new String("A") + new String("A");//只在堆上创建对象
a5.intern();//在常量池上创建引用
String a6 = "AA";//此时不会再在常量池上创建常量AA,而是将a5的引用返回给a6
System.out.println(a5 == a6); //true

四.练习

         String aa = "AA";//设置常量AA到常量池String bb = "BB";//设置常量BB到常量池String ccdd = "CC"+"DD";//设置常量CCDD到常量池String neeff = new String("EE")+new String("FF");//设置EE和FF到常量池。并且添加EE、FF和EEFF对象到堆String aabb = aa+bb;//添加AABB对象到堆String gghh = "GG"+new String("HH");//设置GG和HH常量到常量池,设置HH和GGHH对象到堆
//         aa.intern();//啥事都不做,返回AA常量
//         ccdd.intern();//啥事都不做,返回CCDD常量
//         neeff.intern();//添加EEFF对象的引用到常量池,并返回EEFF对象
//         aabb.intern();//添加AABB对象的引用到常量池,并返回AABB对象
//         gghh.intern();//添加GGHH对象的引用到常量池,并返回GGHH对象System.out.println(aa.intern()==aa); //trueSystem.out.println(neeff.intern()=="EEFF");//trueSystem.out.println("EEFF"==neeff);//trueString nccdd = new String("CCDD");System.out.println(ccdd==nccdd);//falseSystem.out.println(ccdd==nccdd.intern());//trueSystem.out.println(aabb.intern()==aabb);//trueSystem.out.println(gghh==gghh.intern());//true

String.intern() 1.8看完这篇再也不会做错这类题了相关推荐

  1. 看完这篇再也不怕 Redis 面试了

    看完这篇再也不怕 Redis 面试了 0x00.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版 ...

  2. redis hashmap过期_看完这篇再也不怕 Redis 面试了

    0.前言 Redis是跨语言的共同技术点,无论是Java还是C++都会问到,所以是个高频面试点. 笔者是2017年才开始接触Redis的,期间自己搭过单机版和集群版,不过现在 大一些的 公司都完全是运 ...

  3. 利用临床数据库就能发SCI?看完这篇!直呼做临床数据分析超简单

    Meta分析.临床数据分析一对一指导,符合学术规范,结课直接投稿,+tjzgBL哟! 前年副高考试通过后,我已经连续申请了两年的职称评审,第一年因为论文未达要求,宣告失败:第二年痛定思痛,决定花时间好 ...

  4. 想自己创业当老板?找不到好的项目?看完这篇文章就知道做什么了!

    首先我告诉大家那些说什么,每天什么都不用多干,动动手指,按几下页面就能日入斗金的纯粹是在说梦话,你要是还真信了你就是当代韭菜.是的我也是悔不当初,在最开始不了解这一行的时候,我以为它和淘宝刷单一样简单 ...

  5. memset linux 头文件,linux下C/C++头文件梳理,看完这篇再也不会搞糊涂头文件了!...

    一:前言 进行linux下C/C++服务端后台开发的都知道,需要跟各种头文件打交道. 比如使用printf函数则需要引用#include ,使用STL的map容器则要#include ,使用socke ...

  6. linux shell find depth,搞定 Linux Shell 文本处理工具,看完这篇集锦就够了

    原标题:搞定 Linux Shell 文本处理工具,看完这篇集锦就够了 Linux Shell是一种基本功,由于怪异的语法加之较差的可读性,通常被Python等脚本代替.既然是基本功,那就需要掌握,毕 ...

  7. hashmap是有序还是无序_说实话,你要是看完这篇 HashMap ,和面试官扯皮真的就没问题了!

    文章来源:看完这篇 HashMap ,和面试官扯皮就没问题了 原文作者:cxuan 来源平台:微信公众号 (如果你没有时间细抠本文,可以直接看 HashMap 概述,能让你对 HashMap 有个大致 ...

  8. Dart语言基础,看完这篇文章就够了(二)

    文章内容是我在学习Flutter过程中对知识点的梳理和总结.如有不对的地方,欢迎指出. 本文承接Dart语言基础,看完这篇文章就够了(一),进一步了解Dart语法知识. 文章目录 1 流程控制语句 2 ...

  9. 神了!!看完这篇文章我不仅学会了手撸vue三开关组件,还搞懂了父子组件传值

    神了!!看完这篇文章我不仅学会了手撸vue三开关组件,还搞懂了父子组件传值 引子 前置知识 什么是vue组件 父子组件传值 父传子 子传父 model选项的引入 三开关组件(three-switch) ...

最新文章

  1. opencv2安装报错no module named cv2
  2. 以佛像喷泉来探讨BCH物联网应用潜力
  3. MySQL 笔记4 -- 数据完整性
  4. Mac下的Mysql无法登陆的问题
  5. 了解为什么这个直观的工具是您团队的通用团队管理工具
  6. ipython 学习笔记 2 network graph--NetworkX
  7. excel表中怎么插入visio_快速制作组织架构图,还在用Visio就out了,Excel简单三步搞定...
  8. TelPhoneManager中的常用方法和状态获取
  9. 蓝天准系统P750的介绍与开箱
  10. 关于R4s软路由刷机教程
  11. 不动产租赁运营平台,为不动产租赁提供强劲的运营支持
  12. 微软360度——成功与成长
  13. 大内高手 内存管理器
  14. 微信还能这么玩?半透明的微信背景主题用起来!
  15. php在表格中截取中文,excel表格截图的快捷键是什么?
  16. 程序员找工作经历,一个人在上海工作的艰辛
  17. linux mutt 收不到邮件,mutt 发邮件189邮件收不到邮件内容的解决办法
  18. 基于android的汽车租赁出租车打车洗车app
  19. 计算机学院2022级新生邀请赛(二)
  20. 数据分析模型:OGSM模型

热门文章

  1. 5分钟上手Spock
  2. pandas学习(个人向)
  3. 春暖花开,我见六间房
  4. AI动漫头像生成神器来了
  5. 4月2日lol服务器维护嘛,英雄联盟4月2日更新维护几点结束_4月2日LOL10.7版本停机维护结束时间_3DM网游...
  6. 论文笔记:一种适用于NILM的暂态事件检测算法(滑动窗双边CUSUM)
  7. 学画画软件app推荐_有什么好用的绘画app?
  8. angular 引入本地图片
  9. astmb348标准查询_ASTM B381-2013
  10. 818专业课【考经】—《信号系统》之章节概要:第五章 连续时间信号的变换域分析