从Java源码看String的两种比较方式

String的两种字符串比较方式

  == 和 equals方法

==:

  ==比较的是字符串在内存中的地址

  代码示例:

 1 public class EqualsDemo {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         String s1 = "String";
 8         String s2 = "String";
 9         String s3 = new String("String");
10         String s4 = new String("String");
11         System.out.println(s1 == s2);
12         System.out.println(s1 == s3);
13         System.out.println(s3 == s4);
14     }
15 }

==字符串比较代码示例

  运行结果:

    true

    false

    false

  结果分析:

    当创建s1的时候,程序会在字符串缓冲池中找"String"这个字符串,没有找到,便会在字符串缓冲池中创建"String"字符串,当创建s2的时候,程序会在字符串缓冲池中找"String"字符串,找到相同的值,就直接引用s1中"String"的值,在进行比较的时候,其实比较的是两个字符串在字符串缓冲池中的地址.当创建s3的时候,不在是将"String"放入到字符串缓冲池中,因为这时候创建的是一个对象,而不是一个常量字符串.创建s4的时候也会创建一个新的对象.所以,其实s1和s2所指向的地址是字符串常量池中的一个"String"常量,而s3和s4都是不同的对象,所以s1==s2为真,s1==s3为假,s3==s4为假

equals()方法:

  equals方法比较的是字符串中的值

  代码示例:

 1 public class EqualsDemo {
 2
 3     /**
 4      * @param args
 5      */
 6     public static void main(String[] args) {
 7         String s1 = "String";
 8         String s2 = "String";
 9         String s3 = new String("String");
10         String s4 = new String("String");
11         System.out.println(s1.equals(s2));
12         System.out.println(s1.equals(s3));
13         System.out.println(s3.equals(s1));
14         System.out.println(s3.equals(s4));
15     }
16 }

equals方法代码示例

  运行结果:

    true

    true

    true

    true

  结果分析:

    java中String类中equals方法被重写

 1   /**
 2      * Compares this string to the specified object.  The result is {@code
 3      * true} if and only if the argument is not {@code null} and is a {@code
 4      * String} object that represents the same sequence of characters as this
 5      * object.
 6      *
 7      * @param  anObject
 8      *         The object to compare this {@code String} against
 9      *
10      * @return  {@code true} if the given object represents a {@code String}
11      *          equivalent to this string, {@code false} otherwise
12      *
13      * @see  #compareTo(String)
14      * @see  #equalsIgnoreCase(String)
15      */
16     public boolean equals(Object anObject) {
17         if (this == anObject) {
18             return true;
19         }
20         if (anObject instanceof String) {
21             String anotherString = (String)anObject;
22             int n = value.length;
23             if (n == anotherString.value.length) {
24                 char v1[] = value;
25                 char v2[] = anotherString.value;
26                 int i = 0;
27                 while (n-- != 0) {
28                     if (v1[i] != v2[i])
29                         return false;
30                     i++;
31                 }
32                 return true;
33             }
34         }
35         return false;
36     }

String类中equals方法

    从源码我们可以分析出:equals方法首先比较的是对象的引用,如果两个对象的地址是相同的,那么直接返回true,如果比较的对象时String类型,或者是String类型的子类,则进行String类的值比较(其中比较的方法包括通过两个字符的长度,如果长度不相同直接返回false;如果相同,然后挨个字符进行比较,如果所有字符都相同则返回true,简单说就是值得比较)

时间: 2024-10-26 15:39:53

从Java源码看String的两种比较方式的相关文章

解密随机数生成器(二)——从java源码看线性同余算法

Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术的3.2.1节) 如果两个Random实例使用相同的种子,并且调用同样的函数,那么生成的sequence是相同的 也可以调用Math.random()生成随机数 Random实例是线程安全的,但是并发使用Random实例会影响效率,可以考虑使用ThreadLocalRandom变量. Random实

Java中String的两种赋值方式的区别

本文修改于:https://www.zhihu.com/question/29884421/answer/113785601 前言:在java中,String有两种赋值方式,第一种是通过"字面量"赋值,如:String str="hello",第二种是通过new关键字创建新对象,如:String str=new String("hello").那么这两种赋值的方式到底有什么区别呢,下面给出具体分析. 1.首先回顾Java虚拟机的结构图. 在上面的

Java源码之String

本文出自:http://blog.csdn.net/dt235201314/article/details/78330377 一丶概述 还记得那会的“Hello World”,第一个程序,输出的String,下面介绍String源码,颇有计算机二级考试习题的感觉. 二丶源码及案例 1.String是final类型的 在Java中,被 final 类型修饰的类不允许被其他类继承,被final修饰的变量赋值后不允许被修改. 什么是不可变类? 所谓不可变类,就是创建该类的实例后,该实例的属性是不可改变

关于String的两种赋值方式

String的两种赋值是不同的,String str1=“hello”,指向堆内存中的"hello",而String str2=new String("hello"),因为new开辟的新的堆内存,所以二者地址不同,在用==时,显示的是false. 例一: String str1=“Hello”; String str2=“Hello”; String str3=“Hello”; 这时候三者都是指向同一堆内存地址,因为如果对象池中已经有了相同的字符串声明时,就不会再重

Java源码分析——String的设计

Tip:笔者马上毕业了,准备开始Java的进阶学习计划.于是打算先从String类的源码分析入手,作为后面学习的案例.这篇文章寄托着今后进阶系列产出的愿望,希望能坚持下去,不忘初心,让自己保持那份对技术的热爱. 因为学习分析源码,所以借鉴了HollisChuang成神之路的大部分内容,并在此基础上对源码进行了学习,在此感谢. 问题的引入 关于String字符串,对于Java开发者而言,这无疑是一个非常熟悉的类.也正是因为经常使用,其内部代码的设计才值得被深究.所谓知其然,更得知其所以然. 举个例

java源码阅读String

1类签名与注释 public final class String implements java.io.Serializable, Comparable<String>, CharSequence String类被定义为final类型的,所以String对象一旦创建了,就是不可变的. String类实现了Serializable接口,表示可以序列化. String类实现了Comparable<String>接口,表示String类型可以相互比较.(通过compareTo方法) S

Java源码解析|String源码与常用方法

String源码与常用方法 1.栗子 代码: public class JavaStringClass { public static void main(String[] args) { String s ="hello"; s = "world"; //内存地址已经修改 原来地址上的值还是不变的 String s2 = "hello"; //从常量值中找到并引用 String s4 = new String("hello"

java 序列化 serialVersionUID 的作用 和 两种添加方式

serialVersionUID适用于Java的序列化机制.简单来说,Java的序列化机制是通过判断类的serialVersionUID来验证版本一致性的.在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体类的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常,即是InvalidCastException. serialVersionUID有两种显示的生成方式:        一是默认的1

一、解密随机数生成器(2)——从java源码看线性同余算法(转)

上篇博客中,我们了解了基于物理现象的真随机数生成器,然而,真随机数产生速度较慢,为了实际计算需要,计算机中的随机数都是由程序算法,也就是某些公式函数生成的,只不过对于同一随机种子与函数,得到的随机数列是一定的,因此得到的随机数可预测且有周期,不能算是真正的随机数,因此称为伪随机数(Pseudo Random Number). 不过,别看到伪字就瞧不起,这里面也是有学问的,看似几个简简单单的公式可能是前辈们努力了几代的成果,相关的研究可以写好几本书了!顺便提一下,亚裔唯一图灵奖得主姚期智,研究的就