String s = new String("wcg") 创建了几个String Object?
\/个!
"wcg "作为一个常量字符串首先被创建,它被保存在“串池”中。所谓串池,简单讲就是从程序运行开始,你创建的所有常量字符串被统一保存的地方。在串池中已经存在 "wcg"这个串的情况下,如果你需要一个内容相同的串,你不需要再次创建一个,而是直接用这个就可以,这样当然是为了节省空间。注意,一个字符串是无法被修改的,所以在程序的不同地方用不同变量引用同一个常量串没有任何危险,因为你只能读取它而不能修改它。
当然,使用new String()也创建了一个对象, "wcg"作为传入构造方法的实际参数,其含义就是:我要创建一个串,它的内容和串池中的 "wcg"内容一致!
首先你要理解constant pool,这是一个特殊的共享区域,literate、Class这些可以在内存中共享的不经常改变的东西,都可以放在这里。如果你用了
String s = new String( "wcg");
那么,会有两个String被创建,一个是你的Class被CLassLoader加载时,你的 "wcg"被作为常量读入,在constant pool里创建了一个共享的 "wcg"然后,当调用到new String( "wcg")的时候,会在heap里创建这个new String( "wcg");
但是如果你把String s = new String("wcg").intern(); 那么具体过程成:先在heap里创建一个String,然后调用intern()方法,发现constant pool里存在 'wcg',然后就会返回constant pool内对象的引用,稍后heap里的就unreachable了,会被gc,最终VM里只有一个"wcg"。
所以一个在heap中,一个在String常量池。
分享到:
相关推荐
//在java中有一个常量池,当创建String 类型的引用变量给它赋值时,java会到它的常量池中找"hello world"是不是在常量池中已存在。如果已经存在则返回这个常量池中的"hello world"的地址(在java中叫引用)给变量a 。...
当使用`new String()`构造函数创建`String`时,会在堆内存中创建一个新的对象。即使两个`new`操作的字符串值相同,它们也会分别创建独立的对象。例如: ```java String s3 = new String("hello"); String s4 = new ...
本文主要分析两种创建String对象的方式:`String str = ""` 和 `new String()`,并探讨它们之间的区别以及涉及的内存管理机制。 首先,我们要了解Java内存模型的基础概念。在Java中,内存分为两大部分:栈内存...
上图红色的这3个箭头,对于通过new产生一个字符串(”宜春”)时,会先去常量池中查找是否已经有了”宜春”对象,如果没有则在常量池中创建一个此字符串对象,然后堆中再创建一个常量池中此”宜春”对象的拷贝对象。...
Java 中的 Object 对象和 String 对象是两个非常重要的概念。在 Java 中,每个对象都继承自 Object 对象,这意味着每个对象都拥有 Object 对象的方法和属性。String 对象是 Java 中最常用的对象之一,它用于存储字符...
有如下的一个字符串 String str = “QWERTYUIQQQWJHDAADADBBBBCAD”; 请统计出其中每一个字母出现的次数,在控制台打印如下的格式: A----3 B----4 C----1 D----2 请打印出字母次数最多的那一对
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
而 String str=new String("i") 创建了一个新的对象,即使内容与常量池中的字符串相同,它们在内存中是两个不同的对象。 12. 如何将字符串反转? 在 Java 中,可以使用 StringBuilder 或 StringBuffer 类的 reverse...
string str1 = new string(arr); 2、byte[]与string之间的转化 string str = 你好,hello; byte[] bytes; //byte[] 转换成 string bytes = Encoding.UTF8.GetBytes(str); //string 转换成 byte[] (字符串是用哪种...
这行代码创建了一个 String 对象,并将其引用赋值给 str 变量。 2. 使用引号包含的文本创建 String 对象 Java 代码:String str = "abc"; 这行代码创建了一个 String 对象,并将其引用赋值给 str 变量。 3. 使用...
使用new关键字创建的字符串会在堆内存中创建一个新的对象,即使常量池中已有相同的字符串,也会生成新的实例。 3. **StringBuilder/StringBuffer**:`StringBuilder sb = new StringBuilder().append("Hello")....
第一种形式用 new() 来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象。第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,...
以下是对`String`类创建对象的一些关键知识点的详细说明: 1. **字面量方式创建**: 在Java中,我们最常用的方法是通过字面量直接创建`String`对象,如`String str = "Hello"`。这种方式创建的`String`对象会存储...
因此,即使两个通过`new String()`创建的`String`对象具有相同的值,它们也会有不同的对象引用。 #### 三、String 比较 Java中有两种主要的方式来比较`String`对象: 1. **使用“==”运算符**:这种方法比较的是...
String aChar = new Character((char)i).toString();` 字符到 ASCII 码 将字符转换为 ASCII 码可以使用以下方法: * 使用强制类型转换:`char c = 'A'; int i = (int) c;` 从字符串中提取 ASCII 码 可以使用...
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...
这里,`c` 引用了由 `new` 关键字创建的一个新 `String` 对象,尽管其内容与 `a` 和 `b` 相同,但 `a == c` 返回 `false`,因为它们指向不同的内存位置。然而,`a.equals(c)` 返回 `true`,因为它们的内容确实是相同...
获得文件路径信息,C#源代码 string str; str = Path.GetExtension(Application.ExecutablePath) + "\n"; str = str + Path.GetFileNameWithoutExtension(Application.ExecutablePath) + "\n"; str = str + Path...
在上面的代码中,我们首先创建了一个 SimpleDateFormat 对象,指定了日期格式为 "yyyy-MM-dd"。然后,我们使用 parse 方法将 String 转换为 Date,使用 format 方法将 Date 转换为 String。 Timestamp 和 String ...