Java:String与StringBuffer中equals

本文详细解析了Java中字符串(String)与可变字符串(StringBuffer)的内部实现机制及使用特性,包括它们在内存中的存储方式、对象创建过程以及equals方法的重写等关键概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Test实例

public class Test {

        public static void main(String[] args) {

                 String s = "This is a string";

                String s1 = "This is a string";

                 String s2 = s;

                 System.out.println(s.equals(s1));// true

                 System.out.println(s == s1);// true

                 System.out.println("---------------------------");

                 System.out.println(s.equals(s2));// true

                 System.out.println(s == s2);// true

                 System.out.println("---------------------------");

                 String s3 = new String("This is a string");

                 String s4 = new String("This is a string");

                 System.out.println(s1 == s3);// false

                 System.out.println(s1.equals(s3));// true

                 System.out.println(s3 == s4);// false

                 System.out.println(s3.equals(s4));// true

                 System.out.println("---------------------------");

 

                 StringBuffer str = new StringBuffer("This is aStringBuffer");

                 StringBuffer str1 = new StringBuffer("This is aStringBuffer");

                 StringBuffer str2 = str;

                 System.out.println(str == str1);// false

                 System.out.println(str.equals(str1));// false

                 System.out.println("---------------------------");

                 System.out.println(str == str2);// true

                 System.out.println(str.equals(str2));// true

                 System.out.println("---------------------------");    }

}


 

String 指向静态内存区域

public final class String extends Object implementsSerializable, Comparable ;


 

StringBuffer 指向动态内存区域

public final class StringBuffer extends Object implementsSerializable 


 

不用new产生的String对象实际上是建立在常量池(内存中的一块区域)的,是属于编译器常量,即在所在类编译的时候就分配好了内存,随class文件一起载入,当另一个内容一样的字符串建立时,编译器并不会去再分配内存,而是先在常量池中找与该字符串匹配的对象,如果找到则指向找到的对象,如果找不到,再在常量池中分配内存;

String testStr = "aaa"; // 分配一块内存区域 相当于String testStr = newString("aaa");
testStr = "bbb"; // 相当于重新分配一块内存 testStr = new String("bbb");
testStr = "aaa" + "bbb"; // testStr = new String("aaa") + newString("bbb");


用new产生的String对象则属于执行期对象,它只有在程序执行中才去建立对象分配内存,因此每此new一个对象就会分配一块内存。

 

String对象在做为引数传递的是值,而StringBuffer则传递的是引用。

 

StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的;

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。

 

Object类的equals()方法:

public boolean equals(Object obj){

        return (this == obj);

    }


此处equals()方法同==。

 

String类中重写Object类的equals()方法:

public boolean equals(ObjectanObject) {

        if (this == anObject) {

           return true;

        }

        if (anObject instanceof String) {

            StringanotherString = (String)anObject;

            int n= count;

            if (n== anotherString.count) {

                 char v1[] = value;

                 char v2[] = anotherString.value;

                 int i = offset;

                 int j = anotherString.offset;

                 while (n-- != 0) {

                     if(v1[i++] != v2[j++])

                         return false;

                 }

                 return true;

            }

        }

        return false;

    }

 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值