String 这玩意,对于Javer 来说,在面试或笔试是总让你魂牵梦绕哦。什么是否相等哦,什么这个字符串的结果是多少哦,有时候很厌恶这类型的题哈,如果你现在感到厌恶,就说明你还是没有弄明白这玩意的特性以及功能了,好吧。我就来说说这玩意的特点(以面试的方式)。
先看个例子
String str1="abc";
String str2="abc";
String str3=new String("abc");
String str4=new String("abc");
1) str1==str2 true;
2) str1==str3 false
3) str3==str4 false;
说到1)比较就要牵扯到,常量池的知识咯。
我们都知道,Java程序要运行,首先需要编译器将源代码文件编译成字节码文件(也就是.class文件)。然后在由JVM解释执行,在class文件中有一个非常重要的项-就是常量池,它可以存放静态数据,常量,还有就是直接通过赋值创建的字符串,,在Java源代码中的每一个字面值字符串,都会在编译成class文件阶段,形成标志号 为8(CONSTANT_String_info)的常量表 。 当JVM加载 class文件的时候,会为对应的常量池建立一个内存数据结构,并存放在方法区中。同时JVM会自动为CONSTANT_String_info常量表中 的字符串常量字面值 在堆中 创建 新的String对象(intern字符串 对象 ,又叫拘留字符串对象)。然后把CONSTANT_String_info常量表的入口地址转变成这个堆中String对象的直接地址(常量池解 析)。 这里很关键的就是这个拘留字符串对象 。源代码中所有相同字面值的字符串常量只可能建立唯一一个拘留字符串对象。 实际上JVM是通过一个记录了拘留字符串引用的内部数据结构来维持这一特性的。在Java程序中,可以调用String的intern()方法来使得一个常规字符串对象成为拘留字符串对象。我们会在后面介绍这个方法的。
所以str1和str2在常量池中都是指向了同一个地址,所以比较的结果是相等的咯
str3和str4是创建了两个String 对象,所以str3和str4的地址是不一样的,所以他俩就不相等咯。
再看例子
String str="a";
String str1="bc"
String str2=st+st1;
String str3="abc";
str2==str3 false;
这俩为啥不等咯,主要是这“+”的运算功效,当执行st+st1时,JVM首先会在堆中创建一个StringBuilder类,同时用st指向的拘留字符串对象完成初始化,然后调用append方法完成对st1所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量st2中。而局部变量str3存储的是常量池中"abc"所对应的拘留字符串对象的地址。 st2与st3地址当然不一样了。这里要注意了,堆中实际上有五个字符串对象:三个拘留字符串对象、一个String对象和一个StringBuilder对象。
String sc="ab"+"cd";
String sd="abcd";
System.out.println(sc==sd); //true
"ab"+"cd"会直接在编译期就合并成常量"abcd", 因此相同字面值常量"abcd"所对应的是同一个拘留字符串对象,所以地址是相同的咯。
分享到:
相关推荐
总的来说,理解和熟练掌握Java中的字符串操作是成为Java程序员的基础,包括创建、比较、拼接以及字符串的内存管理,这些都是编写高效且无错误的Java代码的关键。在实际开发中,根据具体需求选择合适的字符串处理方法...
在Java中生成随机字符串是一项基础而重要的任务,不同的应用场景可能需要选择不同的方法。通常情况下,对于普通应用,使用`java.util.Random`就足够了;而对于安全性要求较高的场景,则推荐使用`java.security....
本篇文章将深入探讨如何从字符串中提取括号内的内容,主要关注于基础的字符串操作、正则表达式以及如何利用这些工具来实现目标。 首先,我们要明白Java中的字符串是`String`类的对象,它提供了丰富的API用于字符串...
在Java编程语言中,字符串处理是一项基础且重要的任务。标题提到的"Java检索字符串中是否存在某字符",实际上涉及到字符串的查找算法。这里主要讨论的是KMP(Knuth-Morris-Pratt)算法,这是一种高效的字符串匹配...
Java中的字符串处理是编程的基础之一,理解`String`和`StringBuffer`的区别以及如何使用这些类对于开发高质量的Java应用程序至关重要。掌握字符串的构造方法和操作技巧可以帮助开发者编写出更加高效、易于维护的代码...
### Java数组和字符串详解 #### 实验目标与背景 本次实验旨在深化理解Java中的数组与字符串操作,聚焦于`String`类与`StringBuffer`类的掌握,包括它们的常用方法、相等性判断的不同方式、数组的创建及引用机制,...
总之,Java中的字符串分解是一个基础且重要的概念,广泛应用于数据处理、日志分析、文本解析等场景。熟练掌握`split()`方法及其背后的正则表达式原理,对于提升Java编程能力非常有帮助。通过`StringDemo_13.java`...
1. **字符串基础** - Java中的字符串是不可变的,这意味着一旦创建了字符串对象,就不能更改其内容。这由`final`关键字确保,提高了线程安全性。 - 创建字符串的方式有两种:通过字面量(如`String str = "Hello"`...
在Java编程语言中,字符串(String)是一个非常基础且重要的数据类型。它被广泛用于处理文本信息,例如用户输入、文件内容、网络数据等。本文将深入探讨Java中的字符串操作,包括创建、比较、拼接、查找与替换、分割...
本教程将深入探讨Java中的三个核心概念:数组、字符串和类,这些都是编写任何Java程序的基础。 首先,我们来看看数组。数组是Java中用于存储同类型数据集合的一种数据结构。在Java中,数组可以是基本类型(如int、...
它们允许在原有对象的基础上进行字符串操作,而不需要每次都创建新对象。 - **效率**:在多线程环境中,推荐使用`StringBuffer`,因为它对同步进行了优化。而在单线程环境中,`StringBuilder`由于没有同步开销,...
在Java编程语言中,字符...理解字符串的长度判断和截取是Java编程的基础,它们在实际编程中有着广泛的应用,例如在输入验证、数据处理、格式化输出等场景。熟练掌握这些基本操作,将有助于编写出更加高效和可靠的代码。
Java中的数组和字符串是编程中基础且重要的概念,它们在许多场景中都有广泛的应用。数组是一种数据结构,它能够存储相同类型的数据集合,而字符串则是字符的序列,常常用于处理文本信息。 数组在Java中是一种引用...
### Java数组与字符串用法小结 在Java编程语言中,数组和字符串是两种非常重要的数据类型,它们在处理大量数据或文本时扮演着至关重要的角色。本文将围绕标题“java数组与字符串用法小结”及描述中的知识点进行详细...
在Java编程语言中,分割字符串是一项常见的操作,它允许我们将一个长字符串分解成多个子字符串,每个子字符串对应原字符串中的某个部分。这通常通过使用`String`类提供的`split()`方法来完成。本篇文章将深入探讨...
在Java编程语言中,字符串处理是一项基础且重要的任务。在这个特定的场景中,我们需要创建一个Applet程序,它能够接收用户输入的字符串和一个字符,然后从原始字符串中删除所有出现的指定字符,并显示处理后的结果。...
以上内容是基于"JAVA 字符串应用笔记"可能涵盖的基本知识点,对于初学者来说,理解和掌握这些概念是进阶学习Java和Android开发的基础。在实际开发中,还会涉及到更多高级特性和实践技巧,如字符串格式化、正则表达式...
本篇将详细解释如何实现这一功能,并拓展到相关的Java基础知识。 首先,我们要了解Java中的字符串是不可变的,这意味着一旦创建了一个字符串对象,就不能更改其内容。因此,当我们需要删除字符串中的特定字符时,...
### Java查找字符串知识点详解 #### 一、简介 在Java编程中,经常需要对字符串进行查找操作,尤其是在处理文本分析、数据验证等场景时尤为重要。Java标准库提供了强大的`Pattern`和`Matcher`类来支持正则表达式的...
在 Java 中,字符串是最基本的数据类型之一,理解字符串的应用是 Java 开发的基础。本篇笔记将详细介绍 Java 中 equals 和 == 的区别、字符串相关的几个函数介绍、String 和 StringBuffer 的使用等。 一、equals 和...