`

String 创建

阅读更多
package com;
import org.junit.Test;
public class TestString
{

public void test1()
{
   String s = new String("abc");
   String s1 = "abc";
   String s2 = new String("abc");
 
   System.out.println(s == s1);
   System.out.println(s == s2);
   System.out.println(s1 == s2);
System.out.println(s == s.intern());
   System.out.println(s1 == s.intern());
   System.out.println(s1.intern() == s2.intern()); 上述代码中:
String s = new String("abc"); 请问在内存中创建了几个对象?分别在什么地方?
创建了两个对象,分别在String Pool(常量池)和Heap(堆)里.
首先生成了一个对象,叫"abc",在String Pool里面,先在常量池里查找是否有
"abc",发现没有就把"abc"放入String Pool里面.
接下来,执行new String("abc")构造方法,new出来的对象都放在Heap里面.
在Heap里又创建了一个"abc"的对象.这时内存里就有两个对象了,一个在String Pool
里面,一个在Heap里面.

只有String类型 有String Pool(常量池),String类是不可变的类.在创建对象,先在常量池里查找是否有
"abc"的常量,如果没有则创建一个新的,如果有则不会再创建,使用原来已经存在的.
其中s只是一个对象的引用(存放对象的地址),而不是对象.
在执行完第二句String s1 = "abc";后内存里创建了几个对象?为什么?
在执行完String s1 = "abc";后内存里一个对象也没有创建.因为在它先在String Pool里面检查是否有
内容为"abc"的字符串对象存在,发现已经有一个了,就不会再创建.(因为在执行完第一句已经存在一个"abc"了).
在执行完第三句String s2 = new String("abc");后内存中创建了几个对象?为什么?
在执行完第三名,内存创建了一个对象.因为此句中的"abc"先在String Pool里面查找是否有
内容为"abc"的对象,发现已经在在就不会再创建新的了.然后new String("abc")会在堆里
创建一个新的"abc"对象,只要new出来的,不管内容是否相同,都会在Heap中创建一个对象.
所以此句执行后只在Heap中创建了一个对象.

s == s.intern() 其中s.intern()会首先在String Pool里查找是否有内容为"abc"的对象,
发现存在,就会返回String Pool里面内容为"abc"的对象,地址也指向它.所以此句输出false.
s1 == s.intern() 同样,s1指向的是String Pool里面内容为"abc"的对象,所心此句输出true.
s1.intern() == s2.intern() 同样,s1.intern()和s2.intern()指向的都String Pool里面内容
为"abc"的对象,所以此句输出true.
***********************************************
s == "hel" + "lo"当加号两边都是常量值时,就会组成一个新的常量值在String Pool里面.
如果String Pool已经有相同内容的就不会再创建.输出true.
"hel" + s2 当加号两边有一个不是常量值,会在堆里面创建一个新的"hello"对象.输出false
s1 + s2 同上,输出false.





}

public void test2()
{
   String s = "hello";
   String s1 = "hel";
   String s2 = "lo";
 
   System.out.println(s == "hel" + "lo");
   System.out.println(s == "hel" + s2);
   System.out.println(s == s1 + s2);
}
}
分享到:
评论

相关推荐

    String创建对象

    面试或笔试中,`String`对象的创建方法是常见的考察点。以下是对`String`类创建对象的一些关键知识点的详细说明: 1. **字面量方式创建**: 在Java中,我们最常用的方法是通过字面量直接创建`String`对象,如`...

    Java String创建对象实例解析

    Java String 创建对象实例解析 Java String 创建对象实例解析是 Java 语言中一个重要的概念,它涉及到字符串对象的创建、内存分配、垃圾回收等方面。在 Java 中,String 是一个特殊的类,它既是类也是对象。下面...

    string 的创建

    ### String 创建的理解与深入解析 #### 一、String 创建的位置:栈 vs 堆 **栈(Stack)** 和 **堆(Heap)** 是 Java 内存管理中的两个重要概念,它们分别负责不同类型的内存分配。 1. **栈内存**: - **特点**...

    String对象创建问题

    在Java编程语言中,`String`对象的创建是开发者经常遇到的问题,因为它涉及到内存管理和效率。`String`类在Java中被广泛使用,因为它代表不可变的字符序列,这使得它在很多场景下非常安全。这里我们将深入探讨`...

    String类创建对象问题

    ### String类创建对象问题 #### 一、String 类与常量池、字符串池的基本概念 在 Java 中,`String` 类并不属于八种基本数据类型之一,而是作为一个对象存在。这意味着 `String` 对象默认值为 `null`。尽管如此,`...

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

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

    numpy使用fromstring创建矩阵的实例

    在本篇实例中,我们将深入探讨如何使用`np.fromstring`函数来创建不同数据类型的矩阵。 首先,`np.fromstring`函数主要接受两个参数:第一个参数是要转换的字符串,第二个参数`dtype`用于指定生成的数组的数据类型...

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

    ### 创建string对象过程的内存分配详解 #### 一、引言 在Java中,`String` 类是最常用的数据类型之一,用于表示不可变的字符序列。`String` 对象的创建涉及复杂的内存分配机制,特别是在Java虚拟机 (JVM) 的环境中...

    String对象详解(附代码)

    对String创建几个对象代码详解,包括字符串相加,对象相加等等

    JAVA面试题解

    ### JAVA面试题解:String创建了几个对象? 在JAVA面试中,经常会出现关于`String`对象创建的问题。本文将深入探讨“一行代码创建了多少个`String`对象?”这一经典问题,通过对具体示例的分析,逐步揭示其背后的...

    共享struct2string由结构体变量获得其创建语句-struct2string.rar

    共享struct2string由结构体变量获得其创建语句-struct2string.rar 本帖最后由 黄小标 于 2012-9-27 21:19 编辑 struct2string 顾名思义就是将struct变量变成字符串,此处字符串是此变量的创建语句。 不才,...

    StringtoList和StringtoMap和StringtoObject和StringtoArray

    如果JSON字符串代表的是一个自定义Java对象,你可以创建一个对应的类并使用Gson的`fromJson`方法将其转换: ```java class Fruit { private String name; private String color; // getters and setters... }...

    String型的不可变性

    但是,如果我们使用 new 操作符来创建 String 对象,例如,String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(str1 == str2); // false,这里 str1 和 str2 指向不同的对象。 ...

    List转换成String数组

    - `list.toArray(new String[list.size()])`将`List<String>`中的所有元素复制到新创建的字符串数组中。 **方法二:简化版toArray()方法** ```java List<String> list = new ArrayList<String>(); list.add("a1");...

    基于Keil实现字符串函数string.h的简单应用

    基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用基于Keil实现字符串函数string.h的简单应用...

    list转换成string数组

    - **数组长度**:当使用`new String[list.size()]`创建数组时,确保列表中的元素数量与数组长度一致,避免出现数组越界的问题。 - **性能考虑**:在转换过程中,尽量减少不必要的对象创建,尤其是当列表很大时,这...

    String[] list 相互转化

    // 获取 List 大小并创建一个 String 类型的数组 final int size = list.size(); String[] arr = (String[]) list.toArray(new String[size]); ``` 这里的关键点在于 `list.toArray(new String[size])` 这一行代码...

    小心String的陷阱——深入剖析Java中String的处理机制

    `String Pool`是存储`String`字面量的缓存池,当通过字面量的方式创建`String`对象时,Java虚拟机首先检查`String Pool`中是否已经存在相同的字符串,如果存在,则返回该字符串的引用,而不是创建一个新的对象。...

    String和string区别以及string详解

    `string`类型是不可变的,这意味着一旦创建了一个`string`对象,就不能更改它的内容。例如: ```csharp string str = "Hello"; str += " World"; // 实际上是创建了新的字符串对象 ``` 在这个例子中,虽然表面上看...

Global site tag (gtag.js) - Google Analytics