Java知识总结

1 file.separator,文件路径分隔符
  path.separator,路径
  line.separator,换行
  不同的操作系统不一样。

2 多线程编程尽量不要引用全局静态变量,尽量用局部变量解决。
  如果引用全局静态变量,则应该保证多线程之间有synchronized限制。

3 重写变成了重载。
  如:要创建自己的类做键值,需要对equals()和hashCode()两个方法进行重写。
      不小心参数类型写错,导致容器中的对象无法取出。

4 单实例类中的类属性其实也是一个全局变量,在多线程使用时,需要注意会话、 
  事务相关的变量不能作为单实例类的类属性存在。
  全局变量保存在ServletContext中,会话变量保存在ServletSession中,
  事务相关变量保存在ServletRequest中。

5 不要对捕获的异常再对其进行一般流程处理,可能导致程序再次出现异常。
  异常要进行细分处理;
  常量与变量比较时尽量将常量统一放到左边。

6 使用字符串比较时,
  ==是用来判断两个变量是否物理上相等;equeals()方法是用来判断两个变量是否逻辑上相等。

7 对于端口,文件句柄,套接字句柄等非内存资源的操作,
  在使用完后在程序中要进行关闭,以释放所占的资源,JVM的GC不会清除这些。

8 出现多次操作数据库后发现数据库异常,重启后问题不在重现。
  注意在数据库操作、IO操作在使用结束后要close()的对象必须在try-catch-finally的finally中close()。

9 编写代码不仅要考虑正常情况下的检测,最好也考虑异常情况下的检测。

10 进行大规模sql语句的批量操作时,创建的PreparedStatement对象,在使用addBatch(String sql)方法将sql命令
添加到命令列表中,调用executeBatch()方法将sql命令逐一执行。一定要注意命令列表中的sql语句的数量是否会内存溢出,最后
还要调用clearBatch()方法清空命令列表中的sql语句。

11 Java中对象的引用调用,在循环体内每循环一次定义一个对象与在循环体外定义一个对象而在循环体内不定义对象是完全不一样的。

12 不允许方法局部变量和类变量重名,杜绝错误发生。

13 当一个对象保存了一些公共信息时,这些信息在其它多个地方需要修改,则应采用对象clone()来传递这个clone过的对象。这样不会发生对象内存的共享。注意浅拷贝(影子克隆)与深拷贝(深度克隆)区别。

14 尽量对容器判断为null或者size()==0情况,防止抛出异常情况。

15 尽量对接口调用中输入参数的合法性校验。

16 建立文件通道的流在打开了要关闭。获得源文件和目标文件的通道getChannel(), 然后transferTo(..)传输数据。

17 子类继承父类时尽量不要覆盖父类的属性。

18 尽量明确的使用new声明对象,不要依赖于Java的自动转换基本数据类型,比如Integer.valueOf(i)会重新生成一个Integer对象,所以对象之间的比较应该用equals而不用==。

19 HttpSession会话的超时时间的两种方法,如果同时设置以较小的为准。

20 较长生命周期对象使用时注意内存泄漏问题。

21 大对象存储到数据库中的两种方法:
   一是通过jdbc,此时数据库相应字段必须是Long Row类型。二是如果数据库用Blob类型,就必须用Oracle自己的方法。

22 文件锁FileLock  Java进程级锁

23 采用数据库连接池技术节省连接数据库的时间,尽量减少与数据库连接次数,采用批量提交或存储过程可提高执行效率。使用Jdbc时尽可能使用PreparedStatment,它具有预编译功能,性能比Statement好。

24 new Date()场景:游览器时间,web服务器时间,发布EJB的时间,数据库SysDate时间。

25 当客户端不支持Cookie时,要对页面链接使用encodeRedirectURL("URL")方法对URL进行重写,输入参数一定要是完整的URL地址,否则会在正确的URL中间加上jsession=xxxxx造成无法解析请求。

26 尽量少在try区中发出对return的呼唤。注意finally是否会改变函数返回的值。

27 如果分隔符在字符串末尾,不论末尾分隔符的个数,split方法也是忽略掉。

28 Filter的执行过程按照web.xml的配置顺序来的。设置字符集的Filter尽量在其它的
Filter前面,字符编码和解码之间有其它操作可能会导致乱码出现。

29 wait(long timeout)方法等待的时间并不精确。

30 同步会导致并发请求串行处理,影响程序性能。

31 在精度要求较高的计算中就采用BigDecimal运算。

32 如果是常量连接用"+"保存在String中快,如果是字符串变量或者变量和常量无规律的连接,则用StringBuffer

33 Vector,ArrayList的toArray()方法都是依赖System.arraycopy()实现,效率比通过循环遍历Vector和
ArralyList来生成数组要高很多,因为System.arraycopy()是一个本地方法,它可以不通过JVM来操作内存,
因此它的执行速度较快。

34 对查询数组结果进行分析时,不仅是否为null,还应该增加判断是否为0。

35 自定义的异常尽量是Exception的子类而不能是RuntimeException的子类,外层应该捕获内层方法中可能抛出的运行时异常,避免异常扩散导致线程挂起。

36 jre虚拟内存设置Java_opts环境变量。注意Excel的行数限制,在导入文件时对大数据量进行分页处理。

37 在main()方法之前,先装载类,后按顺序初始化。

38 字符串中包含中文时,String.length()和String.getBytes().length的结果是不同的。

39 多个事务不要对同一张表进行操作,容易锁表;需要前一个事务提交后再创建一个新的事务或者放在同一个事务中进行处理。

40 对java中的对象操作前做是否为空的判断,否则容易引发NullPointException。

41 如果把资源文件放到Jar中一定要注意访问方式,要通过生成一个URL来访问它;但更方便的方法是通过类装载器来获得定位资源,如getClass().getResouce()的访问,这样无论资源文件是否在Jar包中,程序都可以正常访问资源。

42 多线程访问共享资源时,一定要使用信号量和等待唤醒机制。

43 先唤醒后等待情况出现,要引入控制变量的方法保证了跳出等待循环之前条件已被满足。

44 尽量保持服务端和客户端的字符集的一致,在必要时进行编解码转换。

45 Java通过Runtime.getRuntime.exec()运行外部命令抛出异常,要检查使用的流是否都关闭了。

46 System.currentTimeMillis()的精度在不同的操作系统会有所不同,按照中断频率在18.2--100Hz计算,
中断最快也就是100Hz左右(每秒钟100次,间隔为10ms)。所以精度小于10ms的系统则不能满足。

47 使用正则表达式不能区分后面多余的分隔符,会忽略掉后面的分隔符。

48 对于标签、资源型的内容,尽量放到Resource类或Property文件中定义,修改资源内容,不会影响其引用类,维护方便。

49 补丁中修改了内部类,不要丢失内部类的.class文件。

50 大数据量查询在前台显示时,要使用数据库分页,而不是Web服务器分页(一次查询所有记录然后在内存中分页)。
进行一定量的压力测试检测性能目标。

51 对系统中调用比较昂贵(调用频繁、性能影响较大)资源,需要考虑采取缓存的机制将这些资源缓存起来

你可能感兴趣的:(java,多线程,sql,正则表达式,Excel)