java的一些小知识

来源:互联网 发布:linux nginx 全局变量 编辑:程序博客网 时间:2024/05/21 00:18
(1)StringBuffer和StringBuilder的区别
          StringBuffer和StringBuilder主要区别在于StringBuffer类的方法是线程安全的,而StringBuilder的方法不是线程安全的,相比而言,StringBuilder会略微快一点。开发中一般都是字符串缓冲区被单个线程使用,因此使用StringBuilder一般会得到性能的提升。
 
(2)为什么不使用字符串相加?
      从java 6之后,编译器“始终”把字符串的+连结编译成StringBuilder,然后toString()返回。没有嵌入循环里的字符串相加效率和直接使用StringBuilder相差不大,但是遇到循环相加,将会在循环内创建StringBuilder,将造成很大的内存开销,也会伴随着很多的开辟和销毁内存的操作,效能大打折扣。因此这种情况一定要自己在循环外部手工定义StringBuilder而不能依赖编译器了,因此一般还是建议采用手动StringBuilder来操作,如果只是单行的字符串拼接,可以考虑采用”+”操作,或者在确定字符串个数的情况下,可以将它们放在一个数组中,并调用String.Concat进行连接,也是不错的选择。
  
(3)为什么不拼sql
  动态拼接sql容易造成sql注入的问题,比如验证用户登录拼的sql为select COUNT(*) from Users where Password = 'a' and UserName = 'b' 这个时候如果用户在前台页面把输入用户名字为'b' or 1=1--类似的东西,如果后台没做输入校验的话,那么这个sql返回的就是非0了。 
  而且考虑到共享sql的问题,采用绑定变量的形式一般可以提高执行效率。


(4)关于InitializingBean


 InitializingBean接口是spring为bean提供了初始化方法的一种方式,它只包括afterPropertiesSet方法,凡是继承该接口的类,必须实现这个方法,在初始化bean的时候会执行该方法。一份示例afterPropertiesSet的实现如下:


public void afterPropertiesSet() throws Exception {


        Assert.notNull(destDataUpdateDao, "destDataUpdateDao must not be null");


        Assert.notNull(destImageDao, "destImageDao must not be null");


}

  可以使得这些DAO在工程启动阶段就能判断非空。

  Spring 还提供了一种在配置文件中通过init-method指定方法的方式来实现bean的初始化。

  这两种方式是可以同时使用的,如果同时使用了,将会是先调用afterPropertiesSet方法,再用反射机制去调用init-method指定的方法,因此相对来说afterPropertiesSet方法的效率会高一些。同时使用的时候,如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。




0 0
原创粉丝点击