`

String创建对象

    博客分类:
  • java
F# 
阅读更多
例1: String x = new String("xyz");    (1)
      String y = "abc";                (2)
      x = x + y;                       (3)
问:上述三个语句总共创建了多少String对象?
答:总共4个String对象,语句(1)中在Heap上创建了一个对象,同时也在String常量池中创建了一个值为"xyz"的对象;语句(2)在String常量池里创建了一个值为"abc"的对象;语句(3)中表达式x+y在String常量池中创建了一个值为"xyzabc"的对象,然后用引用x指向该对象的内存地址。


例2:String s = new String("xyz");     (1)
     String y = "abc";                 (2) 
     String z = new String("xyz");     (3)
     x = x + y;                        (4)
问:上述三个语句总共创建了多少String对象?
答:总共5个String对象,和例1中唯一的差别在于语句(3)只在Heap中创建了一个String对象,而没有在String常量池里创建新的对象。

从上面两个例子中,我们可以发现修改String对象带来的耗费是十分巨大的,例如
以下语句:
     String a = "aaa";
     a = a + a.toUpperCase();
在执行a.toUpperCase()的时候在常量池中生成一个对象,执行a + a.toUpperCase()的时候又在常量池中生成一个对象,其根本原因在于String对象的不变性。当程序需要生成很多String对象的时候,内存空间的问题就有待解决了。
    幸运的是,我们可以利用StringBuffer对象,它同样也利用String常量池,但是主要的优点是StringBuffer对象的值在常量池上是可以改变的。例如:
    StringBuffer sb = new StringBuffer("sb");
    sb.append("a");       //append "a" behind "sb"
这样sb仍然指向原来的String常量池的内存区域,但是相应内存的值发生了变化,所以利用StringBuffer对象生成或者修改字符串的代价一般来说是String对象的一半。
    那么,如何将StringBuffer对象转化为String对象呢,我们可以利用toString这个方法,比如:
    String s = sb.toString();
    最后让我们来看一下String类型、基本类型以及外覆类类型是如何相互转化的:
(1) String类型向基本类型的转化: 可以使用parseXXX方法,XXX只的是转化后的类型,例如:
    String s = "12";
    int i = Integer.parseInt(s);
(2) String类型向外覆类型的转化: 可以使用valueOf方法,例如:
    Float f = Float.valueOf("3.14");
(3) 基本类型事实上没有直接的方法转化成String类型。但是,如果你实在想转化,可以利用以下技巧: String s = i + "";
    其他方面的转化阅读javadoc就知道,在此略去。希望这两篇关于String类型的应用的文章能给您提供帮助。

分享到:
评论

相关推荐

    Java String创建对象实例解析

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

    String类创建对象问题

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

    String对象创建问题

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

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

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

    JNI处理hashmap,string等对象的操作

    对于String对象的处理,JNI提供了`NewStringUTF`函数来创建一个新的Java String对象,以及`GetStringUTFChars`和`ReleaseStringUTFChars`来获取和释放字符串的UTF-8表示。例如,你可能需要在本地代码中解析或修改...

    String对象详解(附代码)

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

    c++中由类名(string)创建这个类对象(RTTI)

    总结来说,C++的RTTI机制提供了在运行时检查和转换类型的能力,但直接根据类名字符串创建对象通常需要借助设计模式(如工厂模式)或其他高级技术(如动态链接库和元类系统)。在实际开发中,合理利用这些工具可以...

    Java String对象的经典问题

    - **直接赋值**:这种方式会在**字符串常量池**(String Pool)中查找或创建一个对应的`String`对象,并将变量指向该对象。字符串常量池是Java堆的一部分,专门用来存储字符串字面量。如果字符串常量池中已经存在...

    java四种创建对象的方式

    Java中创建对象主要有四种显式的方式,分别是使用new关键字、反射机制、克隆克隆方法以及反序列化手段。每种方法都有其特定的使用场景和特点,以下是这些方法的详细说明: 1. 使用new关键字创建对象 这是最常见也是...

    String对象的内存分析

    本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...

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

    使用字面值赋值方式创建的 String 对象会被存储在 String 池中, String 池是一个特殊的存储区域,用于存储字符串常量。使用 new 关键字创建的 String 对象则会被存储在堆中。 在比较 String 对象时,需要使用 ...

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

    Java 中颜色的 String 和 Color 对象之间的互相转换 在 Java 中,颜色的表示形式有多种,包括字符串形式和 Color 对象形式。这两种形式可以互相转换,本文将介绍 Java 中颜色的 String 和 Color 对象之间的互相转换...

    JAVA面试题解惑系列(二)——到底创建了几个String对象-JAVA程序员JAVA工程师面试必看.pdf,这是一份不错的文件

    JAVA 面试题解惑系列之 String 对象创建机制 本文将深入探讨 JAVA 中 String 对象的创建机制,解答常见的面试题目,并探索 String 对象池的概念和机制。 一、String 对象的创建方式 在 JAVA 中,String 对象可以...

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

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

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

    在Java中,如果我们使用字面值方式创建的String对象,它们是常量池中的字符串常量,如果我们使用new关键字创建的String对象,它们是运行时创建的新对象。例如,String s0="kvill";,String s1=new String("kvill");...

    String型的不可变性

    第一种形式用 new() 来创建对象的,它会存放在堆中,每调用一次就会创建一个新的对象。第二种形式是先在栈中创建一个对 String 类的对象引用变量 str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,...

Global site tag (gtag.js) - Google Analytics