字符串常量池

JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中)。实际上还有整型常量池、浮点型常量池等等。字符串常量池存放的是对象的引用,而不是对象。Java中字符串对象创建有两种形式:字面量形式和创建对象形式

1、字面量形式

字面量的体现形式String str = "Hello",简单理解为去字符串常量池中拿对象的引用

当代码中出现字面量形式创建字符串对象时,JVM首先会对这个字面量进行检查,如果字符串常量池中存在相同内容的字符串对象的引用,则将这个引用返回,否则新的字符串对象被创建,然后将这个引用放入字符串常量池,并返回该引用

2、创建对象形式

创建对象的体现形式String str = new String("Hello");,简单理解为直接在堆内存空间中创建新的对象

当代码中出现了new来构造字符串对象的时候,不管字符串常量池中有没有相同内容的对象的引用,首先它都会去创建这个字符串对象,这里字符串对象指的是String对象,String对象存放在堆当中。然后它会去字符串常量池寻找Hello这个字符串,其处理的结果同字面量形式。最终str引用指向String对象的引用

字符串对象创建

1、String str = new String(“abc”) 创建多少个对象?2个

  1. 在常量池中查找是否有”abc”对象,有则返回对应的引用实例,没有则创建对应的实例对象(1个)
  2. 在堆中 new 一个 String(“abc”) 对象(1个)
  3. 将对象地址赋值给str,创建一个引用

2、String str = new String(“A”+”B”)创建多少个对象?4个

  1. 在常量池中查找,字符串”A”,”B”,”AB”(3个)
  2. 在堆中 new 一个 String(“AB”) 对象(1个)
  3. 将对象地址赋值给str,创建一个引用

问题抛出

问:求解下面的输出语句的结果并解释原因

String s1 = "Hello";
String s2 = "Hello";
String s3 = "Hel" + "lo";
String s4 = "Hel" + new String("lo");
String s5 = new String("Hello");
String s6 = s5.intern();
String s7 = "H";
String s8 = "ello";
String s9 = s7 + s8;// == :比较两个对象是否为同一对象
System.out.println(s1 == s2);  // true
System.out.println(s1 == s3);  // true
System.out.println(s1 == s4);  // false
System.out.println(s1 == s9);  // false
System.out.println(s4 == s5);  // false
System.out.println(s1 == s6);  // true

问题分析

1、s1==s2

s1和s2在赋值时,均使用的字符串字面量。在编译期间,这种字面量会直接放入常量池中,从而实现复用。在载入运行时常量池后,s1和s2指向的是同一个内存地址

2、s1==s3

s3是动态拼接出来的字符串,但是所有参与拼接的部分都是已知的字面量。在编译期间,这种拼接会被优化,编译器直接帮你拼好,因此s3会被优化成String s3 = "Hello"

3、s1==s4

s4是动态拼接出来的字符串,但new String("lo")这部分不是已知字面量,是一个不可预料的部分。在编译期间,编译器不会优化,必须等到运行时才可以确定结果

4、s1==s9

s7和s8在赋值的时候使用的字符串字面量,但是拼接成s9的时候,s7和s8作为两个变量,都是不可预料的。编译器毕竟是编译器,不可能当解释器用,所以不做优化。等到运行时,s7和s8拼接成的新字符串,在堆中地址不确定,不可能与方法区常量池中的s1地址相同

5、s4==s5

s4和s5都创建出了字符串对象,两者都存在于堆中,但地址不相同

6、s1==s6

对于使用new创建的字符串对象,如果想将这个对象的引用加入到字符串常量池,可以使用intern方法。调用intern后,首先检查字符串常量池中是否有该对象的引用,如果存在,则将这个引用返回给变量,否则将引用加入并返回给变量。很显然,s1和s6都已经是字符串常量池中的一员,且值是相等的,所以引用的地址也相等

Java进阶——Java中的字符串常量池相关推荐

  1. java基础之什么是字符串常量池,class常量池和运行常量池?

    一.字符串常量池 字符串大家一定都不陌生,他是我们非常常用的一个类. String作为一个Java类,可以通过以下两种方式创建一个字符串: String str = "Hollis" ...

  2. java 字符串 常量_Java进阶——Java中的字符串常量池

    字符串常量池 JVM为了减少字符串对象的重复创建,其内部维护了一个特殊的内存,这段内存被成为字符串常量池(方法区中).实际上还有整型常量池.浮点型常量池等等.字符串常量池存放的是对象的引用,而不是对象 ...

  3. Java中的字符串常量池详细介绍

    Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  4. java中的字符串常量池_java字符串常量池

    字符串常量池SCP jdk1.6是放在永久代(8中叫方法区或叫元空间)中; jdk1.7+中,字符串常量池放入了堆中,注意运行时常量依然存放在方法区,例如,Integer a = 40:Java在编译 ...

  5. java定义字符串常量_Java中的字符串常量池

    ava中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid";,另一种就是使用new这种标准的构造对象的方法,如String str = new ...

  6. java中的字符串常量池,关于java字符串常量池的问题

    看过很多文章介绍,关于什么样的字符串会存放在字符串常量池中: 1.单独使用""引号创建的字符串都是常量,编译期就已经确定存储到String Pool中. 2.使用只包含常量的字符串 ...

  7. Java中String类、字符串常量池、字符串常用方法

    String类: String代表字符串类,java中所有双引号中的内容都称为字符串,如:"hello".字符串是不可改变的,因此字符串是可以共享使用的,相当于char字符数组,但 ...

  8. 【java进阶之路】(Java基础篇)[扩展]深入解析String.intern()及字符串常量池问题

    申明 : 此文仅仅作为个人学习使用 , 如果有人对于String.intern() 十分想要究其原理 , 请参考此文深入解析String#intern - 美团技术团队 8种基本类型的常量池都是系统协 ...

  9. 【JavaSE系列】Java中的字符串之字符串常量池

    ⭐️前面的话⭐️ 本篇文章带大家认识Java基础知识--字符串类,在前面我们已经知道如何在Java中定义字符串,本文将介绍Java字符串中的字符串常量池,探究字符串相等问题.

最新文章

  1. hrbust 1616 密码锁(广搜)
  2. 递归_三要素_基础算法必备
  3. 最强N皇后JAVA解题代码
  4. oracle 时间加减
  5. UITouch 触摸事件处理(实例)
  6. 卷积神经网络工作原理直观的解释
  7. 【渝粤教育】国家开放大学2018年秋季 1131t卫生经济学 参考试题
  8. opencv 二值化图像 像素统计 countNonZero
  9. Unity 预编译选项
  10. 【解决办法】EFI分区扩容/win10更新提示“我们无法更新系统保留的分区”
  11. android图片按比例缩放,Android开发之imageView图片按比例缩放的实现方法
  12. matlab中列主元三角分解法的函数,[数值算法]列主元三角分解法
  13. 问题解决--npm install 安装依赖一直失败
  14. Android 10.0设置默认sim1卡使用数据流量和发送短信
  15. 22. CTF综合靶机渗透(十五)
  16. hud 6078 Wavel Sequence
  17. MSM8998(高通835处理器)外接指纹识别传感器linux驱动如何与设备树进行匹配
  18. 4G网络要升级成5G,换卡还是换手机?
  19. python展开_python实现傅里叶级数展开的实现
  20. 软件安全测试之系统安全测试

热门文章

  1. 16g电脑内存有什么好处_电脑内存8G和16G有什么区别?教你区别电脑内存8G和16G...
  2. P(B|A)和P(AB)的理解
  3. 软件工程基础第一次作业
  4. 10019---初探JVM
  5. 图像二值化方法及适用场景分析(OTSU Trangle 自适应阈值分割)
  6. java刻画三角形和梯形和圆形_三角形、梯形和圆形的类封装
  7. [WPF 如何] 如何向 ComboBox 添加一个空白选项
  8. 一天 第二章 纤腰舞困因谁,知谁系斑骓?
  9. PS四种扁平化设计风格-网摘
  10. 写给区块链初创者的一封信