java 字符串 常量_Java进阶——Java中的字符串常量池
字符串常量池
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中的字符串常量池相关推荐
- java中字符串常量_Java基础-Java中字符串常量详解
--------第一个例子--------- String str1 = "a"; String str2= "b"; String str3= "a ...
- java 数组 字符串 编程_Java语言基础知识之字符串数组
Java语言基础知识之字符串数组 java语言中,数组是一种最简单的复合数据类型.数组是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和下标来唯一地确定数组中的元素.数组有 ...
- java循环变量_Java初学——Java入门变量 常量选择循环结构
一.初识java 1.jdk的介绍 下载安装jdk 安装后会存在默认的安装路径 bin 目录:存放编译,运行 Java 程序的可执行文件 lib 目录:存放 Java 的类库文件 jre 目录:存放 ...
- java list字符排序吗_List中存放字符串进行排序
package com.bjpowernode.t03sort; import java.util.ArrayList; import java.util.Collections; /* * List ...
- eclipse java web乱码_JAVA and JAVA WEB with TOMCAT and ECLIPSE 学习过程中遇到的字符乱码问题及解决方法汇总(随时补充)...
JAVA语言具有跨平台,unicode字符集编码的特点. 但是在开发过程中处理数据时涉及到的字符编码问题零零散散,尤其是处理中文字符时一不留神就可能出现一堆奇奇怪怪的符号,俗称乱码. 对于乱码,究其原 ...
- java打印字符串显示_JAVA调用系统打印机打印字符串
用java实现打印,java.awt中提供了一些打印的API,要实现打印,首先要获得打印对象,然后继承Printable实现接口方法print,以便打印机进行打印,最后用用Graphics2D直接输出 ...
- java匹配字符串替换_Java 字符串匹配和替换字符串
在java里,在字符串中找字符很方便. 如下例子: String fileContent="this is a flash call html this flash file=sdcard ...
- java 图片动画_java在窗口中添加图片做动画,怎么一闪一闪的?
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 视频来自:优酷 在java中添加图片做动画效果,怎么一闪一闪的运动啊?怎样才能让它不闪的连续运动呢? 下面是代码,代码项目project里有两个类,一个是 ...
- java 图片阴影_Java 为 PPT 中的图形添加阴影效果
在PowerPoint文档中,给图形添加阴影效果能增强图形的立体感,使其贴近现实效果,提升文档的美观度. 本文将展示如何使用Free Spire.Presentation for Java为PPT中的 ...
最新文章
- python编程入门经典实例-总算明了python编程入门经典实例
- IIS报错,App_global.asax.×××.dll拒绝访问
- GDCM:gdcm::EquipmentManufacturer的测试程序
- Failed to issue method call Unit mysql service failed to lo
- oracle清除bin,Oracle recyclebin详解(闪回删除的表)
- mysql en dump_mysqldump 命令总结
- 登录页面(通过数据库查询密码是否正确)
- 什么是偏向锁、轻量级锁、重量级锁?
- Android View的生命周期详解
- jstack分析线程状态
- 点击一下就射击的java代码_Java面向对象(6) —— 射击小游戏
- 泛函分析 06.03 线性算子的谱理论 - 有界自共轭线性算子的谱
- DataWhale_Pandas Task08 文本数据
- 服务器打完补丁无法进入系统,win7系统电脑更新补丁后无法进入系统怎么办
- php中ne,eq相等 ne、neq不相等, gt大于, lt小于
- 位图字体生成工具 BMFont汉化版
- fhkldlkfhj
- OpenCV3之操作例子总汇
- #135:动画SVG的三种方法
- 2021年T电梯修理考试及T电梯修理考试总结
热门文章
- 【BZOJ2539】【codevs1221】丘比特的烦恼,trie树+几何判断+费用流
- 16.对极几何——介绍,立体视觉约束,条件_1
- html5酷炫表白代码_七夕表白代码,樱花特效+爱心特效+花瓣+评论留言功能等
- mysql image类型_MyCat教程【mysql主从复制实现】
- struts2漏洞_Apache Struts2057远程代码执行漏洞复现
- /usr/bin/python^M: bad interpreter: No such file or directory
- 在unity向量空间内绘制几何(4): 利用平面几何知识画像素直线
- mac 不显示 外接屏幕_Mac外接屏幕亮度调整
- 混合使用Objective-C,C++和Objective-C++
- 09-OpenLDAP加密传输配置