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 ...
随机推荐
- Topcoder srm 632 div2
脑洞太大,简单东西就是想复杂,活该一直DIV2; A:水,基本判断A[I]<=A[I-1],ANS++; B:不知道别人怎么做的,我的是100*N*N;没办法想的太多了,忘记是连续的数列 我们枚 ...
- dojo简单添加一个Panel到父容器中
this.contentPane = new ContentPane(); this.set("content", this.contentPane.domNode); this. ...
- C# 对委托的BeginInvoke,EndInvoke 及Control 的BeginInvoke,EndInvoke 的理解
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- ZOJ3718 Diablo II(状态压缩dp)
题意:一个人物有K(K<=7)种技能,每种技能都有bi,ci,di值,表示该技能不能点超过bi次,每点一次加ci,点满bi次有一个附加得分di.然后还有N件武器,武器本身会有能力加成,然后每个武 ...
- ios下最简单的正则,RegexKitLite
ios下最简单的正则,RegexKitLite 1.去RegexKitLite下载类库,解压出来会有一个例子包及2个文件,其实用到的就这2个文件,添加到工程中.备用地址:http://www.coco ...
- **apache环境下 禁止显示 index of/ 目录下(如何禁止访问网站根目录)
比如: http://123.57.49.XX6// 当这样访问的时候,可能会列出网站的根目录 如何禁止列出网站目录,方法如下: 让别人知道你的网站目录结构直接查看你目录下的所有文件是很危险的一个事情 ...
- ExtJs之FieldSet和FieldContainer
<!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...
- 妙味课堂——HTML+CSS(第四课)(一)
这一课学的东西真是太多了,还不赶快记下来,留待以后慢慢回味! 首先我们回顾一下inline-block的特性: 使块元素在一行显示 使内嵌支持宽高 换行被解析了(问题) 不设置宽度的时候,宽度由内容撑 ...
- Android 注入详解
Android下的注入的效果是类似于Windows下的dll注入,关于Windows下面的注入可以参考这篇文章Windows注入术.而Android一般处理器是arm架构,内核是基于linux,因此进 ...
- hdu 1124 Factorial(数论)
题意: 求n!的尾0的个数 分析: 0一定是由因子2和5相乘产生的: 2的个数显然大于5的个数,故只需统计因子5的个数 n/5不能完全表示n!中5的个数(egg: 25),应该n/=5后,累加上n/2 ...