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处理的...
分享到:
相关推荐
`std::string`类的强大还体现在其内存管理上,它自动处理字符串的动态增长和收缩,避免了手动内存分配和释放的繁琐。当需要增加字符串长度时,`std::string`会自动分配更多的内存;反之,如果字符串缩短,多余的内存...
#### 三、创建String对象的方式及内存分配分析 ##### 1. 使用字符串字面量 当使用字符串字面量创建 `String` 对象时,如 `String s = "abc";`,内存分配过程如下: - JVM 首先检查 **常量池** 中是否已经存在一个...
String类的字符串是不可变的,即使你对其进行了添加、删除等操作,也是从内存的其他区域进行存储的,而不是在原来的字符串上进行修改。这是因为String类使用了final关键字,使得它的字符串内容不能被修改。 在...
String类的intern、split方法 String 类的 intern 方法是一个本地方法,定义...String 类的 intern 方法和 split 方法都是非常重要的方法,它们可以帮助我们更好地处理字符串操作,避免内存的浪费,提高程序的性能。
本篇文章将深入探讨`String`对象的内存分析,包括栈、堆、常量池以及静态存储的概念,并通过具体的示例来解析不同情况下`String`对象的创建和内存分配。 首先,了解Java内存的基本结构。Java内存分为以下几个区域:...
在C++编程语言中,`std::string` 类是一个非常重要的工具,用于处理文本字符串。这个类是标准库的一部分,提供了丰富的功能来创建、操作和管理字符串数据。在这个"链表string类程序"中,我们可以预想它可能涉及到用...
本篇文章将深入解析`std::string`类的一些关键知识点,特别是根据标题描述提及的拷贝构造函数、深拷贝与浅拷贝、追加函数、赋值函数以及字符串比较和重载运算符。 1. **拷贝构造函数**: 拷贝构造函数是一种特殊的...
1. **内存管理**:自定义string类需要动态分配内存来存储字符序列。这通常通过`new`操作符完成,并且需要管理内存释放,以防止内存泄漏。 2. **拷贝构造函数和赋值运算符**:这两个是C++中的深拷贝问题,确保在复制...
通过以上分析,我们可以看到这个自定义的`String`类虽然简单,但却涵盖了字符串类中最基础的操作:构造、析构、赋值等。这些操作是字符串类设计的基础,也是理解和实现更复杂字符串类的关键。当然,在实际应用中,...
在本案例中,我们通过自定义一个`String`类来探讨如何在C++中实现字符串类的基本功能,包括构造函数、析构函数、重载运算符以及成员函数等。 #### 二、构造函数与析构函数 1. **默认构造函数**:`String(){x=NULL;...
在Java编程语言中,`Object`和`String`类是非常基础且重要的概念。这里我们将针对提供的文件内容,详细解析和扩展相关知识点。 1. **重写`equals()`方法**: 在示例代码中,尝试重写了`equals()`方法来判断两个`...
### String类创建对象问题 ...总结来说,了解 `String` 类的创建过程及其在内存中的存储方式对于理解 Java 中字符串的工作机制至关重要。正确地使用字符串不仅可以提升程序的性能,还能避免潜在的内存泄漏等问题。
### 正确使用String类的几点注意 在Java编程中,`java.lang.String`类是极为常见的基础数据类型之一,其重要性和应用范围不言而喻。为了更好地理解和使用String类,本文将从几个关键方面入手,探讨如何更加高效、...
接下来,我们转向String类型的深度解析。String在Java中被广泛使用,它具有不可变性,意味着一旦创建,其值就不能改变。这是为了保证线程安全和提高性能。String对象有两种创建方式:字面量(如`"hello"`)和`new ...
在`String`类中,析构函数应该释放`m_data`指向的内存。 ```cpp String::~String() { delete[] m_data; } ``` 这里使用`delete[]`是因为`m_data`可能指向一个字符数组,需要释放整个数组而不是单个对象。 #### ...
以下是对Java中String类的全面解析,包括其比较方式、字符串常量的本质、以及常用的字符串操作方法。 一、String的比较方式 在Java中,字符串的比较主要通过`equals()`方法和`equalsIgnoreCase()`方法来实现。 1. ...
在Java编程语言中,类对象的创建和内存解析是理解面向对象编程的关键概念。当我们谈论“类对象”时,我们实际上是指类的实例,也就是常说的对象。这些对象是通过类的构造器创建的,而类则定义了对象的属性(字段)和...
这意味着一旦一个`String`对象被创建,其值就不能再被改变,这种特性使得字符串可以被安全地共享,提高内存效率。与之相对的是`StringBuffer`和`StringBuilder`类,它们支持可修改的字符串。 #### 字符串常量与实例...