`
王世伟
  • 浏览: 25641 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

String的存储和赋值

 
阅读更多

可能很多java的初学者对String的存储和赋值有迷惑,以下是一个很简单的测试用例,你只需要花几分钟时间便可理解。

1.在看例子之前,确保你理解以下几个术语:

栈 :由JVM分配区域,用于保存线程执行的动作和数据引用。栈是一个运行的单位,Java中一个线程就会相应有一个线程栈与之对应。

堆 :由JVM分配的,用于存储对象等数据的区域。

常量池 :在堆中分配出来的一块存储区域,用于存储显式 的String,float或者integer.例如String str="abc"; abc这个字符串是显式声明,所以存储在常量池。



2.看这个例子,用JDK5+junit4.5写的例子,完全通过测试

import static org.junit.Assert.assertNotSame;  
import static org.junit.Assert.assertSame;  
 
import org.junit.Test;  
 
/** 
* @author Heis 

*/ 
public class StringTest{  
 
    @Test 
    public void testTheSameReference1(){  
        String str1="abc";  
        String str2="abc";  
        String str3="ab"+"c";  
        String str4=new String(str2);  
          
        //str1和str2引用自常量池里的同一个string对象  
        assertSame(str1,str2);  
        //str3通过编译优化,与str1引用自同一个对象  
        assertSame(str1,str3);  
        //str4因为是在堆中重新分配的另一个对象,所以它的引用与str1不同  
        assertNotSame(str1,str4);  
    }  
      

 

这个程序很好理解,因为在解析的时候,"abc"被存储在常量池中,str1和str2的引用都是指向常量池中的"abc"。所以str1和str2引用是相同的。

import static org.junit.Assert.assertNotSame; 
import static org.junit.Assert.assertSame; 

import org.junit.Test; 

/** 
* @author Heis 
* 
*/ 
public class StringTest{ 

@Test 
public void testTheSameReference1(){ 
String str1="abc"; 
String str2="abc"; 
String str3="ab"+"c"; 
String str4=new String(str2); 

//str1和str2引用自常量池里的同一个string对象 
assertSame(str1,str2); 
//str3通过编译优化,与str1引用自同一个对象 
assertSame(str1,str3); 
//str4因为是在堆中重新分配的另一个对象,所以它的引用与str1不同 
assertNotSame(str1,str4); 
} 

} 

  
这里由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。
str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。


3.知道字符串怎么存储和赋值的,就不难理解在下面这些例子到底创建了几个String对象了

例1:

String str = "abc";

 这里毫无疑问是一个对象

例2:

String a = "abc";
String b = "abc";

 这里呢?有的人可能会说有两个,但是这里其实只有一个对象.这里a和b都应用对象池里的同一个对象.

例3:

String str = "ab" + "cd";

 这里也只有一个,因为这里是字面量的连接,它被优化了,在Java编译的时候就可以确定,然后直接在对象池取,它等同于

String str = "abcd";

例4:

String str1 = "ab";
String str2 = str1 + "cd";

 这里总共有3个对象

例5:

String str = new String("abc");

 这里是两个对象,一个是String类型的引用对象,一个是引用对象所指向的实例对象

 

分享到:
评论

相关推荐

    标准C++中string用法详解

    `string`支持诸如加法运算符(`+`)、赋值运算符(`=、+=`)、比较运算符(`<、==`)以及索引访问(`[]`)等操作。 **示例代码:** ```cpp #include <string> #include int main() { std::string strinfo = ...

    浅谈java中String的两种赋值方式的区别

    Java 中 String 类型的变量可以通过两种方式进行赋值:直接赋值和 new 关键字赋值。了解这两种方式的区别对于 Java 开发者来说非常重要。 直接赋值 直接赋值是指使用赋值语句将字符串直接赋值给 String 变量。例如...

    编写类String 的构造函数、析构函数和赋值函数.docx

    以上四个函数是C++中类设计的基础组件,它们确保了`String`类对象能够正确地创建、复制和销毁,并且支持赋值操作。在实际编程中,还需要考虑异常安全性和效率优化,例如使用深拷贝和浅拷贝的概念来防止悬挂指针,...

    QString和char以及string之间的赋值详解

    在C++编程中,特别是在...理解这些转换和赋值机制对于有效且安全地在`QString`、`std::string`和`char*`之间操作字符串至关重要。在实际编程中,应根据项目需求和编码规范选择合适的字符串类型,并注意避免潜在的错误。

    Android String

    `equals()` 和 `compareTo()` 方法可用于比较两个`String`对象的内容。 - `equals()`: 如果两个字符串的内容相同则返回`true`。 - `compareTo()`: 返回一个整数值,表示当前字符串与另一个字符串的字典顺序。 ### ...

    Java程序设计基础:创建String字符串.pptx

    直接赋值方式,例如:String s1= "Welcome to Java"; 含义:字符串常量直接初始化一个String对 象,赋值给引用变量,s1指向字符串对象。 字符串变量中存储的是对象的地址。 例 1: String str = "Hello Java"; // ...

    java中String类型变量的赋值问题介绍_.pdf

    这是由于String对象存储在常量池中,修改String对象实际上会创建一个新的对象,而原始对象保持不变。这在内存管理、线程安全以及字符串操作效率上都有深远的影响。 在给定的代码示例中,有两个关键点: 1. 对于...

    C#引用类型的赋值 类的赋值

    3. 当`a`被赋值为`b`时,`a`和`b`指向了同一个对象,而`c`仍指向之前对象。 #### 五、结论 C#中引用类型的赋值操作实际上只是传递了指向对象的引用,而不是复制整个对象本身。这意味着在处理大型对象时,引用类型...

    Android String字符串数组动态增加

    因此,如果需要动态增加元素,我们需要在代码中创建和操作ArrayList<String>对象。ArrayList是Java中的一个动态数组,它可以方便地进行插入、删除等操作。 以下是使用ArrayList动态增加String的步骤: 1. **创建...

    android用base64实现文件与string相互转换

    总结,Android通过内置的Base64工具类可以轻松地完成文件与String之间的转换,这对于数据传输和存储非常有用。只要理解了Base64编码的基本原理和Android提供的API,就可以高效地实现这种转换。在实际项目中,根据...

    VB程序设计初步 常量变量和赋值语句PPT课件.pptx

    VB程序设计初步常量变量和赋值语句PPT课件 VB程序设计初步中,常量和变量是两个基本概念。常量是程序设计过程中值不变的存储单元或数据,例如圆周率pi=3.14,重力加速度g=9.8。变量是用来表示数据的存储区域,在...

    C++string类常用函数

    - 分别使用整个 `string` 对象 `s` 和从 `s` 的位置 `start` 开始的 `n` 个字符来赋值。 - **使用重复字符赋值**: - `string &assign(int n, char c);` - 使用 `n` 个字符 `c` 来赋值。 #### 字符串连接 `...

    String实例

    字符串类通常需要提供赋值操作符(`=`),以便将一个`String`对象赋值给另一个。这里我们实现浅拷贝和深拷贝: ```cpp String& operator=(const String& other) { if (this != &other) { delete[] this->str; ...

    String类的重写 C++

    - **深拷贝和浅拷贝**:在实现赋值运算符和构造函数时如何避免浅拷贝问题? 总的来说,重写`String`类涉及内存管理、运算符重载、对象生命周期管理等多个方面。理解这些概念有助于深化对C++的理解,并为解决实际...

    C++ STL string常用函数

    - `capacity()`: 返回当前`string`对象的容量,即能存储的最大元素数量。 - `max_size()`: 返回`string`对象可能达到的最大大小。 - `operator[]`, `at()`: 访问`string`中的单个字符,其中`at()`会进行边界检查,...

    string类的构造方法_String类重要吗_C++_STL_string_

    在C++标准模板库(STL)中,`std::string`类是一个极其重要的容器,它专门用于存储、操作和管理字符串数据。标题中的“string类的构造方法”揭示了我们要探讨的核心内容——如何初始化和创建`std::string`对象。`std...

    string类中英文文档

    2. **赋值与拷贝:** `std::string`支持赋值运算符`=`,可以用来改变字符串的值。同时,`std::string`也支持深拷贝,确保了拷贝的安全性。 3. **访问字符:** 使用下标运算符`[]`可以直接访问字符串中的字符,但注意...

    datatable赋值,初学者适用

    在.NET框架中,DataTable是一个非常重要的数据结构,用于在内存中存储和操作表格型数据。对于初学者来说,掌握DataTable的使用是学习数据库操作的基础。本文将深入讲解如何对DataTable进行赋值,以及相关的编程技巧...

    自定义String类

    在C++编程中,`String`类是一种常用的用于表示和操作字符串的数据结构。虽然C++标准库中已经提供了`std::string`类,但为了学习和理解对象导向编程(OOP)以及C++的特性,有时我们会选择自定义一个`String`类。在这...

Global site tag (gtag.js) - Google Analytics