创建字符串的方法有两种:

  Stringstr1=”直接赋值法”

         Stringstr2=new String(“通过new关键字的方法来创建”);

  在执行String str1=”java”建字符串的时候,jvm会首先检查字符串常量池中是否存在该字符串对象,如果已经存在,那么就不会在字符串常量池中再创建了,直接返回该字符串在字符串常量池中内存地址,如果该字符串在字符串常量池中不存在,那么就会在字符串常量池中先创建该字符串的对象,然后再返回。所以在执行String str2=”java”的时候,因为字符串常量池中已经存在”java”字符串对象了,就不会在字符串常量池中再创建了,所以在栈内存中str1和str2的内存地址都是指向”java”在字符串常量池的位置。

在执行String str3=new String(“java”)创建字符串的时候,jvm首先会检查字符串常量池中是否存在”java”的字符串,如果已经存在,则不会在字符串常量池中创建了,如果没有存在,那么就会在字符串常量池中创建”java”字符串对象,然后还会到堆内存中再创建一份字符串对象,把字符串常量池中的”java”字符串内容拷贝到堆内存中的字符串对象,然后返回堆内存中字符串对象的内存地址。即栈内存存储的地址是堆内存的内存地址。String str4=new String(“java”)是在堆内存中又创建了一个对象,所以str3==str4返回的是false。用一张图来表示一下。

知道这些以后就知道前三个的输出结果的原因了。那么为什么System.out.println(str3.equals(str4));这个执行结果会返回true呢?通过看源码可以知道,在Object类中equals的方法是比较两个对象的内存地址。

Object类中的equals方法:

在String类中对equals方法进行了重写,源代码是这样的。

在String中的equals方法中会先判断两个对象的内存地址是否相等,如果相等,那么equals就return true,如果不相等,则会进一步判断传过来的对象是不是字符串类型的,如果是则将两个字符串对象char数组,然后一个一个字符的比较,如果都相等,则返回true。

String--在内存中的表现的更多相关文章

  1. 一个 -100.01 的double 在内存中怎么存储的. 一个中文String 在内存中占多少直接 utf-8 / GBK

    一.-100.01 的double 在内存中怎么存储的 double双精度数据类型存储格式IEEE 双精度格式为8字节64位,由三个字段组成:52 位小数 f : 11 位偏置指数 e :以及 1 位 ...

  2. C#中string在内存中是如何表示的

    不知道你是否有过和我一样的疑问,不同编码的字符串是如何存储在运行时的内存中的呢,计算机在操作string类型的对象时,如何知道这个string是什么编码呢?和文本文件那样有类似BOM的东东在strin ...

  3. String在内存中如何存储(Java)

    JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久代”,改用元空间代替(Metaspace)java中对String对象特殊对待,所以在heap区域分成了两块,一块是字符串常量池(S ...

  4. String 在内存中如何存储的

    基本数据类型由于长度固定,且需要空间比较少,所以直接存储在栈中:而对象比较大,所以栈中只存储一个4btye的引用地址(逻辑地址). java中对String对象特殊对待,所以在heap区域分成了两块: ...

  5. 代码演示C#中string和StingBuilder内存中的区别

    关于 string和StringBuilder的区别参考MSDN.本文用程序演示它们在内存中的区别,及其因此其行为不同. //Demo  string memory model namespace C ...

  6. java基础 题和知识点总结, 关于String s是否默认初始化为null......,new一个对象和类静态域,是不是在内存中不是一个地方

    一道笔试题 22. 下面代码的运行结果为:() import java.io.*; import java.util.*; public class foo{ public static void m ...

  7. string字符串常量池在内存中的位置

    这里仅仅是举个简单的样例说明字符串常量池在内存中的位置. 闲言少叙,直接上代码. <span style="font-size: large;">import java ...

  8. String到底在内存中是如何存储的

    String会出现在哪些地方 方法内的局部string 类内的字段String static string 容器中存储的string String数组 那么String的位置会影响其存储方式吗? 显然 ...

  9. 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符“A”的个数,并将结果显示在屏幕上。

    问题 设在起始地址为STRING的存储空间存放了一个字符串(该串已存放在内存中,无需输入,且串长不超过99),统计字符串中字符"A"的个数,并将结果显示在屏幕上. 代码 data ...

随机推荐

  1. [转]gnome环境中将家目录下预设的文件夹由中文名称改为英文名称

    参考文章:gnome环境中将家目录下预设的文件夹由中文名称改为英文名称 打开终端 1 修改语言环境为英文 export LANG=en_US 如果想修改语言环境为日语,可执行 export LANG= ...

  2. 基础回顾: 关于Session的一些细节

    1 session是服务端技术, cookie是客户端技术 2 默认情况下, 一个浏览器独占一个session对象, 也就是说, 开启两个浏览器进程, 它们之间使用的session不是同一个sessi ...

  3. 0907NOIP模拟测试赛后总结

    120分rank26.我又被打回原型了…… 下午考的.中午由于种种原因并没有睡好.于是状态很差. 第一眼看题感觉T1是一道XX题.部分分竟然给这么肥 然后看T2.T3好像都还不是特别恶心的题目,挺常规 ...

  4. Django之ORM查询优化

    目录 only 和 defer select_related 和 prefetch_related ORM字段参数 choices res = models.Book.objects.all() # ...

  5. 关于N个小球放M个盒子解答

    以下是关于关于N个小球放M个盒子的几种情况的解答,蛮详细的(来自博友的)  求精:关于N个小球放M个盒子解答 - chensmiles的日志 - 网易博客http://chensmiles.blog. ...

  6. atoi和itoa函数的实现方法

    atoi的实现: #include<iostream> using namespace std; int atio1(char *s) { int sign=1,num=0; if(*s= ...

  7. Python学习day39-并发编程(各种锁)

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

  8. <随便写>WIN10家庭版调出策略组

    1.管理员运行cmd文件 2.运行窗口输入gpedit.msc 运行结果:

  9. CheckBox自定义样式

    效果: xmal代码: <Style x:Key="CheckBoxStyle" TargetType="{x:Type CheckBox}"> & ...

  10. ES6之主要知识点(三)字符串

    引自:http://es6.ruanyifeng.com/#docs/string#codePointAt codePointAt() String.fromCodePoint() at() incl ...