String s = new String("XYZ"); 到底生成了几个对象?
要理解这个,就要知道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持有
分享到:
相关推荐
关于String s=new String( "Hello")的例子思考
String b=new String("hello world"); //这种用new关键字定义的字符串,是在堆中分配空间的。而分配空间就是由new去完成的,由new去决定分配多大空间,并对空间初始化为字符串"hello world" 返回其在堆上的地址。 ...
上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...
在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...
`)和通过 `new` 关键字(如 `String c = new String("abc");`)。前者通常利用字符串池来提高效率和减少内存消耗,后者则总是在堆上创建新的对象实例。 ### 性能与效率 在选择使用 `==` 还是 `equals()` 时,性能...
String s = new String("abc"); 但是,按照面向对象的标准语法,在内存使用上存在比较大的浪费。例如: String s = new String("abc"); 实际上创建了两个 String 对象,一个是”abc”对象,存储在常量空间中,一...
String b =new String("abc"); //创建字符串方式2 System.out.println(a==b); //false,内存地址不相等 String c =new String("abc"); String d =new String("abc"); System.out.println(c==d...
string[] sArray1 = s.Split(new char[] {'c', 'd', 'e'}); foreach (string i in sArray1) Console.WriteLine(i); ``` - 这种方式允许使用多个字符作为分隔符,输出结果会根据`'c'`、`'d'`和`'e'`将原字符串...
string s = new string(cc); ``` 这里,我们将Char[] cc 转换成string,并将其存储在s变量中。 此外,我们还可以使用StringBuilder来进行数组与string之间的转换。例如: ``` using System.Text; StringBuilder sb ...
- **面向对象语法**:`String s = new String("abc");` 这种方式显式地使用了`new`关键字来创建对象。 2. **内存分配差异**:简化语法实际上利用了Java的字符串常量池机制,使得相同的字符串仅被创建一次并存储于...
本文将详细探讨`String s = new String('a ')`这行代码在内存中到底产生了多少个对象。 首先,我们需要了解Java内存模型中的两个关键区域:栈(Stack)和堆(Heap)。栈主要用于存储基本类型变量和对象引用,而堆则...
本文主要分析两种创建String对象的方式:`String str = ""` 和 `new String()`,并探讨它们之间的区别以及涉及的内存管理机制。 首先,我们要了解Java内存模型的基础概念。在Java中,内存分为两大部分:栈内存...
在Java编程中,经常需要...以上是关于"StringToList和StringtoMap和StringtoObject和StringtoArray"的基本知识。理解并掌握这些转换方法对于处理JSON数据至关重要,特别是在Java编程中进行Web服务开发或者API交互时。
本篇复习将重点讨论String类中的`equals()`方法和`==`运算符的区别,这对于理解对象比较和字符串操作至关重要。 首先,`==`运算符在Java中用于比较基本类型(如int、char)的值,而在比较对象时,它实际上是检查两...
String str = new String(); ``` - **利用已存在的字符串常量创建一个新的对象**: ```java String original = "hello"; String str = new String(original); ``` - **利用一个字符数组创建一个字符串**: ...
String s = new String(bytes, "UTF-8"); ``` #### 二、String的常用API-2 ##### (1)系列1:常用方法 1. **isEmpty()**: - 判断字符串是否为空。 - 示例代码: ```java String s = ""; boolean result ...
string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好,hello; byte[] bytes; //byte[] 转换成 string bytes = Encoding.UTF8.GetBytes(str); //string 转换成 byte[] (字符串是用哪种...
33、String s = new String("xyz");创建了几个String Object? 二者之间有什么区别? 25 34、String 和StringBuffer的区别 25 35、如何把一段逗号分割的字符串转换成一个数组? 26 36、数组有没有length()这个方法? ...
- **指定大小和字符:** `string s(10, 'a');` 34. **`string` 的重载运算符** - **赋值运算符:** `=` - **比较运算符:** `==`, `!=`, `, `>`, `<=`, `>=` - **拼接运算符:** `+`, `+=` 35. **`string` 与...
String s = new String("hello"); ``` 这种方式创建的String对象位于堆内存中,并且不会放入常量池。如果后续有相同的字符串被创建,即使是相同的字符串内容,也会在堆内存中创建一个新的对象,而不是指向常量池中的...