一,简介
每个存放lua字符串的变量,实际上存放的并不是一份字符串的数据副本,而是这份字符串数据的引用。在这个理念下,每当新创建一个字符串时,首先都会去检查当前系统中是否已经有一份相同的字符串数据了。如果存在的话就直接使用,将引用指向这个已经存在的字符串数据,否则就重新创建一份新的字符串数据。因此,字符串在lua中是一个不可变的数据,改变一个字符串变量的数据并不影响原来字符串的数据。
二,举一列例子
a = "1"
a = a.."2"
第一行代码创建了一个变量啊,只想字符串"1",而在第二行代码中,我么使用..字符串连接字符,将变量a后面连接了字符串"2"。第二行代码对变量a的重新修改,并没有影响第一行代码的字符串"1"。换言之,此时系统中存在两个字符串:"1"和"2"。
而前面生成的字符串"1",如果其他地方没有引用用它的话,将在GC阶段北回收。
三,原因
缺陷------在创建一个新的字符串时,首先会先查系统中是否有相同的数据,只有不在的情况下才创建,这与直接创建字符串相比,多了一次查找过程。好在lua实现中,查找一个字符串的操作小号并不大。
主要有一下几点:
1.在lua虚拟机中存在一个全局的数据区,用来存放系统中的所有字符串。
2.同一个字符串数据,在lua虚拟机中之可能有一份副本,一个字符串一旦创建,将是不可变的。
3.变量存放的仅是字符串的引用,而不是实际内容。
四,优化
有了以上的认知,不难理解在lua中,应该尽量少的使用字符串连接操作符,因为每一次都会生成一个新的字符串。我们应该使用table来模拟字符串缓冲区,避免了大量使用连接操作符。