Java中对String对象赋值

在学习《算法》的时候, P42中提到
赋值语句不会创建新的对象, 而只是创建另一个指向某个已经存在的对象的引用
并且,
在Java中, 所有的非原始数据类型都是对象, 包括数组

Java中原始的数据类型有: byte,short,int,long,char,float,double和boolean。

这些基本类型可以分为四组:

整数 - 包括:byte,short,int和long,用于整数有符号数字。
浮点数 - 包括float和double,表示具有分数精度的数字。
字符 - 包括字符,表示字符集中的符号,如字母和数字。
布尔(Boolean) - 此组包括布尔值,它是表示 true/false 值的特殊类型。

回到刚才的问题上, 但在练习中出现了如下代码,

// PrintString_04.java

public class PrintString_04 {
public static void main(String[] args) {
// String string1 = new String("hello");
String string1 = "hello";
String string2 = string1; // string2是string1的引用?
string2 = "world"; // 修改string2, string1为何不发生改变?
StdOut.println(string1);
StdOut.println(string2);
}
}

/*
String string1 = "hello";
String string2 = string1; // string2确实是指向string1的引用
string2 = "world"; // 创建新的对象"wolrd", 此时string2指向新对象的引用
*/

Java中的String对象不可变, 对对象赋值是指向等号右边对象的引用, 但对String对象赋值时, 等号右边的双引号中的字符串, 实际上是新创建了一个对象, 指向了新对象的引用。

主要困惑我的地方,一开始没看清楚String和42页左下角Counter对象在赋值时候的区别。

Counter c1 = new Counter("ones");
c1.increment();
Counter c2 = c1;
c2.increment();
StdOut.println(c1);

那段代码的第三行,

Count c2 = c1;   // c1是不是创建新的对象的,c2指向的就是c1的地址


string2 = "world";  // 看似差不多, 实际上"world"是个新对象, string2指向新对象

目前, 因为String的不变性, 我暂时把String理解成和原始数据类型一样来操作, 就可以了.

ref:
https://blog.csdn.net/ilvest/article/details/64904520
https://blog.csdn.net/zhangjg_blog/article/details/18319521