我们来看一段再经典不过的程序:
class StringTest
{
public static void main(String[] args)
{
String s=new String("abc");
String s1="abc";
String s2=new String("abc");
System.out.println(s==s1);
System.out.println(s1==s2);
System.out.println(s==s2);
}
}
大伙儿都知道内存中有两块儿存储区域,分别是栈和堆,加上JAVA字符串是由字符串池管理的,所以,我们的内存可以这样划分:
程序开始前所有区域都是空的,现在我们执行第一条语句
String s=new String("abc");
JAVA执行流程是这样的。首先判断字符串池里有没有值为"abc"的对象,由于这行语句实在程序第一句,字符串池是空的,所以,它会现在字符串池里构造一个值为"abc"的对象,然后执行new语句后,再把“abc”拷贝到堆里面,关于一个new String构造方法解释.
然后s再指向这个对象,如图:
所以说,执行完这一行代码后生成了两个对象,一个是在字符串池里,一个是在堆里
然后看第二句:
执行到这一句时又产生了几个对象?答案是一个也没产生!执行是这样的,当程序看到"abc"后,会先到字符串池里找看有没有"abc",由于执行完第一行语句后字符串池里已经有"abc"了就不再创建,注意这里并没有new的操作,而是直接常量赋值,所以s1会直接指向这个"abc"而不会在堆里产生新的对象,如图
程序接着往下走
- String s2=new String("abc");
这次又产生了几个对象,一个!
程序还是会现在字符串池里找"abc",发现有,就不再字符串池里产生新的对象了,接着执行new操作,记着,在JAVA中,只要出现new操作,一定会有新的对象产生,不管这个对象是否存在多少次,所以它又会在堆里生成一个内容为"abc"的对象,如图
好了,只剩下比较了,注意这里是用的是==,在JAVA中,==永远是比较两个引用是否指向同一个对象的,看到上图,答案不用再揭晓了吧
分享到:
相关推荐
在C++标准库(STL, Standard Template Library)中,`std::string`是处理文本数据的基本工具,它提供了一种方便且高效的字符串操作方式。然而,标准库中的`std::string`虽然强大,但并不涵盖所有可能的需求。在这种...
在深入探讨解决方案之前,首先需要了解为什么会发生这种异常。`StringIndexOutOfBoundsException`异常是由以下几种情况触发的: 1. **索引越界**:当你尝试访问一个字符串中的某个索引时,该索引超出了字符串的实际...
了解String类的特性、创建方式以及常用的API方法对于编写高效的Java代码至关重要。 1. String的特性: - 不可变性:这意味着一旦创建了一个String对象,就不能修改它的内容。对String的任何操作(如添加、删除或...
Mybatis的主要优点在于它的映射文件,它将SQL与Java代码分离,提供了清晰的数据库操作接口。 整合Spring Boot与Mybatis的过程主要包括以下几个步骤: 1. **添加依赖**:在`pom.xml`文件中,我们需要引入Spring ...
在C++编程语言中,`std::string`是一个非常重要的类...了解并熟练使用这些函数和运算符,能够帮助开发者写出更加清晰和高效的代码。在实际编程中,正确地使用这些方法可以避免内存管理问题,提高程序的可读性和维护性。
3. **Hibernate**:Hibernate是一个强大的对象关系映射(ORM)工具,它简化了数据库操作,使得开发者可以使用Java对象来处理数据库事务,而无需编写大量的SQL语句。Hibernate通过XML配置文件或注解方式定义对象与...
虽然在GEE中不常显式进行cast操作,但编写清晰、规范的代码是非常重要的,尤其是在变量赋值时应明确数据格式,以减少潜在的错误。 为了保证代码的规范性和可读性,推荐在编写脚本时使用GEE提供的函数来明确数据类型...
通过对Redis中SDS数据结构的深入分析,我们可以清晰地了解到它相对于传统C字符串的优势所在。无论是快速获取长度、确保二进制安全性,还是预防缓冲区溢出、减少内存重分配,SDS都为Redis带来了显著的性能提升。在...
在面试中,了解并能够解释Java中的String为什么是不可变的,是展示对Java内存模型和多线程概念理解的很好方式。阅读《Effective Java》等书籍可以帮助深入理解这一设计决策背后的思考。同时,熟悉字符串操作的最佳...
在使用这个"string_score"项目前,开发者需要了解Node.js的基本操作,理解如何安装npm包,并熟悉JavaScript编程。在具体应用时,可以通过阅读项目文档,理解评分算法的工作原理,然后根据需求调用相应的API,结合...
2. **读取操作**:Bulldog提供了直观的方法来读取不同类型的值,如`getString(String key, String defaultValue)`、`getInt(String key, int defaultValue)`等。 3. **写入操作**:同样,写入操作也变得非常简单,...
7. **用户界面设计**:在LabVIEW的前面板上,可能会有清晰的标签和指示器,以便用户理解程序的功能和操作方式。这包括输入字段、按钮、指示灯和标签等。 8. **事件结构**:如果程序响应用户的某些交互,如点击按钮...
首先,我们要了解`std::string`对象的一些关键方法。`find_first_not_of`和`find_last_not_of`是两个非常有用的方法,它们分别用于查找字符串中第一个不匹配指定字符集的字符位置和最后一个不匹配指定字符集的字符...
类库应提供`CreateSection(string section)`, `DeleteSection(string section)`以及`RenameSection(string oldName, string newName)`方法,以支持对节的操作。 5. **遍历ini文件**:为了方便地遍历ini文件的所有节...
这样可以使得代码结构清晰,便于其他开发者理解和使用。 总结,C#操作INI配置文件涉及的主要知识点包括: 1. 使用System.IO类库中的StreamReader和StreamWriter进行文本文件读写。 2. 了解INI文件的基本结构和语法...
- **字符串池**:Java中的`String`类广泛用于存储和操作文本。为了提高性能,Java引入了字符串池(String Pool),它是一个内存区域,存放所有字面量字符串(直接量,如`"hello"`)和通过`new String()`构造的共享...
public static extern int MessageBox(int hWnd, string text, string caption, int buttons); ``` - `hWnd`: 父窗口的句柄。 - `text`: 消息文本。 - `caption`: 对话框标题。 - `buttons`: 按钮组合。 ##### ...
标题 "The-string-of-characters-to-replace.zip_字符 替换" 暗示这是一个关于在字符串中进行字符替换操作的程序,可能是用于文本处理或数据转换任务。这个程序采用了混合编程的方式,结合了汇编语言和C语言,表明它...
在Laravel框架中,Blade模板引擎是其核心特性之一,它为开发者提供了一种简洁、清晰的语法来创建视图。"Laravel开发-laravel-string-blade-compiler"的主题着重于从字符串动态呈现Blade模板,这在某些场景下非常实用...
这样的设计模式使得文件操作的代码逻辑清晰,易于理解和测试。 总之,“C++文件操作工具类”是一个为了提高开发效率和代码质量而创建的实用工具,它将底层的文件操作接口进行了封装,使得在C++项目中处理文件变得...