一切从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 字符串驻留池相关推荐

  1. java idwork长度_java 字符串id

    Java FutureTask import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.c ...

  2. java 字符串函数_Java字符串函数– 25+必须知道方法

    java 字符串函数 Java字符串函数 (Java String Functions) Java String class has a lot of functions to manipulate ...

  3. java 字符串面试_Java字符串面试问答

    java 字符串面试 String is one of the most widely used Java Class. Here I am listing some important Java S ...

  4. java字符串转字符串数组_Java字符串数组到字符串

    java字符串转字符串数组 Today we will look into how to convert Java String array to String. Sometimes we have ...

  5. java字符串转字符串数组_Java字符串数组

    java字符串转字符串数组 Java String array is used to hold fixed number of Strings. String array is very common ...

  6. java 字符 加密_Java 字符串的加密与解密

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 为了保证程序的安全,经常需要用到数据加密的方法.Java 中提供了专门用于加密运算的类和接口. 除了使用加密类和接口外,还可以通过多种方式实现字符串的加密 ...

  7. java拼接字符串的_Java字符串拼接(连接)

    对于已经定义的字符串,可以对其进行各种操作.连接多个字符串是字符串操作中最简单的一种.通过字符串连接,可以将两个或多个字符串.字符.整数和浮点数等类型的数据连成一个更大的字符串. String 字符串 ...

  8. java字符对比_Java 字符串比较

    在 Java 中,比较字符串的常用方法有 3 个:equals() 方法.equalsIgnoreCase() 方法. compareTo() 方法 1. equals() equals() 方法将逐 ...

  9. java比较日期字符串大小写_java 字符串操作和日期操作

    一.字符串操作 创建字符串 String s2 = new String("Hello World"); String s1 = "Hello World"; ...

最新文章

  1. 第二章 第三节 创建第一个程序
  2. 构建SpringCloud项目基础框架
  3. 正则匹配承兑的html,正则匹配闭合HTML标签(支持嵌套)
  4. 垂直柱状图(洛谷-P1598 )
  5. LINQ之Order By
  6. 通信原理眼图画法_光纤通信链路入侵与检测技术研究综述
  7. 《MYSQL必知必会》—2.MySQL简介
  8. ARM嵌入式系统开发之接收函数的实现
  9. 网络安全之uRPF技术
  10. 快速计算网络地址和广播地址
  11. 自然语言处理——基于预训练模型的方法——第3章 基础工具集与常用数据集
  12. ubuntu16启用daytime服务
  13. proxmox PVE 安装 黑群晖
  14. Vue.js CLI:学习如何使用它
  15. 最全 MySQL主从同步与主主同步
  16. 真的还有必要学习JAVA多线程吗?
  17. SCT2650STER、SCT2450STER、SCT2630ASTER 北京冠宇铭通
  18. python中为什么加上中文注释就会报错
  19. Python!使用机器学习预测2022世界杯
  20. linux降级安装补丁,Adobe Shockwave Player降级安装漏洞

热门文章

  1. 人家好害羞啦主题主题下载
  2. def fasterrcnn_resnet50_fpn()实例测试
  3. mysql按天,按周,按月,按季度,按年统计数据
  4. 石子合并的GarsiaWachs算法
  5. java基本语法实验体会_Java基本语法实验报告
  6. OpenWRT 教程 之 设置网络和无线
  7. 02-PS工具栏介绍
  8. 风控中的EAD、PD与LGD模型都有啥区别?
  9. 最简便的lightGBM GPU支持的安装、验证方法
  10. 国内外MCU厂商及产品线最全盘点