java中的字符串是我们经常使用的,对于其创建的字符串对象往往很让人疑惑,下面做几点关键性说明:
1. 首先我们要明确String final类,即创建的对象为最终态,即不能被修改。所以说String是一个常量,一旦创建,其值是不能被改变的。然后java中有一个字符串缓冲池(String pool)。当使用“+”拼接时会产生一个新的String对象,而不是向原有的对象追加内容。
2. 创建字符串的两种方法(本人自己的叫法):
1)字面赋值的方式: 如 String s = "aa";这样也是创建了一个对象。
2)常规对象创建方式: 如 String s = new String("aa");
3.java中有一个字符串缓冲池(String pool),位于栈中。
1)当通过字面赋值的方式创建String对象 s 时,会检查字符串缓冲池中是否有"aa"对像存在,如果有,则不创建新的对象,而是将已经存在的"aa"的对象的引用指向s。如果没有,则创建一个新的内容为"aa"的对象,并将其引用指向s。
2)当通过常规对象创建方式创建对象s时,首先也会检查String pool中是否有"aa"对象存在,如果有,这直接在堆中再创建一个内容为"aa"的对象,并将其引用指向s,即 String s = new String("aa");只创建了一个对象,但实际是有两个内容为"aa"的对象。如果String pool中没有该对象"aa",那么会先在String pool中创建一个对象,并且之后会再次在堆(heap)中创建一个内容相同的对象并将其引用赋给s,即创建了两个引用不同的对象。所以,这种方式可能会创建一个或两个对象,但最终是存在两个内容相同引用不同的对象。