`
Java-primer
  • 浏览: 51099 次
  • 性别: Icon_minigender_1
  • 来自: 成都
文章分类
社区版块
存档分类
最新评论

String a = new String("b");到底是几个对象?

阅读更多
String  a  =  new  String("b");到底是几个对象? 

哈哈,要理解这个,就要知道string类的工作原理。  

你知道在java中除了8中基本类型外,其他的都是类对象以及其引用。所以   "xyz   "在java中它是一个String对象.对于string类对象来说他的对象值是不能修改的,也就是具有不变性。  

看:  

String       s=   "Hello   ";  

s=   "Java   ";  

String       s1=   "Hello   ";  

String       s2=new       String(   "Hello   ");  

啊,s所引用的string对象不是被修改了吗?之前所说的不变性,去那里了啊?  

你别着急,让我告诉你说发生了什么事情:  

在jvm的工作过程中,会创建一片的内存空间专门存入string对象。我们把这片内存空间叫做string池。  

String       s=   "Hello   ";当jvm看到   "Hello   ",在string池创建string对象存储它,并将他的引用返回给s。  

s=   "Java   ",当jvm看到   "Java   ",在string池创建新的string对象存储它,再把新建的string对象的引用返回给s。而原先的   "Hello   "仍然在string池内。没有消失,他是不能被修改的。  

所以我们仅仅是改变了s的引用,而没有改变他所引用的对象,因为string对象的值是不能被修改的。  

String       s1=   "Hello   ";jvm首先在string池内里面看找不找到字符串   "Hello   ",找到,返回他的引用给s1,否则,创建新的string对象,放到string池里。这里由于s=   "Hello   "了,对象已经被引用,所以依据规则s和s1都是引用同一个对象。所以       s==s1将返回true。(==,对于非基本类型,是比较两引用是否引用内存中的同一个对象)  

String       s2=String(   "Hello   ");jvm首先在string池内里面看找不找到字符串   "Hello   ",找到,不做任何事情,否则,创建新的string对象,放到string池里面。由于遇到了new,还会在内存上(不是string池里面)创建string对象存储   "Hello   ",并将内存上的(不是string池内的)string对象返回给s2。所以s==s2将返回false,不是引用同一个对象。  

好现在我们看题目:  

String       s       =       new       String(   "xyz   ");  

首先在string池内找,找到?不创建string对象,否则创建,       这样就一个string对象  

遇到new运算符号了,在内存上创建string对象,并将其返回给s,又一个对象  

所以总共是2个对象
分享到:
评论

相关推荐

    String s = new String(” a “) 到底产生几个对象?

    上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...

    String s = new String('a ') 到底产生几个对象

    本文将详细探讨`String s = new String('a ')`这行代码在内存中到底产生了多少个对象。 首先,我们需要了解Java内存模型中的两个关键区域:栈(Stack)和堆(Heap)。栈主要用于存储基本类型变量和对象引用,而堆则...

    浅析为什么a=”abc” 不等于 a=new String(“abc”)

    看了很多书,问了好几个大神,其实自己还是稀里糊涂的。这里记录一下,备查。 在js中,区分原始资料类型和包装类型。数字、字符串、布尔、null、undefined 属于原始资料类型,而Number、String、Boolean属于包装类型...

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    在这个例子中,a 和 b 指向同一个对象,因此输出结果为 true。 五、结论 本文探讨了 JAVA 中 String 对象的创建机制,包括使用 new 关键字、使用引号包含的文本、使用连接符“+”等方式,并探索了 String 对象池的...

    String对象的内存分析

    接下来,我们通过几个例子来具体分析`String`对象的内存分配: 1. `String a = "abc"; String b = "abc";` 在这种情况下,"abc"首先会被放入常量池中。当创建`a`和`b`时,它们都指向常量池中的同一个"abc"对象,...

    string中的常见问题

    本文将基于提供的代码片段深入探讨与 `String` 类型相关的几个关键概念,包括字符串常量池、字符串比较、以及 `new` 关键字在创建 `String` 对象时的影响。 #### 一、字符串常量池的理解 首先,我们需要理解字符串...

    正确使用String类的几点注意

    为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、合理地使用String对象。 #### 一、初始化String对象 **1.1 直接赋值** 最常见的初始化方式是通过直接赋值的方式创建String对象: ``...

    创建string对象过程的内存分配:

    在Java中,创建 `String` 对象时,主要涉及以下几种内存区域: 1. **常量池** (Constant Pool): 每个类或接口都有自己的常量池,它包含了编译期间确定的所有字面量和符号引用。 2. **堆** (Heap): 动态分配的内存...

    Java问题宝典2012版

    37、下面这条语句一共创建了多少个对象:String s="a"+"b"+"c"+"d"; 26 38、try {}里有一个return语句,那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后? 27 39、下面的...

    12基础篇之第十二(String的基本用法).docx

    System.out.println("创建了几个对象?两个,一个\"hello\"字符串对象,在方法区的常量池;一个s对象,在堆内存。"); String s1 = "abc"; String s2 = "abc"; System.out.println(s1 == s2); // true System....

    new String(\"abc\")创建几个对象的解释

    java面试的疑惑剪辑 博文链接:https://z-jq1015.iteye.com/blog/248599

    java 面对对象编程.pdf.zip

    面向对象基础 面向对象和面向过程的区别 成员变量与局部变量的区别 创建一个对象用什么运算符?对象实体与对象引用有何不同? 对象的相等和引用相等的区别 类的构造方法的作用是什么?...这句话创建了几个

    list转换成string数组

    本文将详细探讨这一转换过程,并通过几个具体的示例来帮助理解。 #### 一、基础知识 在深入讨论如何将列表转换为字符串数组之前,我们首先需要了解一些基本概念。 - **List**:`List`是Java集合框架的一部分,...

    JAVA面试题String产生了几个对象

    JAVA面试题String产生了几个对象 JAVA面试题String产生了几个对象?这个问题是很多Java开发者面试中常见的问题,本文将通过示例代码详细介绍String s = new String("xyz");产生了几个对象。 首先,需要了解Java中...

    c# string操作,去除重复的串

    在C#编程语言中,字符串(string)是处理文本数据的核心类型。字符串是不可变的,这意味着一旦创建,就不能直接更改。在这个主题中,我们将深入探讨如何进行C#中的字符串操作,特别是关于去除重复字符串的方法以及...

    java基础心得总结.rar

    描述java基础容易忽略的问题,如下面几个知识点: int a = 1;1会存放在栈里 String s1 = "thanks";thanks会存放在data segment里 String s2 = new String("thanks");thanks会存放在data segment里 String a ="th...

    String详解

    2. **new关键字**:通过`new`关键字创建一个新的字符串对象: ```java String str2 = new String("abc"); ``` 这种方式会在堆内存中创建一个新的对象,并不存储于字符串常量池中。即使两个对象包含相同的字符...

    10个Java经典的String面试题

    创建了几个对象,为什么? 答案:创建了两个对象。"abc" 本身创建在常量池中,通过 new 又创建在堆中。String str = new String("abc"); 这一语句创建了两个对象:一个是常量池中的 "abc",另一个是堆中的 String ...

    java基础面试题目,常见的几个java面试题目:说一下java类集;JDK 和 JRE 有什么区别

    而 String str=new String("i") 创建了一个新的对象,即使内容与常量池中的字符串相同,它们在内存中是两个不同的对象。 12. 如何将字符串反转? 在 Java 中,可以使用 StringBuilder 或 StringBuffer 类的 reverse...

Global site tag (gtag.js) - Google Analytics