String超大字符串的问题

在Web开发中,String字符串拼接常有的事,一般为了省事,都是使用简单的**“+”**

String str = "abc" + "123";

在Code Review会建议使用StringBuilder拼接,因为+实际会产生两个对象,然后拼接;实际编译器会做优化,内部也是使用StringBuilder,效率方面不会有太大变化,但如果是循环体呢?

String str = "123456";
for(int i = 0; i < 100; i++) {
	str = str + i;
}

这部份是会重复创建StringBuilder对象的,所以还是使用StringBuilder最好,但实际开发中,为了可读性,不必所有处理都用StringBuilder,比如单次拼接就不用。

一般遇到超大JSON字符串,业务开发都会建议分页获取,但有些情况实在需要大量返回呢?每次处理内存使用量都非常大,虽然可以使用缓存等方式,但只能解决某些情况下的问题,因而需要减轻内存压力。最近看到String.intern这种解决方式,着实非常有效。

看个案例

String a = new String("123").intern();
String b = new String("123").intern();

a == b

字符串不可变,可以认为是常量,通常字符串对象会放入常量池,而对象是会放在碓内存中,因为这种方式等于引用,如果有重复的对象即可引用,不必再次创建,节省了不少开销。

但这个内置方法,貌似仅适用Java 8以上,以下会出现没有效果,需要考究。

Show Comments