Java中String 的equals 和==详解
一、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 和==详解的更多相关文章
- java中String与equals,==详解
首先,String str1="abc",这个str1所指向的是常量池中的一块内存. 如果又有,String str2="abc",那么str1和str2所指向 ...
- Java中String对象创建机制详解()
一String 使用 private final char value来实现字符串存储 二Java中String的创建方法四种 三在深入了解String创建机制之前要先了解一个重要概念常量池Const ...
- java中hashcode()和equals()的详解
今天下午研究了半天hashcode()和equals()方法,终于有了一点点的明白,写下来与大家分享(zhaoxudong 2008.10.23晚21.36). 1. 首先equals()和hashc ...
- Java 中的异常和处理详解
Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...
- Java中23种经典设计模式详解
Java中23种设计模式目录1. 设计模式 31.1 创建型模式 41.1.1 工厂方法 41.1.2 抽象工厂 61.1.3 建造者模式 101.1.4 单态模式 131.1.5 原型模式 151. ...
- Java中的Calendar日历用法详解
第一部分 Calendar介绍 public abstract class Calendar implements Serializable, Cloneable, Comparable<Cal ...
- JAVA中堆栈和内存分配详解(摘抄)
在Java中,有六个不同的地方可以存储数据: 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制. 2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存 ...
- Java中hashCode与equal方法详解
转载自http://blog.csdn.net/jiangwei0910410003/article/details/22739953 Java中的equals方法和hashCode方法是Object ...
- Java中的IO流系统详解(转载)
摘要: Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java ...
随机推荐
- c++中的原子操作
1. c/c++标准中没有定义任何操作符为原子的,操作符是否原子和平台及编译器版本有关 2. GCC提供了一组内建的原子操作,这些操作是以函数的形式提供的,这些函数不需要引用任何头文件 2.1 对变量 ...
- HDU 2529 Shot (物理数学题)
题目 解题过程: //物理数学题 #include<stdio.h> #include<string.h> #include<algorithm> using na ...
- POJ 1222
EXTENDED LIGHTS OUT Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6196 Accepted: 40 ...
- Windows命令查看文件MD5
certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile filename SHA256
- DB2 DATE类型在显示的时候,带有00:00:00,去掉的方法,使用VARCHAR()函数
DROP VIEW DMS.V_AQ_INSURANCECLAIMS; CREATE VIEW DMS.V_AQ_INSURANCECLAIMS AS SELECT * FROM (SELECT T1 ...
- android listview 加载图片错乱(错位)
写道 今天晚上一个朋友介绍我看了一篇文章,也是解决android中listview在加载图片错位的问题,看了之后,感觉写的很好,自己也遇到这个问题,但是又不知道从何下手,看到这篇文章后,我的问题 ...
- 读取本地excel发短信
package com.cmcc.zysoft.sellmanager.controller; import java.io.File; import java.io.FileInputStream; ...
- iOS 开发--Objective-C 反射机制
了解反射机制 Objective-C语言中的OC对象,都继承自NSObject类.这个类为我们提供了一些基础的方法和协议,我们可以直接调用从这个类继承过来方法.当然,本篇文章中讲到的反射方法,就在NS ...
- J-link V8固件升级记
http://blog.sina.com.cn/s/blog_5bdee3020101khfy.html 好久没为电子工程事业尽份力了!今天也稍微努把力!写写我是如何升级J-link的固件的吧! J- ...
- BASM遵循的规则
任何情况下,在寄存器的使用上,BASM遵循如下的规则: ASM 语句执行过程中,必须保存EDI.ESI.ESP.EBP.EBX 的值(5个寄存器,意思是可以用,但最后得恢复成原模原样). ASM ...