Java基础之String类详解

String 类代表字符串。Java 程序中的所有字符串字面值(如 “abc” )都作为此类的实例实现。字符串是常量;它们的值在创建之后不能更改。字符串缓冲区支持可变的字符串。因为 String 对象是不可变的,所以可以共享。

java中对字符串的操作是非常便捷的,因为java提供了许多针对字符串操作的方法。一下是一些常用方法:
String类的常用方法
更多方法请查看java JDK API文档。

关于几个方法的要点

equals方法

String类中复写了Object类的equals方法:

 public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

可以看到当且仅当参数不为 null,并且是与此对象表示相同字符序列的 String 对象时,结果才为 true。换句话说就是只有当两个引用指向同一个对象时或两个不同的String对象表示相同的字符序列时,返回true。而 == 比较的是两个引用所指向的对象的地址是否相同,也就是两个引用是否指向同一个引用。下面通过一个小例子说明。

public static void main(String[] args) {
        // TODO Auto-generated method stub
        String a = "abc";
        String b = "abc";

        String c = new String("123");
        String d = new String("123");

        System.out.println("a == b :"+(a == b));
        System.out.println("c == d :"+(c == d));
        System.out.println("a.equals(b):"+a.equals(b));
        System.out.println("c.equals(d):"+c.equals(d));
    }

运行结果:
a == b :true
c == d :false
a.equals(b):true
c.equals(d):true
e.equals(a):true

对于 a == b :true,因为Java中内存分成两种:一种是栈stack,一种是堆heap。函数中的一些基本类型的变量(int, float)和对象的引用变量(reference)都在函数的栈中,(工作于编译阶段, 生成class文件之前)分配。存取速度快,稍逊于寄存器, 比堆快,函数执行完后,Java会自动释放掉为函数里变量开辟的栈内存空间,该内存空间可以立即被另作他用。堆heap内存用来存放由new创建的对象和数组。堆内存,负责运行时(runtime, 执行生成的class文件时)数据,由JVM的自动管理。缺点是,存取速度较慢。 栈中的引用变量指向堆中的对象或数组。

而栈中有共享池的概念,比如上面例子中,a=”abc”;在栈中创建一个String对象引用变量a,然后看看栈中有没有”abc”,如果没有,则将”abc”存放进栈,并令a指向”hello”,如果已经有”abc” 则直接令a指向“abc”。对于int, float 类型的变量也是一样的有这种共享池的概念,注意上述的工作是在compile(编译)的阶段完成的,而不是runtime运行时完成的。所以a和b指向的是同一个对象。地址当然相同,所以a == b为true,a.equals(b):true。

但是String c = new String(“123”);String d = new String(“123”);是用new()来新建对象的,存于堆中,没调用一次就会创建一个新的对象。所以c和d是两个完全不同的对象,但是表示的字符序列是相同的,所以c == d :false,c.equals(d):true。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值