Java 中String 类特别之处(不可变?+运算符重载?new String("abc")创建了几个对象?)

1. String 为什么是不可变的?

简要说明下:这个可以看JDK源码。String本质是一个char[]数组。而且用final修饰, 在JDK1.7中,String的成员变量主要有两个。

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {

     /** String本质是个char数组. 而且用final关键字修饰.*/
    /** The value is used for character storage. */
    private final char value[];

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

final修饰的char[]数组,该引用不可改变,虽然引用不可变。挡不住Array数组是可变的事实。Array的数据结构看下图
这里写图片描述

final int[] value={1,2,3}
int[] another={4,5,6};
value=another; //编译器报错,final不可变

value用final修饰,编译器不允许我们把value指向堆区另一个地址。但如果我直接对数组元素动手,分分钟搞定。

final int[] value={1,2,3};
value[2]=100; //这时候数组里已经是{1,2,100}

但是char数组在源码中是定义为private,私有成员,外部不能访问和更改。所以综上所述 String不可变。

详细分析见
① Java中的String为什么是不可变的? – String源码分析
② 知乎 如何理解 String 类型值的不可变?


2. String s=new String(“abc”)创建了几个对象?

① String s=new String(“abc”)创建了几个对象?
② 面试题之String str = new String(“abc”); 创建了几个对象
③ Java里String a = new String(“abc”);这会在堆和栈里面分别创建对象abc吗?
④ 请别再拿“String s = new String(“xyz”);创建了多少个String实例”来面试了吧


3. String类与常量池

① Java常量池理解与总结
② Java 为什么需要常量池
③ Java中的字符串常量池


4. String 字符串的拼接+是运算符重载吗?

① Java细节:字符串的拼接
② 为什么Java不支持操作符重载?
③ JAVA语法糖“+”运算符


5. String,StringBuilder,StringBuffer三者的区别?

① String:String / StringBuffer / StringBuilder 三者的功能区别
② Java中的String,StringBuilder,StringBuffer三者的区别

猜你喜欢

转载自blog.csdn.net/summerxiachen/article/details/79417574