浅谈Java中的String对象

浅谈Java中的String对象

String类部分原代码

首先看String类的源码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence,Constable, ConstantDesc {
    @Stable
    private final byte[] value;
    
    private final byte coder;

    /** Cache the hash code for the string */
    private int hash; // Default to 0

    private boolean hashIsZero; // Default to false;
    
    private static final long serialVersionUID = -6849794470754667710L;
    ...

从源码中可以看出String类型的value字符数组使用final修饰的,这意味着String类型自被创建之后就不可改变。

再看一段简单代码

下面是一段简单的关于String类对象的判断的代码

// An highlighted block
public static void main(String[] $s) {
        String A = "StringA";
        String B = A;
        //"StringA"已存在,并不会创建新的对象
        String C = "StringA";
        System.out.println("A = B:" + (A == B));
        System.out.println("A = C:" + (A == C));
        //下面比较jvm会先从堆中寻找是否有"StringA"
        System.out.println("A = 'StringA':" + (A == "StringA"));
        //下面比较jvm会直接创建一个新的String类型的对象,将该对象的引用返回给用户
        System.out.println("A = 'new StringA':" + (A == new String("StringA")));
    }

程序运行结果

A = B:true_
A = C:true
A = ‘StringA’:true
A = ‘new StringA’:false
A = ‘StringA.intern()’:true

分析
(1)首先 String A = "StringA"执行之后,一个值为“StringA”的String类对象被创建,字符串常量值被添加到内存的字符串常量池中,并将该String对象与"引用 A “绑定。
(2)String B = A执行之后,将引用 A 赋值给 B ,此时 A 与 B 为相同引用,且两者都指向新创建的字符串"StringA”
(3)String C = "StringA"执行之后,java虚拟机会首先从字符串常量池中寻找是否含有值为 “StringA” 的字符串常量,如果有的话会直接将"引用 C "指向该常量,此时 A、B 与 C 同时指向"StringA"对象。
(4)对于‘= =‘如果是设计基本类型,则比较它们的值;如果涉及引用类型的比较,则会比较它们是否指向同一个对象,所以此时A = = B = = C ;
(5)在判断(A == “StringA”)时,jvmhui会先从字符串常量池中寻找是否含有值为 “StringA” 的字符串常量,如果有的话会直接返回该String对象的引用,所以A = = "StringA"的结果为true;
(6)在判断(A = =new String(“StringA”))时,jvm会立即创建一个新的String对象并放到堆中返回该引用,所以两者指向的地址并不同,结果为false;
(7)在判断(A = =‘StringA’.intern())时,string.intern方法hui会先从字符串常量池中寻找是否含有值为 “StringA” 的字符串常量,如果有的话会直接返回该String对象的引用,没有的话会创建String对象并放到常量池中,所以A = = “StringA”.intern()的结果为true;

最后

本文章只是简单了解一下String类的一些机制,如果有错误还请指出。
本文参考链接: https://blog.csdn.net/qq_34490018/article/details/82110578.

发布了19 篇原创文章 · 获赞 6 · 访问量 728

猜你喜欢

转载自blog.csdn.net/qq_42631607/article/details/102924590
今日推荐