1.+号慎用
1.1 日志打印我们以前都用错了
原始:
LOGGER.info("解析json SQL内容:jdbcUrl:"+jdbcUrl+"\t username:"+username+"\t password:"+password+"\t tableName:"+tableName+"\r\n");
事故:
最容易造成
java.lang.OutOfMemoryError: Java heap space error
原因:
1. 寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.
2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中。)
3. 堆:存放所有new出来的对象。
4. 静态域:存放静态成员(static定义的)
5. 常量池:存放字符串常量和基本类型常量(public static final)。
6. 非RAM存储:硬盘等永久存储空间
上面一条打印语句,一共生成了9个String对象(每个双引号之间,每个变量,因为字符串每次相加都会生成一个新的对象,String类型是不可变的对象)栈中存储9个字符串引用,堆中存储了9个字符串数据。当我们打印的比较多的时候,会造成异常。
改进
采用占位符{}
或者$
LOGGER.info("解析json SQL内容:jdbcUrl:{},username:{},password:{},ableName:{} \r\n",jdbcUrl,username,password,tableName);
这样的话,前面双引号内的事一个字符串,后面是4个,一共才5个,减少了4个。
1.2 字符串相加
String sql = "SELECT count("+r.getFieldName()+") from user WHERE "+r.getFieldName()+"=\"\" ";
超过5个以上,必须用StringBuilder