字符串常量池

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个

在常量池中查找是否有”abc”对象,有则返回对应的引用实例,没有则创建对应的实例对象(1个)

在堆中 new 一个 String(“abc”) 对象(1个)

将对象地址赋值给str,创建一个引用

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

在常量池中查找,字符串”A”,”B”,”AB”(3个)

在堆中 new 一个 String(“AB”) 对象(1个)

将对象地址赋值给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进阶——Java中的字符串常量池相关推荐

  1. java中字符串常量_Java基础-Java中字符串常量详解

    --------第一个例子--------- String str1 = "a"; String str2= "b"; String str3= "a ...

  2. java 数组 字符串 编程_Java语言基础知识之字符串数组

    Java语言基础知识之字符串数组 java语言中,数组是一种最简单的复合数据类型.数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素.数组有 ...

  3. java循环变量_Java初学——Java入门变量 常量选择循环结构

    一.初识java 1.jdk的介绍 下载安装jdk 安装后会存在默认的安装路径 bin 目录:存放编译,运行 Java 程序的可执行文件 lib 目录:存放 Java 的类库文件 jre 目录:存放 ...

  4. java list字符排序吗_List中存放字符串进行排序

    package com.bjpowernode.t03sort; import java.util.ArrayList; import java.util.Collections; /* * List ...

  5. eclipse java web乱码_JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)...

    JAVA语言具有跨平台,unicode字符集编码的特点. 但是在开发过程中处理数据时涉及到的字符编码问题零零散散,尤其是处理中文字符时一不留神就可能出现一堆奇奇怪怪的符号,俗称乱码. 对于乱码,究其原 ...

  6. java打印字符串显示_JAVA调用系统打印机打印字符串

    用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Graphics2D直接输出 ...

  7. java匹配字符串替换_Java 字符串匹配和替换字符串

    在java里,在字符串中找字符很方便. 如下例子: String fileContent="this is a  flash call html this flash file=sdcard ...

  8. java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 在java中添加图片做动画效果,怎么一闪一闪的运动啊?怎样才能让它不闪的连续运动呢? 下面是代码,代码项目project里有两个类,一个是 ...

  9. java 图片阴影_Java 为 PPT 中的图形添加阴影效果

    在PowerPoint文档中,给图形添加阴影效果能增强图形的立体感,使其贴近现实效果,提升文档的美观度. 本文将展示如何使用Free Spire.Presentation for Java为PPT中的 ...

最新文章

  1. python编程入门经典实例-总算明了python编程入门经典实例
  2. IIS报错,App_global.asax.×××.dll拒绝访问
  3. GDCM:gdcm::EquipmentManufacturer的测试程序
  4. Failed to issue method call Unit mysql service failed to lo
  5. oracle清除bin,Oracle recyclebin详解(闪回删除的表)
  6. mysql en dump_mysqldump 命令总结
  7. 登录页面(通过数据库查询密码是否正确)
  8. 什么是偏向锁、轻量级锁、重量级锁?
  9. Android View的生命周期详解
  10. jstack分析线程状态
  11. 点击一下就射击的java代码_Java面向对象(6) —— 射击小游戏
  12. 泛函分析 06.03 线性算子的谱理论 - 有界自共轭线性算子的谱
  13. DataWhale_Pandas Task08 文本数据
  14. 服务器打完补丁无法进入系统,win7系统电脑更新补丁后无法进入系统怎么办
  15. php中ne,eq相等 ne、neq不相等, gt大于, lt小于
  16. 位图字体生成工具 BMFont汉化版
  17. fhkldlkfhj
  18. OpenCV3之操作例子总汇
  19. #135:动画SVG的三种方法
  20. 2021年T电梯修理考试及T电梯修理考试总结

热门文章

  1. 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流
  2. 16.对极几何——介绍,立体视觉约束,条件_1
  3. html5酷炫表白代码_七夕表白代码,樱花特效+爱心特效+花瓣+评论留言功能等
  4. mysql image类型_MyCat教程【mysql主从复制实现】
  5. struts2漏洞_Apache Struts2057远程代码执行漏洞复现
  6. /usr/bin/python^M: bad interpreter: No such file or directory
  7. 在unity向量空间内绘制几何(4): 利用平面几何知识画像素直线
  8. mac 不显示 外接屏幕_Mac外接屏幕亮度调整
  9. 混合使用Objective-C,C++和Objective-C++
  10. 09-OpenLDAP加密传输配置