`

string类内存解析

    博客分类:
  • java
阅读更多
String是java常用类中最重要的类,主要是它很多特殊点,网上分析的例子很多,我
也想谈下自己的看法,最经典的问题是String a=new String("abc");是如何实现创建
2个对象的?
   我们看下String的构造方法,SUN(ORACLE),JDK源码的解释:
/**
     * Initializes a newly created <code>String</code> object so that it
     * represents the same sequence of characters as the argument; in other
     * words, the newly created string is a copy of the argument string. Unless 
     * an explicit copy of <code>original</code> is needed, use of this 
     * constructor is unnecessary since Strings are immutable. 
     *
     * @param   original   a <code>String</code>.
     */
    public String(String original) {
	int size = original.count;
	char[] originalValue = original.value;
	char[] v;
  	if (originalValue.length > size) {
 	    // The array representing the String is bigger than the new
 	    // String itself.  Perhaps this constructor is being called
 	    // in order to trim the baggage, so make a copy of the array.
	    v = new char[size];
 	    System.arraycopy(originalValue, original.offset, v, 0, size);
 	} else {
 	    // The array representing the String is the same
 	    // size as the String, so no point in making a copy.
	    v = originalValue;
 	}
	this.offset = 0;
	this.count = size;
	this.value = v;
    }


也就是说String类在init的时候就已经创建了一个char数组对象(数组对象也是存放在堆内存中),我们可以用一个图来形象的表示下:

从图里我们可以看到开始new的时候需要进行2个步骤,先init再new,由于普通类init的时候不会创建对象,只有在new的时候才创建,也就只能创建一个对象,而String不一样,在初始化的时候就已经创建了一个对象,当new的时候又会再创建一个,自然是2个,而a引用new处理的...
分享到:
评论

相关推荐

    简单的string类

    `std::string`类的强大还体现在其内存管理上,它自动处理字符串的动态增长和收缩,避免了手动内存分配和释放的繁琐。当需要增加字符串长度时,`std::string`会自动分配更多的内存;反之,如果字符串缩短,多余的内存...

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

    #### 三、创建String对象的方式及内存分配分析 ##### 1. 使用字符串字面量 当使用字符串字面量创建 `String` 对象时,如 `String s = "abc";`,内存分配过程如下: - JVM 首先检查 **常量池** 中是否已经存在一个...

    String StringBuffer和StringBuilder区别之源码解析

    String类的字符串是不可变的,即使你对其进行了添加、删除等操作,也是从内存的其他区域进行存储的,而不是在原来的字符串上进行修改。这是因为String类使用了final关键字,使得它的字符串内容不能被修改。 在...

    String类的intern、split方法

    String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义...String 类的 intern 方法和 split 方法都是非常重要的方法,它们可以帮助我们更好地处理字符串操作,避免内存的浪费,提高程序的性能。

    String对象的内存分析

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

    c++链表string类程序

    在C++编程语言中,`std::string` 类是一个非常重要的工具,用于处理文本字符串。这个类是标准库的一部分,提供了丰富的功能来创建、操作和管理字符串数据。在这个"链表string类程序"中,我们可以预想它可能涉及到用...

    c++string类源码

    本篇文章将深入解析`std::string`类的一些关键知识点,特别是根据标题描述提及的拷贝构造函数、深拷贝与浅拷贝、追加函数、赋值函数以及字符串比较和重载运算符。 1. **拷贝构造函数**: 拷贝构造函数是一种特殊的...

    数据结构学习——我的string类

    1. **内存管理**:自定义string类需要动态分配内存来存储字符序列。这通常通过`new`操作符完成,并且需要管理内存释放,以防止内存泄漏。 2. **拷贝构造函数和赋值运算符**:这两个是C++中的深拷贝问题,确保在复制...

    自定义string类

    通过以上分析,我们可以看到这个自定义的`String`类虽然简单,但却涵盖了字符串类中最基础的操作:构造、析构、赋值等。这些操作是字符串类设计的基础,也是理解和实现更复杂字符串类的关键。当然,在实际应用中,...

    简单的string类的模拟

    在本案例中,我们通过自定义一个`String`类来探讨如何在C++中实现字符串类的基本功能,包括构造函数、析构函数、重载运算符以及成员函数等。 #### 二、构造函数与析构函数 1. **默认构造函数**:`String(){x=NULL;...

    Object,String类练习.doc

    在Java编程语言中,`Object`和`String`类是非常基础且重要的概念。这里我们将针对提供的文件内容,详细解析和扩展相关知识点。 1. **重写`equals()`方法**: 在示例代码中,尝试重写了`equals()`方法来判断两个`...

    String类创建对象问题

    ### String类创建对象问题 ...总结来说,了解 `String` 类的创建过程及其在内存中的存储方式对于理解 Java 中字符串的工作机制至关重要。正确地使用字符串不仅可以提升程序的性能,还能避免潜在的内存泄漏等问题。

    正确使用String类的几点注意

    ### 正确使用String类的几点注意 在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、...

    day09_02String类的内存解析

    java内存分配和String类型的深度解析Java开发J

    接下来,我们转向String类型的深度解析。String在Java中被广泛使用,它具有不可变性,意味着一旦创建,其值就不能改变。这是为了保证线程安全和提高性能。String对象有两种创建方式:字面量(如`"hello"`)和`new ...

    编写类String的构造函数

    在`String`类中,析构函数应该释放`m_data`指向的内存。 ```cpp String::~String() { delete[] m_data; } ``` 这里使用`delete[]`是因为`m_data`可能指向一个字符数组,需要释放整个数组而不是单个对象。 #### ...

    全面解析Java中的String类的使用

    以下是对Java中String类的全面解析,包括其比较方式、字符串常量的本质、以及常用的字符串操作方法。 一、String的比较方式 在Java中,字符串的比较主要通过`equals()`方法和`equalsIgnoreCase()`方法来实现。 1. ...

    类对象的创建及内存解析

    在Java编程语言中,类对象的创建和内存解析是理解面向对象编程的关键概念。当我们谈论“类对象”时,我们实际上是指类的实例,也就是常说的对象。这些对象是通过类的构造器创建的,而类则定义了对象的属性(字段)和...

    Java中String类的详细文档打印版

    这意味着一旦一个`String`对象被创建,其值就不能再被改变,这种特性使得字符串可以被安全地共享,提高内存效率。与之相对的是`StringBuffer`和`StringBuilder`类,它们支持可修改的字符串。 #### 字符串常量与实例...

Global site tag (gtag.js) - Google Analytics