1,对String直接量,Java会使用一个字符串池来保存,因此new String(“java”)实际上创建了两个对象:在堆内存中的String类型的对象和在栈内存中的字符串直接量对象。并且,如果字符串使用连接字符串的方式创建,如果字符串在编译时(即不包含任何变量)即可确定,则将其指向字符串池中的对应对象。
2,通过字符串常量拼接的方式实现的字符串实际上只保存最后计算结果到字符串池,而不会创建中间结果的字符串池对象。即:String s=”ja”+”va”;实际上只创建了一个字符串直接量,而不是3个。
3,对于String对象的比较,有这样的含义: ==比较的实际上是内存地址,而equals比较的才是内存地址中对应的值。并且equals底层实际上是通过字符序列的compareTo实现的。
代码如下所示:
public static void main(String[] args) {
// TODO Auto-generated method stub
String s1 = new String("java");// 该语句实际创建了两个对象,
//一个是堆内存中包含值“java”的String对象,一个是栈内存中的值为“java”的String对象
//并且s1实际指向的是堆内存中的String对象
String s2 = "java";//只创建了一个String直接量,直接指向字符串池中已存在的String对象。
String s3 = "java";
System.out.println("通过==比较new对象与字符串直接量的值" + (s1 == s2));//==比较的实际是内存地址
System.out.println("通过equals比较new对象与字符串直接量的值" + s1.equals(s2));//equals比较的才是值
System.out.println("通过==比较字符串直接量的值" + (s2 == s3));
System.out.println("通过equals比较new对象与字符串直接量的值" + s2.equals(s3));
String s4="ja"+"va";//连接字符串中不包含变量,可以在编译时就确定,因此指向字符串池中的对象
System.out.println("字符串连接(不包含变量)::通过==比较字符串直接量的值" + (s4 == s3));
System.out.println("字符串连接(不包含变量)::通过equals比较new对象与字符串直接量的值" + s4.equals(s3));
String temp="ja";
String s5=temp+"va";//虽然它的值域s4相同,但指向的是堆内存中的String对象
System.out.println("字符串连接(包含变量)::通过==比较字符串直接量的值" + (s5 == s3));
System.out.println("字符串连接(包含变量)::通过equals比较new对象与字符串直接量的值" + s5.equals(s3));
final String temp1="ja";
String s6=temp1+"va";//final类型的是常量,编译时可以确定,因此指向的是栈内存中的String对象
System.out.println("字符串连接(包含final常量)::通过==比较字符串直接量的值" + (s6 == s3));
System.out.println("字符串连接(包含final常量)::通过equals比较new对象与字符串直接量的值" + s6.equals(s3));
System.out.println();
System.out.println("通过identityHashCode确定字符串直接量的存在");
System.out.println("s1的Hashcode"+System.identityHashCode(s1));
System.out.println("s2的Hashcode"+System.identityHashCode(s2));
System.out.println("s3的Hashcode"+System.identityHashCode(s3));
System.out.println("s4的Hashcode"+System.identityHashCode(s4));
System.out.println("s5的Hashcode"+System.identityHashCode(s5));
System.out.println("s6的Hashcode"+System.identityHashCode(s6));
}
分享到:
相关推荐
在Java编程语言中,String类型扮演着至关重要的角色。它被广泛用于表示和操作文本,因为它是不可变的,这确保了字符串的安全性和效率。本文将深入探讨Java中的String类,包括其特性、构造方法、常用方法以及与其他...
Java中的String类是一个重要的数据类型,用于存储和操作字符串数据。...通过以上知识,我们可以了解到在Java中使用String类时的性能考量和内存管理细节。掌握这些知识点对于编写高效、健壮的Java程序是十分必要的。
在进行Java编程时,许多开发者往往会忽略一些琐碎但至关重要的细节,这些细节可能在项目的开发和维护中造成不可预见的问题。为了解决这些问题,可以参考《Java Pazzlers》(Java解惑)这本书,其中对许多常见的编程...
在Java编程语言中,字符串操作是常见的任务,而`String`类提供了多种方式来组合或连接字符串。本文将深入探讨`String+String`和`String+char`这两种不同操作之间的区别。 首先,我们要理解Java编译器的优化机制。在...
标题为"Java中String类(字符串操作)的10个常见问题和解决方法"的文档主要探讨了Java语言中字符串处理的核心类String的使用细节和最佳实践。以下是根据文档内容总结的知识点: 1. 字符串比较 在Java中,比较字符串...
在Java编程语言中,String类是不可变的对象,这意味着一旦创建了一个String对象,它的值就不能被改变。这个特性是由String类的内部结构所决定的,如描述中所示,String对象包含一个私有的char数组`value`来存储字符...
根据提供的文件信息,本文将对ACM竞赛中Java编程中涉及的一些关键知识点进行详细解析,主要包括:输入输出处理、格式化输出、字符串操作以及大数处理等几个方面。 ### 一、输入输出处理 在ACM竞赛中,高效地读取...
在Java中,我们可以使用`Integer`类的`toHexString`方法,将一个整数的二进制表示转换为十六进制字符串。例如: ```java int binaryNumber = 0b101010; // 二进制数 String hexString = Integer.toHexString(binary...
1. **String类**:Java中的`String`类用于表示不可变的字符序列。一旦创建了一个`String`对象,其值就不能被更改。 2. **StringBuffer/StringBuilder类**:`StringBuffer`和`StringBuilder`类都用于表示可修改的字符...
Java语言中的String是一个非常重要的类,它在编程中扮演着不可或缺的角色。让我们深入探讨一下这些经典面试题中涉及的知识点: 1. **String不是基本数据类型**:在Java中,有八种基本数据类型(如int、char等),而...
本文通过幽默风趣的语言介绍了Java中一些常见的语法细节,包括十六进制的应用、关键字和保留字的注意事项、类型转换的技巧以及异常处理的最佳实践。希望这些知识点能够帮助读者更加深入地理解Java,并在日常开发中...
通过以上的介绍和示例,我们可以了解到`String`类在Java中的强大功能以及使用时需要注意的一些细节。正确地理解和使用`String`类及其方法能够帮助我们在实际编程中更加高效地处理字符串相关的任务。
以下是一些关键的性能优化细节: 1. **使用单例模式**:单例模式可以确保一个类只有一个实例,从而节省资源和提高效率。不过,过度使用单例可能导致设计复杂性和测试困难,因此需谨慎使用。例如,`java.lang....
Java中的字符串(String)是编程中不可或缺的部分,深入理解其内在机制对于提高代码性能至关重要。本文将探讨Java中字符串的内存管理,尤其是与Java虚拟机(JVM)内存模型的关联。 首先,Java内存模型分为堆内存...
String 中的 equals 和 == 还有更多的细节。下面是一个简单的示例程序: public class TestString { public static void main(String[] args) { String s1 = "Monday"; String s2 = "Monday"; if (s1 == s2) ...
整理了网上的一些java面试题目,很全很强大 面向对象的特征有哪些方面 1. 抽象:抽象就是忽略一个主题中与当前目标2. 无关的那些方面,3. 以便更充分地注意与当前目标4. 有关的方面。抽象并不5. 打算了解全部问题...
Java中的`String`类是编程中非常基础且重要的部分,它代表不可变的字符序列。在Java中,字符串被广泛用于各种操作,如拼接、比较、搜索、格式化等。`String`类位于`java.lang`包中,是所有Java程序的默认组成部分,...
在Java编程语言中,中文字符转换为拼音是一个常见的需求,特别是在处理中文文本的搜索、语音合成或者数据分析等场景。...通过这个程序,你可以更深入地理解Java中如何处理中文字符以及拼音转换的实现细节。
标题中的“jdbc连接例子 Oracle CLOB转换为String java调用存储过程之输出游标”涉及到三个主要的Java数据库编程知识点:JDBC连接、Oracle数据库中的CLOB类型处理以及通过Java调用存储过程处理输出游标。 1. JDBC...