`
liss
  • 浏览: 842369 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Java中字符串(String)的存储和赋值原理

阅读更多

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

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

 

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

 

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

 

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

 

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

Java代码

 

  1. import static org.junit.Assert.assertNotSame;   
  2. import static org.junit.Assert.assertSame;   
  3.   
  4. import org.junit.Test;   
  5.   
  6. /**
  7. * @author Heis
  8. *
  9. */  
  10. public class StringTest{   
  11.   
  12.     @Test  
  13.     public void testTheSameReference1(){   
  14.          String str1="abc";   
  15.          String str2="abc";   
  16.          String str3="ab"+"c";   
  17.          String str4=new String(str2);   
  18.            
  19.         //str1和str2引用自常量池里的同一个string对象   
  20.          assertSame(str1,str2);   
  21.         //str3通过编译优化,与str1引用自同一个对象   
  22.          assertSame(str1,str3);   
  23.         //str4因为是在堆中重新分配的另一个对象,所以它的引用与str1不同   
  24.          assertNotSame(str1,str4);   
  25.      }   
  26.        
  27. }  

 

  • 第一个断言很好理解,因为在解析的时候,"abc"被存储在常量池中,str1和str2的引用都是指向常量池中的"abc"。所以str1和str2引用是相同的。
  • 第二个断言是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。
  • str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。

 

 

 

String在对在编译时可以确定的常量会做一定的优化,把其放在字符串常量池中。

+ 和 new出来的对象都是存储在堆内

对象引用都是存储在栈内

String a = "a";

 这条语句在执行的时候,会在常量池内创建一个String对象,内容为a,a指向这个对象。

String ab5 = new String("ab");

 这条语句在执行的时候,会先去常量池内查找有没有值为ab的对象,没有的话,就创建,有的话,就在堆上面创建一个新的对象,内容是ab,ab5指向这个在堆上创建的对象。

分享到:
评论

相关推荐

    Java中字符串.pdf

    Java标准库中的`java.lang`包提供了两个主要的字符串类:`String`和`StringBuffer`,它们各自有着不同的用途。 1. **字符串的概念**: - 字符串是内存中存储的一系列连续的字符。在Java中,字符串是对象,且它们...

    有关Java中字符串的几个问题的讨论

    在Java编程语言中,字符串是极其重要且常用的数据类型,它们在各种操作中扮演着核心角色。本讨论将深入探讨Java中字符串相关的几个关键问题,包括字符串的创建、常量池、字符串比较以及不可变性。 1. **字符串创建*...

    java 给指定字符赋值

    综上所述,Java中的字符赋值涉及到变量声明、转义序列、Unicode编码、字符串与字符转换、字符操作以及I/O流等多个方面。在实际编程中,理解和熟练运用这些概念对于编写高效且可读性强的代码至关重要。

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

    创建String字符串 目录 课程导入 掌握String字符串对象的创建 掌握字符串对象的输入与输出 一般程序需要处理大量...字符串变量中存储的是对象的地址。 例 1: String str = "Hello Java"; // 结果:Hello Java Strin

    详解Java String字符串获取每一个字符及常用方法

    在Java中,字符串是一个对象,它是通过new关键字或直接赋值的方式创建的。字符串是不可变的,意思是说,一旦创建了字符串,就不能再改变它的值。例如: ```java String s = "hello"; s = s + " world"; ``` 在上面的...

    Java 字符串

    当创建一个字符串并将其存储在池中时,如果已有相同内容的字符串存在,那么将返回池中已存在的字符串的引用,这就是所谓的字符串 intern() 方法的原理。 三、字符串比较 Java提供多种方法来比较字符串: 1. `...

    深入了解java 中的String

    如果之后再次尝试创建相同的字符串,Java 会检查字符串池中是否已经存在这样的字符串,如果存在则直接返回池中的引用,而不是创建新的对象。 #### intern() 方法 `String` 类提供了一个 `intern()` 方法,该方法的...

    java字符串的处理.pdf

    本篇将基于《java字符串的处理.pdf》的内容,深入探讨Java中字符串的基本概念、处理方式以及相关类库的使用。 #### 字符串的基本概念 字符串在Java中是一种特殊类型的对象,由一系列字符组成,通常用于存储和处理...

    字符串文件

    - **二进制安全性**:Redis中的字符串类型能够存储任何形式的数据,包括但不限于文本、图片或其他二进制文件。 - **最大容量**:一个字符串类型的值在Redis中可以容纳的最大长度为512MB。这一限制对于大多数应用场景...

    java字符串 详解 java实例20

    Java字符串在编程中扮演着至关重要的角色,它们是程序中数据处理的核心部分,尤其是在文本处理、用户输入验证、数据解析等场景下。本实例“Java字符串详解 Java实例20”将深入探讨Java中的字符串处理机制,包括其...

    关于JAVA中的字符串的比较

    在这个例子中,由于`str1`和`str2`都直接赋值为"java",JVM会确保它们指向同一个字符串常量池中的对象,因此使用`==`进行比较返回`true`。 #### 使用`new`关键字创建字符串 当使用`new`关键字创建字符串对象时,...

    java作品,字符串

    在Java编程语言中,字符串(String)是一个至关重要的概念,它被广泛用于数据处理、文本分析以及用户交互。字符串是字符序列的不可变对象,这意味着一旦创建了字符串对象,就不能更改其内容。Java提供了丰富的字符串类...

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

    ` 在这种情况下,JVM 首先会在字符串常量池中查找是否已经存在一个相同的字符串对象,如果不存在,则创建一个新的字符串对象,并将其存储在字符串常量池中,然后将该对象的引用赋值给变量 str。 字符串常量池是 JVM...

    java 语言基础(数组、字符串、类)

    本教程将深入探讨Java中的三个核心概念:数组、字符串和类,这些都是编写任何Java程序的基础。 首先,我们来看看数组。数组是Java中用于存储同类型数据集合的一种数据结构。在Java中,数组可以是基本类型(如int、...

    在一个以知的字符串中截取满足一定条件的字符串

    `.substring()` 是 Java 和其他许多编程语言中提供的内置方法之一,用于从字符串中截取出子字符串。其基本语法为: ```java String subStr = originalStr.substring(startIndex, endIndex); ``` 其中 `startIndex` ...

    Java中的String池

    Java中的String池是一个特殊的数据结构,它存储了所有被程序引用的字符串字面量(literal)。当程序创建一个字符串时,如果该字符串在String池中已经存在,则直接返回String池中已有的实例;若不存在,则将其添加到...

Global site tag (gtag.js) - Google Analytics