java 中String.equals和==的比较
作者:大舒 发布时间:2023-03-09 08:45:16
java 中String.equals和==的比较
初学java有段时间了,但是昨晚忽然就被"asd"==getpara("password")搞得不开心了:确实JAVA很多东西和以前接触过的语言完全不一样,比如最简单的new String("asd") !=new String ("asd")。
1 一个最简单的程序:
public class A {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);
}
}
肯定很多人说,输出true,确实是输出true,s1和s2引用的是同一个东西嘛。但是这个程序如果换一种写法,那么肯定就不太一样了。
2 第一种变体:
public class A {
public static void main(String args[]) {
String s1 = "Hello";
String s2 = new String("Hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
或者:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s2 = new String("Hello");
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
}
}
那么结果就有点不太确定了,有些人很坏的想到了,单独拿出来,肯定至少有一个不会相等。
这两个程序的结果都是false true,原因很简单,JAVA是一个基本完全面向对象的语言,s1 == s2 判断的是他的引用(相当于内存地址、指针),equals则是使用这个对象自身的方法去判断值是否相等。
在以下表达式中:
String s1 = "Hello";
String s2 = new String("Hello");
JVM得到的是两个不同的信息:
1.我要创建一个“Hello”字符串。
2.我要创建一个新的“Hello”字符串,不要跟原来的一样的。
于是,s1 != s2.
3 第二种变体:
顺序排列:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s2 = new String("Hello");
String s3 = "Hello";
s1=s1.intern();
s2=s2.intern();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
}
}
打乱顺序排列:
public class A {
public static void main(String args[]) {
String s1 = new String("Hello");
String s3 = "Hello";
s1=s1.intern();
String s2 = new String("Hello");
s2=s2.intern();
//也可以String s2 = new String("Hello").intern();
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));
System.out.println(s3 == s2);
System.out.println(s3.equals(s2));
}
}
那么这次应该很清楚了=
两个object,但是中间加入了一些羞羞的东西,于是答案肯定是true true true true。
那么intern到底是什么。
4 intern作用:
当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(该对象由 equals(Object) 方法确定),则返回池中的字符串。
否则,将此 String 对象添加到池中,并且返回此 String 对象的引用。
intern的适用情况:多个相同的大字符串同时出现的情况,例如可能出现多个相同消息的消息队列的设计。
来源:https://segmentfault.com/a/1190000002645999
猜你喜欢
- 本文实例为大家分享了Android绝对布局AbsoluteLayout的具体代码,供大家参考,具体内容如下1>AbsoluteLayo
- 使用ApplicationContext获取bean对象编写一个ApplicationContextFactory工厂类public cla
- 一、什么是SFTP?SFTP是一个安全文件传送协议,可以为传输文件提供一种安全的加密方法。SFTP 为 SSH的一部份,是一种传输文件到服务
- Navigator 的 push 和 pop方法Navigator 导航器的 push 和 pop 方法可以携带参数在页面间传递,其他变形的
- 前言Mybatis真正强大的地方在于SQL映射语句,这也是它的魅力所在。相对于它强大的功能,SQL映射文件的配置却非常简单,我上篇文章语句讲
- 背景在开发中,如果用try catch的方式,每个方法都需要单独实现,为了方便分类异常,返回给前端,采用了@ControllerAdvice
- 获取最新插入数据的id原始方法读取最后一条的插入数据,但这样会造成如果两条数据同时插入,会并发出现错误SELECT * FROM admin
- 网上找了一些获取客户端IP的方法,但本地测试时,返回的是IPv6的表示方法"::1":Host文件里面:# &
- Java(和其他语言)通过内部类支持嵌套类。要使其正常工作,需要编译器执行一些技巧。这是一个例子:public class Outer {
- 1.导入pom依赖<!-- mybatis-->  
- Object 类位于 java.lang 包中,是所有 Java 类的祖先,Java 中的每个类都由它扩展而来。定义Java类时如果没有显示
- 1. Spring Boot Condition功能与作用@Conditional是基于条件的自动化配置注解, 由Spring 4框架推出的
- 这篇文章主要介绍了spring boot如何指定启动端口,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 前言之前一篇文章介绍了基本的统一异常处理思路: Spring MVC/Boot 统一异常处理最佳实践.上篇文章也有许多人提出了一些问题:如何
- IO流Java中IO流分为两种,字节流和字符流,顾名思义字节流就是按照字节来读取和写入的,字符刘是按照字符来存取的;常用的文件读取用的就是字
- 1、利用延迟队列延时队列,第一他是个队列,所以具有对列功能第二就是延时,这就是延时对列,功能也就是将任务放在该延时对列中,只有到了延时时刻才
- 目录一、什么是 RUNNABLE?二、与传统的ready状态的区别三、与传统的running状态的区别四、当I/O阻塞时五、如何看待RUNN
- Springboot内部提供的事务管理器是根据autoconfigure来进行决定的。比如当使用jpa的时候,也就是pom中加入了sprin
- 实现方式和继承方式有什么区别呢?*区别:*继承Thread:线程代码存放在Thread子类run方法中*实现Runnable:线程代码存放在
- Android Build类的详解及简单实例一、类结构:java.lang.Object? android.os.Build二、类概述:从系