• 字符串


    java中提供了String类支持字符串的功能,毕竟字符串本质就是一堆字符的组合,那么就来看看它有什么特点吧。

    • String的特点

    String把字符串还是存放在一个char数组中的,数据的操作围绕它展开,但有点特别的地方,代码如下

    private final char value[];

    可以发现这个char value[]是加了final的,也就是说一旦创建了值就不可变。这样就会导致每一次创建String只会有一个值,再对其进行字符串操作也必须生成新的值。java对这个处理使用了字符串常量池的概念。就是把字符串丢到一个池里,如果相同就用相同的。当然这也有个前提,就是要用下面的方式

    String s = "abc";

    这样做的时候jvm会在编译期就确定了,在运行时会先在常量池里查找是否有"abc",没有就添加并返回,有的话返回常量池的对象。这样做的好处是对于相同的字符串就不需要重复创建啦。 但是如果使用下面的代码

    String s1 = new String("abc");

    这个时候情景就变了,这里jvm会在堆栈里创建一个对象s1,只不过s1里的value也是指向"abc"的。后面在看字符串比较的时候会发现区别。

    • 字符串比较 看一段代码:
    String s = "abc";
    String s1 = "abc";
    
    if (s == s1) {
        System.out.println("s == s1");
    }

    问:这时s==s1吗?

    答案是相等的,为什么呢?其实jvm会在s1创建时去常量区查找是否有相同值的字符串,如果有就返回给s1,这样s1就和s指向了同一个字符串,所以是相等的。

    但是还有一种情况就不一样,

    String s = "abc";
    String s3 = new String("abc");
    if (s == s3) {
    	System.out.println("s == s3");
    }
    else {
        System.out.println("s != s3");
    }

    这个时候应该print出s != s3,这是因为new一个String对象后确实会创建一个新的变量。所以使用==比较的话自然就返回false了。

    用到equals比较呢?

    String s = "abc";
    String s2 = new String("abc");
    if (s.equals(s2)) {
    	System.out.println("s = s2");
    }
    else {
        System.out.println("s != s2");
    }

    打印是s = s2,因为==是用于比较两个地址,而equals是用于比较两个变量的值。可以看一下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;
    }

    在equals中,先是比较是否地址相同,如果不相同比较value,因为value都是"abc"自然就返回true。

    • intern方法

    String里有一个intern方法,我们可以先试一下面的代码。

    String s = "abc";
    String s3 = new String("abc");
    if (s.intern() == s3.intern()) {
    	System.out.println("s.intern = s3.intern");
    }
    else {
        System.out.println("s.intern != s3.intern");
    }
  • 相关阅读:
    PAT《数据结构学习与实验指导》实验项目集 2-09 2-10 2-11 2-12 2-13
    codeblocks+Mingw 下配置开源c++单元测试工具 google test
    编程之美 1.16 24点游戏
    PAT 1065 1066 1067 1068
    多线程批量执行等待全部结果
    使用Git和远程代码库
    CentOS下Crontab安装使用详细说明(转)
    安装和测试Kafka(转)
    MapReduce任务参数调优(转)
    Maven构建应用程序常用配置(转)
  • 原文地址:https://www.cnblogs.com/yjc1605961523/p/9124329.html
Copyright © 2020-2023  润新知