今天在用android studio 2.0的时候碰到个奇怪问题:
我用StringBuilder生成一个字符串,但是用studio自带的代码检测程序优化代码时,缺把StringBuilder改成了String型“+”连接。
这是什么原因呢?不是StringBuilder应该比“+”性能更好吗?
这是自动替换后的
String sb = "CREATE TABLE IF NOT EXISTS " + appContext.getString(R.string.tbl_name) + "(_id INTEGER PRIMARY KEY AUTOINCREMENT" + ",account VARCHAR" + ",psw VARCHAR" + ",memo TEXT)";
这是我之前写的
StringBuilder sb = new Stringbuilder(); sb.append(xxxx) . . . db.execSql(sb.toString());
생각해 보면 scort가 말한 내용이 이해가 됩니다. 컴파일러는 컴파일 단계에서 문자열 상수의 + 연결을 최적화해야 하므로 StringBuilder가 필요하지 않습니다.
컴파일러는 내부적으로 커넥터를 최적화합니다. 상수인 경우 상수 풀을 통해 직접 연결됩니다.
상수가 아닌 경우 대부분의 경우 내부적으로 다음과 같이 최적화됩니다. new StringBuilder().append() 및 마지막으로 toString()이 호출됩니다(적어도 jdk1.7에서는).
StringBuilder 개체의 내용은 수정할 수 있으며 이는 메모리 사용량 측면에서 String 클래스보다 좋습니다.
재할당은 실제로 두 개의 개체가 생성되면 수정할 수 없습니다.
따라서 실제 사용 시 삽입, 삭제 등 문자열을 자주 수정해야 하는 경우에는 StringBuilder를 사용하는 것이 더 적합합니다.
그리고 에디터 체커는 사양일 뿐 반드시 최고는 아닙니다.
이것은 컴파일러의 최적화입니다. 즉, 여러 줄의 연결이 있으면 최적화되지 않습니다.