`

String对象的两种创建方法比较

    博客分类:
  • Java
阅读更多
    相信不少同学都会看到"String s=new String("abc")共创建了多少个对象"之类的面试题,在此小议一下这个小问题,如有不对,望各位指正。

一、String的两种初始方法
1.String str1=new String("abc");
2.String str2="abc";

    这两个方法都可以得到String的对象。

二、两种初始化String方法的区别
    执行语句String str1=new String("abc")时,不管"String常量池"中是否存在字符串"abc",直接在堆内存中新建一个字符串"abc",然后将其赋给str1,并且在"String常量池"中创建"abc",故第一种方法共创建了2个对象(一个在堆内存上,一个在"String常量池"上)和一个引用变量。

   执行语句String str2="abc"时,首先查看"String常量池"中是否存在字符串"abc",如果存在则直接将"abc"赋给str2,如果不存在则先在"String常量池"中新建一个字符串"abc",然后再将其赋给str2。

    所以两种初始化的方法的区别是第一种方法不仅会在堆内存上建立相应的对象,还会在一块特殊的内存区域建立相应的对象,而第二种方法只在特殊的内存区域("String常量池")建String对象。

三、Java为什么这样设计?
    需要知道的是,String对象是不可变的,一旦创建就不能再作任何修改,否则JVM只会帮你创建一个新的且符合你的要求的String对象(不要被假象所迷惑) ,以下做一个小验证:
String a="abc";
a.concat("efg");
System.out.println("a="+a);  

     结果是:a=abc
     的确,在执行a.concat("efg")时会返回一个新的String对象,原对象并不会改变。
     这样的后果是造成大量的冗余。如上面执行完第二句后,a的依旧引用的是"abc",而新建的一个String对象"abcefg"并没有一个引用变量指向它,这片区域就成垃圾内存了……
     SUN把String设计成不可修改,引入"String常量池"是为了高效地使用内存。



分享到:
评论

相关推荐

    java中Object对象String对象的解析.pdf

    在 Java 中,可以使用两种方式创建 String 对象:一种是使用字面值赋值方式,例如 `String s = "a";`;另一种是使用 new 关键字,例如 `String s = new String("a");`。这两种方式创建的 String 对象有很大的区别。...

    String类型两种不同实例化方式

    在Java中,String被设计成不可变(immutable)的对象,这意味着一旦一个String对象被创建,其内容就不能被修改。这种设计带来了线程安全、缓存效率以及垃圾回收的优化等优势。 ### 一、String实例化的两种方式 ###...

    解析Java中的String对象的数据类型 字符串

    这两种方式创建的String对象有所不同,前者是常量池中的字符串常量,而后者是运行时创建的新对象。 常量池(constant pool)是Java中的一个概念,它指的是在编译期被确定,并被保存在已编译的.class文件中的一些...

    Java String对象的经典问题

    ### Java String对象的经典问题 #### 一、String 类与对象机制概述 在Java中,`String`类是一个非常重要的类,它提供了丰富的功能用于处理文本数据。`String`类是不可变的(immutable),这意味着一旦一个`String`...

    String对象的创建与比较

    在Java编程语言中,`String`对象的创建与比较是一个重要的概念,因为它涉及到内存管理、对象引用以及字符串常量池的使用。...在处理`String`对象时,应始终根据具体需求选择适当的创建方法和比较方式。

    String型的不可变性

    在比较 String 对象时,我们需要使用 equals() 方法,而不能使用 == 操作符。因为 == 操作符只能判断两个对象的引用是否相同,而不能判断它们的值是否相同。例如,String str1 = "abc"; String str2 = "abc"; System...

    基于String变量的两种创建方式(详解)

    比较两种创建方式 从上面的示例中,我们可以看到,str01和str02都是String类型的变量,但是它们指向的地址不同。str01指向方法区的字符串常量池,而str02指向堆中的对象。 示例分析 让我们来看一个示例: String...

    Java中颜色的String和Color对象之间的互相转换

    这两种形式可以互相转换,本文将介绍 Java 中颜色的 String 和 Color 对象之间的互相转换。 String 到 Color 对象的转换 在 Java 中,我们可以使用 `java.awt.Color` 类来表示颜色,该类提供了多种构造函数,可以...

    JavaScript String 对象参考手册

    尽管如此,String对象提供了丰富的内置方法来处理字符串的各种需求,包括查找、替换、连接、格式化以及提取子字符串等。 首先,`length`属性是String对象的核心属性之一,它表示字符串中字符的数量。例如,`"Hello,...

    dotnet-FastString提供了两种使用字符串的方法可以比NET快得多

    `FastString`库使用了部分托管/非托管代码混合,通过C++/CLI实现,允许直接调用底层操作系统API,如内存拷贝和内存比较,这些通常比.NET Framework中的等效方法更快。 3. **缓存和重用**: 库还可能包含一些缓存...

    String的两种初始化方法讲解

    在上面的两种初始化方法中,我们可以看到,字符串对象的创建过程是不同的。在使用字面量初始化时,只要在常量池中存在该字符串对象,str就可以直接引用该对象。如果不存在,则创建一个新的字符串对象。在使用构造...

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

    在代码示例中,作者通过测量两种创建`String`对象方式的时间差异来比较它们的性能。结果显示,使用字面量的方式比使用`new`关键字快得多,这是因为前者的操作仅涉及引用查找或添加到`String Pool`,而后者的操作涉及...

    java中String类型和int类型比较及相互转换

    #### 2.1 使用compareTo方法比较String类型 对于两个String类型的比较,可以使用`compareTo()`方法。该方法返回一个整数值,表示第一个字符串相对于第二个字符串的排序位置。如果第一个字符串小于、等于或大于第二个...

    java String 使用详解

    实际上创建了两个 String 对象,一个是”abc”对象,存储在常量空间中,一个是使用 new 关键字为对象 s 申请的空间。 二、字符串的常见操作 字符串的常见操作包括 charAt 方法、compareTo 方法、concat 方法等。 ...

    用new创建对象和直接定义的区别

    这两种方法虽然最终都能创建类的实例,但它们在内存分配、作用域和生命周期等方面存在显著差异。 ### 1. `new`关键字创建对象 `new`关键字在Java、C++、C#等面向对象语言中广泛使用,它用于在堆内存中动态分配空间...

    Java String对象使用方法详解

    在Java中,比较有两种:==和equals()方法。equals()方法是Object类的方法,定义在Object类中的equals()方法是: ```java public boolean equals(Object obj){ return (this==obj); } ``` String类重写了equals()...

    深入探讨Java中的String类.pdf

    Java 中有两种方式可以比较 String 对象: 1. 使用 "==" 操作符:例如,s1 == s2; 2. 使用 equals() 方法:例如,s1.equals(s2); 四、String.Pool 机制 Java 中的 String 类有一个特殊的机制,称为 String.Pool ...

    Java String创建对象实例解析

    StringBuilder 和 StringBuffer 是两种可变字符串对象,它们的内部字符数组长度可以变。StringBuilder 非线程安全,而 StringBuffer 是线程安全的。 代码示例 下面是一个简单的代码示例,演示了 Java String 创建...

Global site tag (gtag.js) - Google Analytics