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

Java中字符串(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引用是相同的。
  • 第二个断言是由于编译器做了优化,编译器会先把字符串拼接,再在常量池中查找这个字符串是否存在,如果存在,则让变量直接引用该字符串。所以str1和str3引用也是相同的。
  • str4的对象不是显式赋值的,编译器会在堆中重新分配一个区域来存储它的对象数据。所以str1和str4的引用是不一样的。
package test;

public class Test {
	public static void main(String[] args) {
		String a = "abc";
		String b = "abc";
		String c = "ab" + "c";
		String d = new String(b);
		System.out.println(a.hashCode());
		System.out.println(b.hashCode());
		System.out.println(c.hashCode());
		System.out.println(d.hashCode());
	}
}

  为什么打印出来的d和a,b,c的是一样呢?

 

HashCode本身就是根据字符内容计算而得的,当然一样了
比较的是引用啊~~~

分享到:
评论

相关推荐

    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` ...

    Android String字符串数组动态增加

    在Android开发中,String字符串数组是一种常见的数据结构,用于存储一系列相关的文本信息。在某些情况下,我们可能需要在运行时动态地向已存在的字符串数组中添加元素,而非仅仅在XML资源文件中静态定义。这就涉及到...

    Java中的String池

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

Global site tag (gtag.js) - Google Analytics