`

Java中的String数据类型

    博客分类:
  • J2SE
阅读更多

String是一个具有值类型和引用类型特点的特殊类型

常量池(constant pool)指的是在编译期被确定,并被保存在已编译的.class文件中的一些数据。它包括了关于类、方法、接口等中的常量,也包括字符串常量。

String s0 = "hello";
String s1 = "hello";
String s2 = "he" + "llo";
System.out.println(s0 == s1);// true
System.out.println(s0 == s2);// true
System.out.println(s0 == "hel" + "lo");  // true

  

首先,我们要知道Java会确保一个字符串常量只有一个拷贝。

因为例子中的s0和s1中的”hello”都是字符串常量,它们在编译期就被确定了,所以s0==s1为true;而”he”和”llo”也都是字符串常量,当一个字符串由多个字符串常量连接而成时,它自己肯定也是字符串常量,所以s2也同样在编译期就被解析为一个字符串常量,所以s2也是常量池中”hello”的一个引用。所以我们得出s0==s1==s2;

 

用new String() 创建的字符串不是常量,不能在编译期就确定,所以new String() 创建的字符串不放入常量池中,它们有自己的地址空间。
看例2:
 

String s4 = "abc";   
String s5 = new String("abc");   
String s6 = "ab"+ new String("c");   
System.out.println(s3 == s4);//false   
System.out.println(s3 == s5);//false   
System.out.println(s4 == s6);//false   
 System.out.println(s4 == s5);//false

 
例2中在第一行,会产生两个对象,先在常量区找看有没有字符串常量“abc”,如果没有,则在常量区开辟一块内存,存放字符串常量“abc”,再在堆(heap)区存创建新的“abc”对象(字符串常量“abc”的copy),s3(在栈()区)新对象“hello”的引用.
第二行,先会在常量池(pool)中查找有没有常量“hello”,如果有,则指向字符串常量“abc”,如果没有,则在常量池中创建字符串常量“abc”,s4是字符串常量“abc”的引用,所以第二句没有创建对象.
第三行代码,会产生一个对象,和第一句一样,字符串常量“abc”的copy,s5(在栈()区)新对象“hello”的引用.


s3因为无法在编译期确定,所以是运行时创建的新对象”abc”的引用,s6因为有后半部分new String(“c”)所以也无法在编译期确定,所以也是一个新创建对象”abc”的应用;明白了这些也就知道为何得出此结果了。

4. String.intern():

再补充介绍一点:存在于.class文件中的常量池,在运行期被JVM装载,并且可以扩充。 String的intern()方法就是扩充常量池的一个方法;当一个String实例str调用intern()方法时,Java查找常量池中是否有相同Unicode的字符串常量,如果有,则返回其的引用,如果没有,则在常量池中增加一个Unicode等于str的字符串并返回它的引用;看例3就清楚了

例3:

String s3 = new String("abc");  
String s4 = "abc";
String s5 = new String("abc");
//String的intern()返回的是常量池中"abc”的引用 
System.out.println(s3 == s3.intern());//false
System.out.println(s4 == s5.intern());//true
System.out.println(s3.intern() == s5.intern());//true
System.out.println(s4.intern()==s4);//true   


全部代码: 

	
public class StringTest {
	public static void main(String[] args) {

	String s0 = "hello";
	String s1 = "hello";
	String s2 = "he" + "llo";
	System.out.println(s0 == s1);// true
	System.out.println(s0 == s2);// true
	System.out.println(s0 == "hel" + "lo");// true
/**
 * 分配一个新的 String,它表示当前字符数组参数中包含的字符序列。
 * 该字符数组的内容已被复制;后续对字符数组的修改不会影响新创建的字符串。 参数:value - 此字符串的初始值。
 */
	String s3 = new String("abc");
	String s4 = "abc";
	String s5 = new String("abc");
	String s6 = "ab" + new String("b");
	System.out.println(s3 == s4);// false
	System.out.println(s3 == s5);// false
	System.out.println(s4 == s6);// false
	System.out.println(s4 == s5);// false
/**
 * new String().intern() 返回字符串对象的规范化表示形式。 一个初始时为空的字符串池,它由类 String 私有地维护。
 * 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串 (该对象由 equals(Object)
 * 方法确定),则返回池中的字符串。否则, 将此 String 对象添加到池中,并且返回此 String 对象的引用。 它遵循对于任何
 * 两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时, s.intern() == t.intern() 才为
 * true。 返回:一个字符串,内容与此字符串相同,但它保证来自字符串池中。
 */
	System.out.println("******************************");
	// String的intern()返回的是常量池中'abc'的引用
	System.out.println(s3 == s3.intern());// false
	System.out.println(s4 == s5.intern());// true
	System.out.println(s3.intern() == s5.intern());// true
	System.out.println(s4.intern() == s4);// true

	System.out.println("******************");
	String hello = "hello";
	String hel = "hel";
	String lo = "lo";
	System.out.println(hello == "hel" + "lo");// true
	System.out.println(hello == "hel" + lo);// false
	}
}		

 

 

 

分享到:
评论
1 楼 JLK 2009-01-03  
挺全的,面试时常遇到这种问题

相关推荐

    sqlserver数据库类型对应Java中的数据类型

    在 Java 中,char 对应的数据类型是 String。 decimal 在 SQL Server 中,decimal 是一个小数类型,用于存储小数值。在 Java 中,decimal 对应的数据类型是 java.math.BigDecimal。 float 在 SQL Server 中,...

    java中String类型转换方法.pdf

    Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 整型到字符串 在 Java 中,将...

    java中String类型和int类型比较及相互转换

    在Java中,直接比较一个String类型的值与一个int类型的值是非法的,因为它们属于不同的数据类型。若要进行比较,必须先进行类型转换。 #### 2.1 使用compareTo方法比较String类型 对于两个String类型的比较,可以...

    Java当中的String数据类型

    java中String数据类型  对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理–视String对象为常量(final) 所以对传进来的引用地址所引用的string对象...

    JAVA中string数据类型转换详解

    以下是对Java中String与七种主要数据类型转换的详细解释: 1. **String转long**: 使用`Long.parseLong()`方法可以将一个表示数字的String转换为long类型。例如: ```java String c = "123456"; long n = Long....

    Mysql、orcale 中的数据类型与java中的数据类型对应表.pdf

    Mysql、Oracle 中的数据类型与 Java 中的数据类型对应表 MySQL 和 Oracle 是两种常用的关系型数据库管理系统,而 Java 是一种广泛应用于企业级应用开发的编程语言。在数据库应用开发中,理解数据类型的对应关系...

    java中string和int型的相互转换.doc

    Java 中 String 和 int 类型的相互转换是一个基本的数据类型转换操作。下面我们来详细介绍这两种类型的相互转换。 String 转换为 int 在 Java 中,将 String 类型转换为 int 类型可以使用两种方法: 1. 使用 `...

    Java数据类型和MySql数据类型对应一览

    在本文中,我们将对 Java 数据类型和 MySql 数据类型进行对应一览,帮助开发者更好地理解和使用这两种类型。 字符串类型 在 Java 中,字符串类型对应的是 java.lang.String 类型。在 MySql 中,字符串类型对应的是...

    java中基本类型及string类型

    在Java编程语言中,数据类型分为两大类:基本类型(primitive types)和引用类型。基本类型直接存储值,而引用类型则存储指向对象的引用。本文将深入探讨Java中的基本类型以及String类型的特性与用法。 #### Java...

    Java 之 String 类型

    本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...

    常见java中数据类型之间的转换.txt

    ### 常见Java中数据类型之间的转换 在Java编程语言中,数据类型的转换是非常常见的操作之一。通过数据类型转换,可以确保不同数据类型之间的兼容性,并满足特定场景下的需求。本文将详细介绍Java中常见的数据类型...

    JAVA 中string类的运用

    Java 中的 String 类是 Java 语言中最基本的数据类型之一,用于表示字符串。下面我们将详细介绍 String 类的运用,包括实例化 String 对象的两种方式、String 对象的比较、String 对象的内容比较等。 实例化 String...

    java中将string类型转换成timestamp类型

    在Java编程语言中,String类型和Timestamp类型是两种不同的数据类型,前者用于存储字符串数据,而后者用于存储时间戳数据。然而,在实际开发中,我们经常需要将String类型转换成Timestamp类型,以便于在数据库中存储...

    解析Java中的String对象的数据类型 字符串

    解析Java中的String对象的数据类型字符串 Java中的String对象是一种特殊的数据类型,它不同于基本数据类型,也不同于其他对象。String对象的默认值是null,但它又是一种特殊的对象,有其它对象没有的一些特性。 ...

    java中数据类型转换

    java中数据类型转换 收藏 java中数据类型转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i =...

    MySql于Java数据类型对应列表

    本文将详细介绍MySQL中的各种数据类型及其在Java中的对应类型,并解释这些类型的具体含义以及它们在实际应用中的作用。 #### 数据类型对照表解析 ##### 1. VARCHAR (可变长度字符串) **显示长度:** L+N **数据库...

    Java实验-基本数据类型及操作

    Java中的基本数据类型包括整型(int)、浮点型(float、double)、布尔型(boolean)、字符型(char)和字符串型(String)。每种数据类型都有其特定的存储空间和取值范围。 1. 整型(int):整型变量用于存储整数...

    Java数据类型和MySql数据类型对应表

    在 Java 编程中,了解 Java 数据类型和 MySql 数据类型的对应关系非常重要。这是因为在 Java 应用程序中,我们经常需要与数据库进行交互,而 MySql 是一种常用的关系数据库管理系统。在本文中,我们将详细介绍 Java ...

    java 解析Excel 并判断解析的数据类型__Eclipse工程

    本项目名为"java 解析Excel 并判断解析的数据类型__Eclipse工程",显然是一个使用Java语言在Eclipse环境下实现的程序,其主要功能是读取Excel文件并识别其中各单元格的数据类型。 首先,我们需要了解Java中用于解析...

    Oracle9i数据类型Java数据类型Schema类型对比.doc

    通过了解这些数据类型之间的对应关系,开发者可以更好地将 Java 应用程序中的数据转换为适合存储在数据库中的格式,反之亦然,从而实现高效的数据交换和处理。同时,XML 文件的使用使得这些映射关系可以被结构化地...

Global site tag (gtag.js) - Google Analytics