java 字符串驻留_JAVA 字符串驻留池
一切从String str = new String("abc")说起...
这行代码形式上很简单,其实很复杂。有一个常见的Java笔试题就是问上面这行代码创建了几个String对象。
我刚开始很自然的觉得应该是创建了一个String对象,后来查阅资料,才发现,实际上创建了两个String对象。下面说明为什么创建了两个String对象。
首先,来了解一下Java中的字符串驻留池的概念。JVM为了提高性能,将一下两种形式的字符串放在一个称之为字符串驻留池的内存块中:
形式一:String str = "abc";
形式二:"abc"
其实,形式一和形式二都是字符串的字面常量。所以,可以这样理解,即把字符串的字面常量都放在了字符串驻留池中。对形式一来说,str其实就是引用的字符串驻留池中"abc"这个String对象。
如果有如下的两行代码:
String str1 = "abc";
String str2 = "abc";
那么,上面的两行代码创建了几个String对象?答案是一个。根据我们刚才所述,那么第一行语句将在池中创建一个String对象,第二行会先在池中寻找是否有值与"abc"相同的String对象,如果有,就直接引用,没有这在池中新建String对象。这下,就明白了为什么上面的两行语句仅仅创建了一个String对象。
然后,让我们来看一看String str = new String("abc")。我们先不讨论到底创建了几个String对象。我们在这里,比较一下这种new的方式和上面的直接赋值方式两种创建String对象的不同,直接赋值的方式是在字符串驻留池中创建对象,但new这种方式是在堆中创建对象。即,new创建的String对象是不会放入字符串驻留池中的。如果一定要把某个通过new创建的字符串对象放入驻留池,可以使用intern()方法。如String strt = str.intern(),将把str的值放在驻留池中(当然,是在驻留池原来没有这个值对应的String对象的情况下),并返回驻留池中String对象的引用。
现在,可以分析String str = new String("abc");创建了几个String对象了:)很明显,传入的"abc"字符串字面常量在驻留池中创建了一个对象,new操作符在堆中创建了一个对象,所以,一共创建了两个String对象
java 字符串驻留_JAVA 字符串驻留池相关推荐
- java idwork长度_java 字符串id
Java FutureTask import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.c ...
- java 字符串函数_Java字符串函数– 25+必须知道方法
java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...
- java 字符串面试_Java字符串面试问答
java 字符串面试 String is one of the most widely used Java Class. Here I am listing some important Java S ...
- java字符串转字符串数组_Java字符串数组到字符串
java字符串转字符串数组 Today we will look into how to convert Java String array to String. Sometimes we have ...
- java字符串转字符串数组_Java字符串数组
java字符串转字符串数组 Java String array is used to hold fixed number of Strings. String array is very common ...
- java 字符 加密_Java 字符串的加密与解密
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为了保证程序的安全,经常需要用到数据加密的方法.Java 中提供了专门用于加密运算的类和接口. 除了使用加密类和接口外,还可以通过多种方式实现字符串的加密 ...
- java拼接字符串的_Java字符串拼接(连接)
对于已经定义的字符串,可以对其进行各种操作.连接多个字符串是字符串操作中最简单的一种.通过字符串连接,可以将两个或多个字符串.字符.整数和浮点数等类型的数据连成一个更大的字符串. String 字符串 ...
- java字符对比_Java 字符串比较
在 Java 中,比较字符串的常用方法有 3 个:equals() 方法.equalsIgnoreCase() 方法. compareTo() 方法 1. equals() equals() 方法将逐 ...
- java比较日期字符串大小写_java 字符串操作和日期操作
一.字符串操作 创建字符串 String s2 = new String("Hello World"); String s1 = "Hello World"; ...
最新文章
- 第二章 第三节 创建第一个程序
- 构建SpringCloud项目基础框架
- 正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)
- 垂直柱状图(洛谷-P1598 )
- LINQ之Order By
- 通信原理眼图画法_光纤通信链路入侵与检测技术研究综述
- 《MYSQL必知必会》—2.MySQL简介
- ARM嵌入式系统开发之接收函数的实现
- 网络安全之uRPF技术
- 快速计算网络地址和广播地址
- 自然语言处理——基于预训练模型的方法——第3章 基础工具集与常用数据集
- ubuntu16启用daytime服务
- proxmox PVE 安装 黑群晖
- Vue.js CLI:学习如何使用它
- 最全 MySQL主从同步与主主同步
- 真的还有必要学习JAVA多线程吗?
- SCT2650STER、SCT2450STER、SCT2630ASTER 北京冠宇铭通
- python中为什么加上中文注释就会报错
- Python!使用机器学习预测2022世界杯
- linux降级安装补丁,Adobe Shockwave Player降级安装漏洞