我是靠谱客的博主 缓慢超短裙,最近开发中收集的这篇文章主要介绍创造String对象两种方式的区别,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

1、通过构造方法创建:

通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但地址值不同

2、直接赋值方式创建:

以 “ ” 方式给出的字符串,只要字符序列相同 ( 顺序和大小写 ),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串池中维护

== 和equals的区别

==比较基本数据类型,比较的是具体的值

==比较引用数据类型:比较的是对象地址值

equals比较String类型: 比较的是对象的内容是否相

下面将结合代码说一下上面的知识点

案例1:

public class StringDiff1 {
    public static void main(String[] args) {
        char[] chs = {'a', 'b', 'c'};
        String s1 = new String(chs);
        String s2 = new String(chs);
        String s3 = "abc";
        String s4 = "abc";

        System.out.println(s1 == s2);           //1  false
        System.out.println(s1 == s3);           //2  false
        System.out.println(s3 == s4);           //3  true
        System.out.println("--------");
        System.out.println(s1.equals(s2));      //4  true
        System.out.println(s1.equals(s3));      //5  true
        System.out.println(s3.equals(s4));      //6  true

        System.out.println(s3.equals(chs));     //7  false
    }
}

1、s1和s2都是通过new关键字创建的,内存地址与其他的都不相同,所以1和2都是false;s3和s4存在于字符串常量池中,在字符串常量池中是不会存储相同内容的字符串的,当String s4 = “abc”;时,发现在字符串常量池中已经存在“abc”了,于是s4和s3指向同一地址。

2、String的equals()方法比较的是两个字符串的内容,所以4/5/6都是true

3、String的equals()方法参数是Object类型,调用equals()方法可以传递任意类型的数据。但是,equals()方法的内部原理,优先判断如果参数不是String类型,直接返回false(s3是字符串类型,chs是字符数组,直接返回false);如果参数是String类型,才会去比较字符串的内容是否相同。源码如下:

    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;   //如果比较的不是String类型,直接返回false
    }

使用断点进行调试:s3和 chs类型不同,直接从1跳转到2

简易内存分配图:

案例2:

public class StringDiff2 {
    public static void main(String[] args) {
        String s1 = "Hello World";
        String s2 = "Hello" + " World";
        System.out.println(s1.equals(s2));       //1  true
        System.out.println(s1 == s2);            //2  true

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

        String s3 = "abc";
        String s4 = "ab";
        String s5 = s4 + "c";
        System.out.println(s3 == s5);            //3  false
        System.out.println(s3.equals(s5));       //4  true
    }
}

 1、String s2 = "Hello" + " World";   此处+左右两边都是字符串常量对象,在编译期间JVM就能计算出结果字符串"Hello World",而该字符串"Hello World"在常量池空间中已经有了,不会再重新创建新的字符串处理对象"Hello World"了,所以1和2内容相同、地址相同(String s2 = "Hello" + " World"; 在编译的时候生成的.class文件就已经把两个字符串进行拼接了)

 2、s4是变量,JVM在编译期间无法确定最终的结果的,简单理解: 在使用+进行字符串拼接时,只要+左右两边出现了字符串变量,那就相当于new,所以s3==s5为false

深度理解:
+ 中有字符串变量进行拼接时,内部使用StringBuilder完成字符串拼接后,再把StringBuilder通过new String的方法,转换成String对象

最后

以上就是缓慢超短裙为你收集整理的创造String对象两种方式的区别的全部内容,希望文章能够帮你解决创造String对象两种方式的区别所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(35)

评论列表共有 0 条评论

立即
投稿
返回
顶部