一、Java中数据存储区域包括:

1.寄存器:最快的存储区,由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间

二、相关说明:

1.String类是不可变类,一个String对象所包含的字符串内容永远不会被改变。

2."equals()"判断两个字符串对象的内容是否相同

3."=="判断两个String实例的引用是否相同

4. 当调用 intern()时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 简而言之,intern() 返回一个字符串,内容与调用它的字符串的内容相同,但一定取自具有唯一字符串的池。

5.字面量定义的字符串会自动调用intern()
例子:
String b = "abc"等价于
String b = "abc".intern()

三、例子

例子A:
   String str1 = "java";
   String str2 = "java";
   System.out.print(str1==str2);
返回值:true

解说:

执行第一句:JVM首先在常量池中查找"java",之前常量池中没有"java", 所以,jvm找不到"java"。因此,JVM会在常量池创建"java",然后在栈上创建str1,指向它;

执行第二句:因为执行第一句的时候,JVM已经在常量池中创建了"java", 因此JVM直接在栈上创建str2变量,指向"java"。

所以,它们的引用相同,即str1 == str2。

例子B:
   String str1 = new String("java");
   String str2 = new String("java");
   System.out.print(str1==str2);
返回值:false

解说:

执行第一句:JVM在堆上创建一个"java"对象,在栈上创建str1变量,然后指向它;

执行第二句:在堆上再创建一个"java"对象,在栈上创建str2变量,指向它。

这两个"java”对象虽然内容一样,但内存地址不一样,属于不同的对象。因此,str1 != str2。

例子C:
   String str1 = "java";
   String str2 = "blog";
   String s = str1+str2;
   System.out.print(s=="javablog");
返回值:false

解说:

执行第一句:JVM会在常量池创建"java",然后在栈上创建str1,指向它;

执行第二句:JVM会在常量池创建"blog",然后在栈上创建str2,指向它;

执行第三句:JVM会在堆上创建一个对象,用于存储str1+str2的结果,然后在栈上创建s变量指向这个对象。

执行第四句:JVM在常量池中创建"javablog",所以,s 和 "javablog"的内存地址不一样。

因此 s  != "javablog"。

例子D:
    String str1 = "javablog";
    String str2 = "java"+"blog";
    System.out.println(str1 == str2);
    返回值:true

解说:

String str2 = "java"+"blog";    //在编译时被优化成String str2 = "javablog";

因此str1 == str2

例子E:
   String s1 = "java";
   String s2 = new String("java");
   System.out.print(s1.intern()==s2.intern());
返回值:true

解说:

intern() 返回一个字符串,内容与调用它的字符串的内容相同,但一定取自具有唯一字符串的池。

例子F:
   String str1 = "java";
   String str2 = new String("java");
   System.out.print(str1.equals(str2));
返回值:true

解说:

equals比较的是字符串内容

Java中String 的equals 和==详解的更多相关文章

  1. java中String与equals,==详解

    首先,String str1="abc",这个str1所指向的是常量池中的一块内存. 如果又有,String str2="abc",那么str1和str2所指向 ...

  2. Java中String对象创建机制详解()

    一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...

  3. java中hashcode()和equals()的详解

    今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...

  4. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  5. Java中23种经典设计模式详解

    Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...

  6. Java中的Calendar日历用法详解

    第一部分 Calendar介绍 public abstract class Calendar implements Serializable, Cloneable, Comparable<Cal ...

  7. JAVA中堆栈和内存分配详解(摘抄)

    在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存 ...

  8. Java中hashCode与equal方法详解

    转载自http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...

  9. Java中的IO流系统详解(转载)

    摘要: Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java ...

随机推荐

  1. eclipse sdk 无法更新

    最近祖国越来越强了,强得android开发工具都没法更新了,但是祖国再怎么强也阻挡不了我开发的脚步.下面给大家分享个更新android sdk 的方法.方法原理就是利用国内镜像源. 工具/原料 电脑一 ...

  2. Sqli-labs less 20

    Less-20 从源代码中我们可以看到cookie从username中获得值后,当再次刷新时,会从cookie中读取username,然后进行查询. 登录成功后,我们修改cookie,再次刷新时,这时 ...

  3. c# 发送消息到Email

    /// <summary>        /// 发送消息到Email        /// </summary>        /// <param name=&quo ...

  4. POJ 3484

    Showstopper Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 1060   Accepted: 303 Descri ...

  5. iOS视频录制裁剪合成

    网址链接: 视频裁剪合并:http://blog.sina.com.cn/s/blog_64ea868501018jx3.html 视频之定义裁剪高宽度:http://www.cocoachina.c ...

  6. POJ 2041

    #include <iostream> #include <string> #include <algorithm> using namespace std; st ...

  7. sparksql链接mysql

    1.在IDEA上建立一个sparksql_mysql的scala对象. 2.连接mysql的代码如下 import java.sql.{DriverManager, PreparedStatement ...

  8. 怎样在VS2013/MFC中使用TeeChart绘图控件

    TeeChart作为一款强大好用的绘图控件,通过它可以绘制出各式各样的图表,包括2D的,还有3D的,绘制的图表美观实用,这里主要讲述如何在VS2013/MFC中使用TeeChart控件,顺便说一下在V ...

  9. SQL技术内幕-6 rank()over(order by XX COLLATE) 的用法

    DECLARE @Names TABLE ( name VARCHAR(20) ); INSERT INTO @Names VALUES ('DeSzmetch'),('DESZMETCH'),('D ...

  10. HTTP协议header标头详解

    本文根据RFC2616(HTTP/1.1规范),参考 http://www.w3.org/Protocols/rfc2068/rfc2068 http://www.w3.org/Protocols/r ...