在Lua中每个不同的字符串在内存中都只有一份引用,这其实和C#一样,字符串其实本身是不可变的,当操作字符串的时候并没有改变字符串本身,而是改变了对字符串的引用。如果字符串没有收到其他任何引用的话则会被GC回收。
既然我们要获得不同字符串的引用,那么必然地Lua就需要在一个地方存放字符串。Lua在实现当中大量使用了散列桶,Lua通过这样的方式内化字符串之后可以很快地进行字符串比较等操作,而且内存中每种字符串只会存在一份,在内存优化上也比较有优势。


全局状态机中存放了 stringtable:

当分配一个字符串的时候,首先会算出字符串的散列值作为索引值,如果strt中没有该索引则新建散列桶,如果已经有元素则将这几个同样索引的字符串用链表串起来。
首先判断是否已经存在相同的字符串,如果有就直接返回: