Day04:原来早就在这里有共享经济了

今天就来谈谈字串吧。
相信以下这段程序是大家学Java第一天就会写的:

class HelloWorld{
    public static void main(String[] args){
        System.out.println("Hello World!");
    }
}

我们用Java写出了让电脑和世界打招呼的程序呢。里头的"Hello World!"就是一个字串,前几天我们有提到过,字串类别没有基本型别(primitive type)可以用,只能使用类别型别(class type)来宣告出变数装进去,可是字串本身却又是一种常量(literal)。接下来运用==的运算来说明一些观念:

int num01 = 1;
int num02 = 2;
System.out.println(num01 == num02);

以上程序肯定是印出true,没啥问题。我们接着看:

String str01 = "ithome";
String str02 = "ithome";
System.out.println(str01 == str02);

以上这段呢?应该也会是true没错吧?是的,确实是true。我们再继续来看:

String str01 = "ithome"
String strs = "ithome jworld";
System.out.println(str01 == strs.split(" ")[0]);

这个勒? strs.split(" ")[0]的结果也是"abc",那答案应该也会是true吧?很遗憾,console会印出false给你看。

(这边很适合上个成龙问号或黑人问号)

要解释这个结果,需要先讲两个概念。第一个是stack memory & heap memory的概念。
stack&heap
(字串部分的heap可能和实际有差别,这边先以这样的概念来解释)
左边stack部分的左半部可以看到我们取的变数名称,右半部就是代表变数所装进去的值。可以看到primitive type就是在stack中直接储存本身;但如果是class type像String型别的变数,储存的是一串位址值,而位址值的功用就是可以去对照出相对应的heap memory物件,再从这个物件中取用我们需要的值。
而"=="的功能,是去比较stack中存进去的值,所以str01 == str02会是true,不是因为他们都是"ithome",而是因为他们储存的位址值一样;所以如果到了下面的例子,虽然我们知道位址值对应的字串常量是一样的,但是我们比较的是位址值,所以为false。

不过我们常常讲,Java中的字串是一个特别的存在,这就要带出第二个要说的概念,字串池(string pool)。
stringPool
所以为什麽上面例子中的str01和str02是指向同一个String位址值呢?就是因为Java字串池的机制,Java会自动判断我们所输入的字串常量有没有在字串池中已经存在了,如果已存在就会直接取用相同的字串位址值给我们要指派的字串变数中;而strs.split(" ")[0]因为是阵列的关系,所以我们比较的其实是String[]第0索引的位址值,而这个位址值中存放的是"ithome"字串在字串池中的位址值。

虽说原本主题是字串,不过讲到後来比较重要的概念是stack memory和heap memory,基本型别之所以和一般类别不一样就是因为基本型别没有heap memory,我们所输入的值本身就是值;一般类别的变数储存的都会位址值,再透过这个位址值对应出实际物件储存的heap记忆体空间。


<<:  Day 17 self-attention的实作准备(三) 测试使用keras来建立模型

>>:  DAY2:离职率预测(上)

从零开始学3D游戏设计:雷射陷阱光束

这是 Roblox 从零开始系列,效果章节的第六个单元,今天你将开始学习制作光束效果 Part.1 ...

DAY4-EXCEL统计分析:计算离散型机率

机率:生活当中充满了许多的不一定,而这不一定大多伴随着机率的存在,例如:掷骰子、投球、天气、中奖、猜...

LocalDB 无法开启时,如何解决

用新版Visual studio 2019开启旧版SQL Server 2012的mdf档时,却出现...

Day 6 - Using ASHX File for User Authorization Management with ASP.NET Web Forms C# 使用泛型处理常式进行权限分流

=x= 🌵 网页操作权限分流处理及 Yacht Manager - Master Page 後台主版...

浅谈 DBA 资料库管理师的职责

DBABootcamp 资料库管理师(Database Administrator, 简称 DBA)...