面试的时候经常被问到这样一个问题:
String s = new String("abc");//此行执行完成后,内存中有几个String对象??
String s1 = "abc";//此行代码执行完成后内存中有几个String对象?
String s2 = new String("abc");//此行代码执行完成后内存中有几个内存对象??
首先看上面的三行代码和后面的问题,大家都知道第一行代码的问题答案是:2个对象,
那么具体是那两个对象,不知道有没有想过,在JDK1.5 API参考手册是这样说的:
Initializes a newly created String
object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original
is needed, use of this constructor is unnecessary since Strings are immutable.
注意红色的字体,这句话说明当你使用String s = new String("........")方式创建一个字符串对象的时候,那么系统会在内存中划分出一个叫做String pool的内存块,这个String pool存放的是参数字符串对象,
String s = new String("abc");那么按照JDK说明,系统先创建一个参数字符串对象“abc”放入String pool中,那么这就是第一个String对象。
那么new String("abc")是将String pool中的值为“abc”对象作为参数传递过来,创建在内存的堆中创建一个新的String对象,那么实际上新创建的字符串是该参数字符串的一个副本,一个拷贝,所以会出现两个字符串对象的结果
第二行代码:String s1 = "abc",它执行完成之后,系统内存中有两个字符串对象,为什么呢???
此中方法创建String对象的时候,系统会首先在String pool中查找是否存在一个值为“abc”的字符串,如果存在的
话,那么就将这个值为“abc”对象的引用赋给s1,如果不存在,在String pool中创建一个新的字符串对象,值为
“abc”,因为第一行代码执行完成后,String pool中存在一个值为“abc”的字符串,那么系统会直接将这个字符
串的引用赋给s1,所有第二行代码没有创建一个新的String对象,如果这样写String s1 = “abcd”,那么就会创建
一个新的字符串对象,因为系统在String pool中查找不到这个值为“abcd”的String 对象,那么这个对象创建后也
放在String pool中。
接上面继续:
第三行代码:String s2 = new String("abc")这行代码执行完成之后,系统内存中有三个String对象
执行期间,系统会到String pool中查找有没有值为“abc”的对象,如果的话,那么将String pool中值为“abc”
的对象对象引用作为副本,在内存堆中创建一个值为“abc”的对象(JAVA中的对象创建在堆上),将此对象的引用
赋给s2,如果不存在的话,同样就会是第一行代码的结果
分享到:
相关推荐
Java 中 String 类型转换方法 Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 ...
简单总结可以下Java中String类中的常用方法
83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中String构造方法.zip83.java中...
85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中String构造方法.zip85.java中...
86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点.zip86.java中String对象的特点....
本文将深入探讨Java中String类型和int类型之间的比较方法以及相互转换的技术,这对于理解和优化代码逻辑、提升程序性能具有重要意义。 ### 一、String类型与int类型的基本概念 #### 1.1 String类型 String类型在...
Java 中 String 和 int 类型的相互转换 Java 中 String 和 int 类型的相互转换是一个基本的数据类型转换操作。下面我们来详细介绍这两种类型的相互转换。 String 转换为 int 在 Java 中,将 String 类型转换为 ...
### Java中String、十六进制String与byte[]之间的相互转换 在Java开发中,字符串(String)、十六进制表示的字符串以及字节数组(byte[])之间的转换是非常常见的需求,尤其是在处理网络通信、文件读写等场景下。...
### JAVA中String与StringBuffer的区别 在Java编程语言中,`String` 和 `StringBuffer` 都是非常重要的类,它们用于处理字符串数据。虽然它们都实现了字符串操作的功能,但它们之间存在一些重要的区别,这些区别...
### Java中String类详解 #### 引言 在Java编程语言中,`String`类扮演着至关重要的角色,它用于表示字符序列。本文档旨在深入探讨`String`类的特性和功能,帮助开发者更好地理解和应用这一核心类。 #### String类...
### Java中String类的知识 #### 一、String 类概述与创建方式 在Java语言中,`String`类是用于表示不可变字符序列的核心类之一。它代表了一个字符串对象,一旦被初始化后,其内容不能被改变。这被称为不可变性...
### Java中String类的常用方法详解 在Java编程语言中,`String` 类是一个非常重要的类,用于表示不可变的字符序列。它提供了丰富的内置方法,使得开发人员能够轻松地处理字符串相关的操作。本文将详细介绍Java中`...
Java 中 String, StringBuffer 与 StringBuilder 的区别 Java 中 String, StringBuffer 与 StringBuilder 三种字符串类型的区别是很多开发者经常混淆或不了解的知识点。今天,我们将深入探讨这三种字符串类型的区别...
Java中String的知识点
根据提供的信息,我们可以总结出这份Java基础String类选择题练习题主要聚焦于String及StringBuffer类的使用。尽管具体的题目内容未给出,但从所展示的信息中可以推断出该练习题集涵盖了以下几方面的知识点: ### 一...
标题和描述均强调了在Java中处理`String`对象时可能遇到的陷阱,尤其是在理解和使用`String`的处理机制上。文章由天津工业大学软件工程专业的翁龙辉撰写,旨在深入剖析`String`在Java中的独特行为及其潜在的陷阱。...
在Java编程中,字符串(String)是非常常见且重要的数据类型。本文主要讨论了如何正确判断Java中的String对象是否为null、空值("")以及它们的地址是否相等。在处理字符串时,了解这些概念对于避免程序出错至关重要。...
java编程中对字符串的各种方式的处理,包括(空字符串处理、判断是否是空字符串 null和"" 都返回 true、 把string array or list用给定的符号symbol连接成一个字符串、 判定第一个字符串是否等于的第二个字符串中的某...