1.在JVM中存在着一个字符串池,其中保存着很多的String对象,并且可以被共享,因此能提升性能。由于String类是final的,它的值创建后就不可改变,所以不需要担心共享会导致程序混乱.
2.String var = "king"的执行过程:首先在字符串池中查找是否已经有"king"这样的一个对象,通过String类的equals()来判断;如果有,则不再创建新的对象,直接返回已存在对象的引用;如果不存在,则先创建这样的一个对象,然后将它加入到字符串池中,再将它的引用返回。这也说明了为什么String var1 = "king", String var2 = "king";再比较两者的引用对象(var1 == var2)时是相等的。
3.而String str = new String("king");创建了两个对象,它的执行过程如下:首是"king",在字符串池中查找"king"对象,如果没有,则在字符串池中创建"king"对象,然后在堆上创建String()对象,将共享字符串池中的"king"(String对象引用的字符串"king"就在字符串池中,不需要在String对象的char[]数组中再保存一份),返回堆上String对象的引用。所以在字符串池中创建一个对象,在堆上创建一个对象,一共是创建了两个对象。
4.只有使用""+""方式创建的String对象才会加入到字符串池当中, 对于所有包含new方式新创建的对象的"+"连接表达式,它所产生的对象都不会被加入到字符串池中。
测试代码:
public static void main(String[] args) {
String a = "a";
String b = "b";
String c = "ab";
String d = "a" + "b";
String e = a + b;
System.out.println(c == d);
System.out.println(c == e);
}
输出:
true
false
分享到:
相关推荐
### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...
第一种形式用 new() 来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象。第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,...
这行代码创建了一个 String 对象,并将其引用赋值给 str 变量。 2. 使用引号包含的文本创建 String 对象 Java 代码:String str = "abc"; 这行代码创建了一个 String 对象,并将其引用赋值给 str 变量。 3. 使用...
使用new关键字创建的字符串会在堆内存中创建一个新的对象,即使常量池中已有相同的字符串,也会生成新的实例。 3. **StringBuilder/StringBuffer**:`StringBuilder sb = new StringBuilder().append("Hello")....
因此,即使两个通过`new String()`创建的`String`对象具有相同的值,它们也会有不同的对象引用。 #### 三、String 比较 Java中有两种主要的方式来比较`String`对象: 1. **使用“==”运算符**:这种方法比较的是...
即使 `str2` 使用了 `"abc"` 作为构造参数,但由于是通过 `new` 关键字创建的新对象,所以与 `str1` 不是指向同一个对象。 #### 四、总结 通过以上的分析可以得出以下结论: 1. **直接赋值方式**:这种创建方式...
String str = new String("abc"); ``` **1.2 字符串比较** - **使用`==`操作符**: - 当两个字符串通过字面量创建时,它们共享同一内存区域(字符串常量池),因此使用`==`比较时结果为`true`。 - 如果至少有...
String str1 = new String("abc"); String str2 = "abc"; System.out.println(str1==str2);//false String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1==str2);//false ...
- `str3`和`str4`分别通过`new String()`创建,它们在堆中,因此`str3==str4`为`false`,创建了三个对象。 - `i`和`j`都是基本类型`int`,它们在栈中直接存储,所以`i==j`为`true`,只创建了一个对象。 - `l1`和`k1`...
string str = "AbC"; string lowerStr = str.ToLower(); // "abc" string upperStr = str.ToUpper(); // "ABC" ``` 2. `.Trim()` `.Trim()` 方法用于移除字符串两端的空白字符,如空格、制表符等。 ```csharp...
使用new创建String对象时,JVM不会去检查常量池中是否已有相同的字符串,而是直接在堆内存中创建一个新的String对象。这意味着即使两个使用new关键字创建的字符串内容完全相同,它们也是不同的对象,拥有不同的内存...
然而,如果使用`new`关键字创建`String`,则会在堆中创建新对象,即使值相同: ```java String s3 = new String("abc"); String s4 = new String("abc"); System.out.println(s3 == s4); // 输出false,因为s3和s4...
2. 使用 `new String()` 关键字创建 `String` 对象时,会在堆中创建一个新对象,并且如果是通过字符串常量初始化,还会在常量池中创建一个相同的字符串对象。 3. 当比较两个由 `new String()` 创建的对象时,即使...
利用影射,通过查询数据库里的方法名称,来调用方法 SqlConnection conn = new ... asac.abc c = new asac.abc(); TextBox1.Text = c.abcd(dr); conn.Close(); // str1 = str1.Substring(0, str1.Length - 1);
这一语句创建了两个对象:一个是常量池中的 "abc",另一个是堆中的 String 对象。 6. String、StringBuffer、StringBuilder 有什么区别? 答案:String、StringBuffer、StringBuilder 最大的不同是 String 不可变...
在C#编程中,字符串处理是常见的操作,尤其是在软件开发中。本文主要介绍了C#中常用的几种字符...在实际应用中,还需要注意字符串是不可变的,每次操作都会创建新的字符串对象,因此在处理大量字符串时要考虑性能影响。
2. 使用`new`关键字创建新对象:`String str = new String("abc");` 当使用"=="来比较字符串时,它实际上是在检查两个字符串是否指向内存中的同一个引用,而不是比较它们的内容。这意味着,如果两个字符串变量都...
string str = "abc"; char r = str[0]; // r的值是'a' ``` 可以使用foreach循环来遍历字符串中的每个字符。例如: ```csharp string str = "abc"; foreach (char item in str) { Console.WriteLine($"输出的字符:{...
### JAVA面试题解:String创建了几个对象? 在JAVA面试中,经常会出现关于`String`对象创建的问题。本文将深入探讨“一行代码创建了多少个`String`对象?”这一经典问题,通过对具体示例的分析,逐步揭示其背后的...