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
}
}
分享到:
相关推荐
在 Java 中,char 对应的数据类型是 String。 decimal 在 SQL Server 中,decimal 是一个小数类型,用于存储小数值。在 Java 中,decimal 对应的数据类型是 java.math.BigDecimal。 float 在 SQL Server 中,...
Java 中 String 类型转换方法是一种常见的编程操作,涉及到各种数据类型之间的转换,包括整型、浮点型、长整型、浮点型等。本文将详细介绍 Java 中 String 类型转换方法的各种形式。 整型到字符串 在 Java 中,将...
在Java中,直接比较一个String类型的值与一个int类型的值是非法的,因为它们属于不同的数据类型。若要进行比较,必须先进行类型转换。 #### 2.1 使用compareTo方法比较String类型 对于两个String类型的比较,可以...
java中String数据类型 对于字符串对象来说,虽然在参数传递的时候也是引用传递,但是java虚拟机在函数内部对字符串对象进行了特殊处理–视String对象为常量(final) 所以对传进来的引用地址所引用的string对象...
以下是对Java中String与七种主要数据类型转换的详细解释: 1. **String转long**: 使用`Long.parseLong()`方法可以将一个表示数字的String转换为long类型。例如: ```java String c = "123456"; long n = Long....
Mysql、Oracle 中的数据类型与 Java 中的数据类型对应表 MySQL 和 Oracle 是两种常用的关系型数据库管理系统,而 Java 是一种广泛应用于企业级应用开发的编程语言。在数据库应用开发中,理解数据类型的对应关系...
Java 中 String 和 int 类型的相互转换是一个基本的数据类型转换操作。下面我们来详细介绍这两种类型的相互转换。 String 转换为 int 在 Java 中,将 String 类型转换为 int 类型可以使用两种方法: 1. 使用 `...
在本文中,我们将对 Java 数据类型和 MySql 数据类型进行对应一览,帮助开发者更好地理解和使用这两种类型。 字符串类型 在 Java 中,字符串类型对应的是 java.lang.String 类型。在 MySql 中,字符串类型对应的是...
在Java编程语言中,数据类型分为两大类:基本类型(primitive types)和引用类型。基本类型直接存储值,而引用类型则存储指向对象的引用。本文将深入探讨Java中的基本类型以及String类型的特性与用法。 #### Java...
本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他数据类型的转换。 1. **字符串的创建与不可变性** - String对象在Java中是通过引用常量池中的常量来创建的,一旦创建就不能改变。例如...
### 常见Java中数据类型之间的转换 在Java编程语言中,数据类型的转换是非常常见的操作之一。通过数据类型转换,可以确保不同数据类型之间的兼容性,并满足特定场景下的需求。本文将详细介绍Java中常见的数据类型...
Java 中的 String 类是 Java 语言中最基本的数据类型之一,用于表示字符串。下面我们将详细介绍 String 类的运用,包括实例化 String 对象的两种方式、String 对象的比较、String 对象的内容比较等。 实例化 String...
在Java编程语言中,String类型和Timestamp类型是两种不同的数据类型,前者用于存储字符串数据,而后者用于存储时间戳数据。然而,在实际开发中,我们经常需要将String类型转换成Timestamp类型,以便于在数据库中存储...
解析Java中的String对象的数据类型字符串 Java中的String对象是一种特殊的数据类型,它不同于基本数据类型,也不同于其他对象。String对象的默认值是null,但它又是一种特殊的对象,有其它对象没有的一些特性。 ...
java中数据类型转换 收藏 java中数据类型转换 1如何将字串 String 转换成整数 int? A. 有两个方法: 1). int i = Integer.parseInt([String]); 或 i = Integer.parseInt([String],[int radix]); 2). int i =...
本文将详细介绍MySQL中的各种数据类型及其在Java中的对应类型,并解释这些类型的具体含义以及它们在实际应用中的作用。 #### 数据类型对照表解析 ##### 1. VARCHAR (可变长度字符串) **显示长度:** L+N **数据库...
Java中的基本数据类型包括整型(int)、浮点型(float、double)、布尔型(boolean)、字符型(char)和字符串型(String)。每种数据类型都有其特定的存储空间和取值范围。 1. 整型(int):整型变量用于存储整数...
在 Java 编程中,了解 Java 数据类型和 MySql 数据类型的对应关系非常重要。这是因为在 Java 应用程序中,我们经常需要与数据库进行交互,而 MySql 是一种常用的关系数据库管理系统。在本文中,我们将详细介绍 Java ...
本项目名为"java 解析Excel 并判断解析的数据类型__Eclipse工程",显然是一个使用Java语言在Eclipse环境下实现的程序,其主要功能是读取Excel文件并识别其中各单元格的数据类型。 首先,我们需要了解Java中用于解析...
通过了解这些数据类型之间的对应关系,开发者可以更好地将 Java 应用程序中的数据转换为适合存储在数据库中的格式,反之亦然,从而实现高效的数据交换和处理。同时,XML 文件的使用使得这些映射关系可以被结构化地...