java 字符串String比较 equals ==

一、==和equals区别

==:
在比较对象时比较的是引用地址是否相同;
在比较基本类型时比较的是其内容。
equals:
比较的是内容,而不比较其引用。

如果对象不同,而内容相同,”==”返回false,equals返回true

String s1 = new String("aaa");
String s2 = new String("aaa");
// s1与s2不是同一个对象
System.out.println(s1==s2);            //false
System.out.println(s1.equals(s2));    //true

如果是同一引用,”==”返回true,equals返回true

String s1 = new String("aaa");
String s2 = s1;
//s1和s2是同一个地址的引用
System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true

String类似基本类型使用
Java中有8种基本数据类型(字母开头小写),即boolean、byte、short、char、int、float、long、double,基本数据类型不是对象,放在堆栈中,用完就销毁,访问速度快。而对象放在堆中。如果必须用到对象Java针对每种基本数据类型提供了包装类,即Boolean、Byte、Short、Character、Integer、Float、Long、Double(开头大写)等。

String s1 = "aaa";
String s2 = "aaa";
// s1与s2是类似类型
System.out.println(s1==s2);            //true
System.out.println(s1.equals(s2));    //true

为啥产生如上结果?
 直接等号赋值是放入内存池的,其它变量也可以引用;new初始化分配内存空间,不可引用。
 String s=”a”和String s=new String(“a”)是有本质上的区别的。前者是在字符串池里写入一个字符’a’,然后用s指向它;后者是在堆上创建一个内容为”a”的字符串对象。
 如果String缓冲池内不存在与其指定值相同的String对象,那么此时虚拟机将为此创建新的String对象,并存放在String缓冲池内。如果String缓冲池内存在与其指定值相同的String对象,那么此时虚拟机将不为此创建新的String对象,而直接返回已存在的String对象的引用。

二、其他

String s;是没有初始化的引用,只是给s分配一个内存空间;
String s=null;为空引用,是分配的空间中存储的值为空值 ;
String s=”a”;是在字符串池里写入一个字符’a’,然后用s指向它。

### Java 字符串 `equals` 方法与 `==` 运算符的区别 在 Java 中,字符串比较常见的数据类型之一,在实际开发中经常需要对其进行比较操作。以下是关于 `equals()` 方法和 `==` 运算符的具体区别: #### 1. 基本概念 - **`==` 运算符**:它主要用于比较两个变量的是否相等。对于基本数据类型(如 `int`, `char`),它是直接比较;而对于引用类型(如对象、数组、字符串),则是比较它们的内存地址是否相同 [^2]。 - **`equals()` 方法**:这是由 `Object` 类定义的一个方法,默认情况下也是用来比较对象的内存地址。然而,`String` 类重写了该方法,使其能够比较字符串的内容而不是内存地址 [^1]。 #### 2. 使用场景对比 - 当使用 `==` 对字符串进行比较时,如果两个字符串指向同一个对象或者通过编译期优化被分配到相同的常量池位置,则返回 `true`,否则即使内容一致也会返回 `false` [^3]。 - 而调用 `equals()` 方法则会逐字符地检查两个字符串的内容是否完全匹配,忽略其存储的位置差异 [^4]。 #### 示例代码说明 下面是一个简单的例子来展示两者的不同之处: ```java public class StringCompareExample { public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); System.out.println(str1 == str2); // true,因为str1和str2指向同一常量池中的实例 System.out.println(str1 == str3); // false,虽然内容一样但是str3创建了一个新的对象 System.out.println(str1.equals(str2)); // true,内容相同 System.out.println(str1.equals(str3)); // true,尽管不是同一个对象但内容相同 } } ``` #### 总结 因此,在日常编程实践中,应该根据具体需求选择合适的比较方式。如果是想确认两个字符串是否具有同样的内容,请始终使用 `equals()` 方法;而仅当你确实关心这两个变量是否确切表示同一个对象而非仅仅拥有相似的数据时才考虑采用 `==` 来做判断。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值