如果:
string s1=new String("Hello");
string s2=new String("Hello");
则(s1==s2)=false
而:
string s1="Hello";
string s2="Hello";
则(s1==s2)=true;
因为他们指向的同一个对象。
通过上例,可以看出,字符串在初始化时:
String s1="Hello";
String s2="Hello"; //s1与s2是指向同一对象,无论用“equals”还是“==”,其结果都是相等,结果都为true
与
String s1=new String("Hello");
String s1=new String("Hello"); //s1与s2是不同的对象,用“equals”为true,而用“==”为false
是不同的。
如果把其他变量的值赋给s1和s2,即使内容相同,由于不是指向同一个对象,也会返回false。所以建议使用equals(),因为equals比较的才是真正的内容!
String str="hello";
if(str=="hello")
System.out.print("==");
else System.out.print("!=");
上述==和equal都相等
String str=new String("hello");
if(str.equals("hello"))
System.out.print("==");
else System.out.print("!=");
上述== 不相同 。equal相等。不同的对象,相当于不同的字符串申请方式。
String str=new String("hello");
str=str.intern();
if(str=="hello")
System.out.print("==");
//返回true
打开String类的源码发现这是一个本地方法,定义如下:
public native String intern();
文档告诉我们该方法返回一个字符串对象的内部化引用:
由String类维护一个初始为空的字符串的对象池,当intern方法被调用时,如果对象池中已经包含这一个相等的字符串对象则返回对象池中的实例,否则添加字符串到对象池并返回该字符串的引用。
从程序的角度上怎么来看这个方法呢
我们假设有两个字符串s1,s2,当s1.equals(s2)时,s1.intern()==s2.intern(),
也就是说这两个字符串在内存中使用的是同一个实例。
Java语言规范中定义了字符串文字以及更一般的常量表达式的值的字符串是被内部化的,以便它们共享同一个实例。我们试验一下下面代码
String s1 = "你好,Java自由人";
String s2 = "你好," + "Java自由人";
System.out.println(s1==s2);
System.out.println(s1.intern()==s2.intern());
这段代码将打印两个true,也就是说字符串s1和s2是共享同一个实例。不过前提是尽管使用了表达式,但是表达式中必须都是常量。
当然我现在还想不出这个方法到底有什么用,不过算是对Java虚拟机内部组织结构的一些了解,
同时了解这个处理机制也可以让我们在用到字符串常量的时候了解如何节省这些字符串所占用的内存。
很奇怪的是intern这个方法居然在JBuilder 2005上被告知是一个未定义的方法,在Eclipse中表现很正常。
分享到:
相关推荐
Java 中关于 == 和 equal 的区别 及其 equals() 方法重写 Java 语言是 Sun 公司的开发成果,其主要特点是可以执行强,与平台的无关性使其实用性更强。但是 Java 中的 == 与 equal 是有区别的。 == 操作符是 Java ...
在Java编程语言中,处理字符串是非常常见的操作,尤其是在涉及到文本分析和处理的场景。本文将深入探讨如何在Java中进行中文字符的判断和计数,这主要基于Java的Unicode编码特性以及字符集的理解。 首先,我们需要...
在Java编程语言中,`equals()` 和 `==` 运算符经常被用来比较对象,但它们之间存在着显著的区别。理解这些差异对于编写正确、健壮的代码至关重要。以下是关于 `equals()` 和 `==` 在Java中的详细解释。 首先,`==` ...
在Java编程语言中,`equal`方法和`==`操作符都是用来比较对象之间是否相等的工具,但它们之间存在重要的差异。本文将从三个方面进行详细的对比分析:字符串的比较、非字符串对象的比较以及基本数据类型的比较。 ###...
Java 中 == 与 equals() 的区别 Java 中的 == 和 equals() 是两个不同的比较方法,它们之间有着很大的区别。== 操作符专门用来比较两个变量的值是否相等,也就是比较变量所对应的内存中所存储的数值是否相同。用于...
java java_leetcode题解之Equal Rational Numbers.java
在Java编程语言中,`==` 和 `equals()` 是两种常用的比较操作符,它们在不同情况下有着不同的含义和用途。本文将深入探讨这两者之间的差异,并通过实例代码和理论解释来帮助理解。 首先,`==` 操作符主要用于基本...
java java_leetcode题解之Partition Equal Subset Sum.java
"浅析Java中String类型中“==”与“equal”的区别" Java 中的 String 类型是一个基本数据类型,然而在使用 String 类型的时候,我们经常会遇到“==”和 “equal” 两个操作符的使用问题。这两个操作符都是用于比较...
JAVA 中的 Integer 比较 在 Java 中,我们经常需要比较两个 Integer 对象是否相等,但是在使用 "==" 运算符时,可能会出现一些意外的结果。本文将深入探讨 Java 中的 Integer 比较,了解为什么使用 "==" 运算符可能...
java java_leetcode题解之Get Equal Substrings Within Budget.java
java java_leetcode题解之Partition to K Equal Sum Subsets.java
在Java编程语言中,"java时钟java.java"可能是一个示例程序,用于演示如何在Java中创建和使用时钟。作为一个初学者,你可能会对以下几个关键知识点感兴趣: 1. **Java时间日期API**:在Java 8之前,Java使用`java....
在JAVA环境中,我们经常会遇到大量的数值型数据,为了更好地理解和处理这些数据,我们可以采用等宽和等频分箱技术。下面将详细阐述这两种方法以及它们在JAVA中的实现。 等宽分箱(Equal Width Binning)是一种将...
Java_详解_1、==和Equal用法与比较
Java的注解(Annotation)是元数据的一种形式,它提供了在代码中嵌入信息的方式,这些信息可以被编译器或运行时环境用来执行各种任务,如代码分析、验证、生成代码、部署等。注解在Java编程中扮演着重要的角色,尤其...
根据提供的信息,我们可以总结出这份文档是关于Java基础的学习材料,特别聚焦于...通过这些知识点的学习和实践,你可以更加熟练地掌握Java中的基本流程控制和运算符使用方法,为进一步深入学习Java编程打下坚实的基础。
在 Java 练习题中,我们可以看到多种题型,包括填充题、true/false题和多选题。这些题型涵盖了 Java 语言的多个方面,包括基本概念、数据类型、变量、运算符、控制流语句、方法、数组等。 首先,让我们来看一看填充...
标识符是JAVA中的一种符号,用于命名变量、方法、类等。标识符由字母、下划线、美元符、数字组成,但必须以字母、下划线、美元符开头,不能以数字开头。 JAVA中的常量可以分为整型常量、实型常量、字符常量、逻辑...
这个Java蓝屏分析器的工作原理可能是读取并解析蓝屏事件的日志文件,如Windows中的Minidump文件。Minidump文件包含了系统崩溃时的关键内存状态信息,包括CPU寄存器值、内存映射和加载的驱动程序列表等。通过解析这些...