Java开发中要避免的坑和一些代码优化技巧
1:动态SQL遇到的坑,先看下面OGNL表达式的说明。
Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:
If the object is a Boolean, its value is extracted and returned;
If the object is a Number, its double-precision floating-point value is compared with zero; non-zero is treated as true, zero as false;
If the object is a Character, its boolean value is true if and only if its char value is non-zero;
Otherwise, its boolean value is true if and only if it is non-null.
如果对象是一个Number类型,值为0时将被解析为false,否则为true,浮点型0.00也是如此。OGNL对于boolean的定义和JavaScript有点像,即'' == 0 == false。这也就不难理解<if test="status != null and status !=''">and status = #{status}</if>当status=0时出现的问题了,显然0!=''是不成立的,导致表达式的值为false。
将表达式修改为<if test="status != null">and status = #{status}</if>该问题便迎刃而解。该问题的根源还是来自编码的不规范,只有String类型才需要判断是否!='',其他类型完全没有这个必要,可能是开发人员为了省事直接复制上一行拿过来改一改或是所使用的MyBatis生成工具不严谨导致该问题的发生。
这里有必要再提一个“坑”,如果你有类似于String str ="A"; <if test="str!= null and str == 'A'">这样的写法时,你要小心了。因为单引号内如果为单个字符时,OGNL将会识别为Java 中的 char类型,显然String 类型与char类型做==运算会返回false,从而导致表达式不成立。解决方法很简单,修改为<if test='str!= null and str == "A"'>即可。
2:集合中移除某些无用的数据的操作。
//正确写法
List<Stu1> list = new ArrayList<>();
list.add(new Stu1("zhangsan", 21));
list.add(new Stu1("lisi", 22));
list.add(new Stu1("zhangsan", 26));
Iterator<Stu1> iterator = list.iterator();
while (iterator.hasNext()) {
Stu1 stu1 = iterator.next();
if (stu1.getName().equals("zhangsan1")) {
iterator.remove();
}
}
//错误写法,用foreach循环遍历集合,我就不写了.这样可能会报异常的。
// 开发中移除集合中的元素的时候,用Iterator来遍历集合。
3:字符串变量和字符串常量equals的时候将字符串常量写在前面
String str = "123" ;
if(str.equals("123")){ }
// 建议修改为这样主要是可以避免空指针异常。
String str = "123" ;
if("123".equals(str)){ }
4:HashMap用对象作为key的时候重新equal和hashCode,如果不重写hashcode方法get的结果将为null。
如下图是怎样重写equal和hashCode的方法。
注意:平常用对象判断是否相同的时候,一般也会重写这个对象的equal和hashCode的方法,一般的开发工具也都有重写这两个方法的快捷键。
5:用最有效的方式来遍历map集合
如下,数据量大的时候用Iterator遍历map的效率较高:
Map<String, String> hm = new HashMap<>();
hm.put("1", "aa");
hm.put("2", "bb");
Set<Map.Entry<String, String>> entries = hm.entrySet();
Iterator<Map.Entry<String, String>> iterator = entries.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> map = iterator.next();
System.out.println("key值" + map.getKey());
System.out.println("value值" + map.getValue());
}
6:Oracle查询优化:
选择最有效率的表名顺序:ORACLE的解析器按照从右到左顺序处理from字句中的表名,from字句中写在最后的表(基础表)将最先被处理,在from字句中包含多个表的情况下,必须选择记录数最少的表作为基础表,如果有3个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表就是那个被其他表引用的表。
Java开发中要避免的坑和一些代码优化技巧的更多相关文章
- Java 开发中如何正确踩坑
为什么说一个好的员工能顶 100 个普通员工 我们的做法是,要用最好的人.我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好.你要找到最好的人,一个好的工程师不是顶10个,是顶 ...
- Java开发中碰到的Map的坑
这属于我在开发中碰过的坑 ,容器中存放者对象,当clear()的时候,出现的奇葩问题.好了,直接看代码: package com.DataType.yinyong; import java.util. ...
- 编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则)
编写高质量代码:改善Java程序的151个建议(第一章:JAVA开发中通用的方法和准则) 目录 建议1: 不要在常量和变量中出现易混淆的字母 建议2: 莫让常量蜕变成变量 建议3: 三元操作符的类型务 ...
- 记一次SpringBoot 开发中所遇到的坑和解决方法
记一次SpringBoot 开发中所遇到的坑和解决方法 mybatis返回Integer为0,自动转型出现空指针异常 当我们使用Integer去接受数据库中表的数据,如果返回的数据中为0,那么Inte ...
- paip.java 开发中web server的选择jboss resin tomcat比较..
paip.java 开发中web server的选择jboss resin tomcat比较.. 作者Attilax 艾龙, EMAIL:1466519819@qq.com 来源:attilax的专 ...
- Java开发中常见的危险信号(中)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- Java开发中文件读取方式总结
JAVA开发中,免不了要读文件操作,读取文件,首先就需要获取文件的路径. 路径分为绝对路径和相对路径. 在文件系统中,绝对路径都是以盘符开始的,例如C:\abc\1.txt. 什么是相对路径呢?相对路 ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- Java开发中常见的危险信号(上)
本文来源于我在InfoQ中文站原创的文章,原文地址是:http://www.infoq.com/cn/news/2013/12/common-red-flags-in-java-1 Dustin Ma ...
- 完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络]
完整java开发中JDBC连接数据库代码和步骤[申明:来源于网络] 地址:http://blog.csdn.net/qq_35101189/article/details/53729720?ref=m ...
随机推荐
- CentOS Linux 的安装
CentOS Linux 的安装 作者:Grey 原文地址: 博客园:CentOS Linux 的安装 CSDN:CentOS Linux 的安装 说明 本安装说明是基于 Windows 10 下 V ...
- this关键字在JAVA和JS中的异同
this在JS中的用法 由于js中this 是在运行期进行绑定的,所以js中的 this 可以是全局对象.当前对象或者任意对象,这完全取决于函数的调用方式.JavaScript 中函数的调用有以下几种 ...
- 组策略编辑器(gpedit.msc)找不到文件解决方法
打开[此电脑]中的C盘,依次打开Windows-system32-gpedit.msc,或者输入:C:\Windows\System32\gpedit.msc,查看是否存在gpedit.msc文件(没 ...
- Python 为什么如此设计?
大概两年半前,我萌生了要创作一个新的系列文章的想法,也就是"Python为什么",试图对 Python 的语法及特性提出"为什么"式的问题,以此加深对它的理解, ...
- Jmeter 之bzm- Concurrency Thread Group 压测
bzm- Concurrency Thread Group 并发线程组代替 jp@gc - Stepping Thread Group线程组. 1. 下载jmeter-plugins-manage ...
- overflow:scroll修改样式
当overflow :scroll 出现滚动条后,默认的滚动条样式太丑了,不是我们想要的,那么我们来修改一下吧!~ 话不多说,直接上代码 /* 定义滚动条样式 */ ::-webkit-scroll ...
- [python] 圆形嵌套图Circular Packing
圆形嵌套图Circular Packing 文章目录 圆形嵌套图Circular Packing 1 具有一级层次的圆形嵌套图绘制 1.1 绘图数据与circlify计算 1.2 图形绘制 1.2.1 ...
- [python]《Python编程快速上手:让繁琐工作自动化》学习笔记1
1. 模式匹配与正则表达式笔记(第7章)(代码下载) 正则表达式,又称规则表达式.(英语:Regular Expression,在代码中常简写为regex.regexp或RE),计算机科学的一个概念. ...
- Vue双向绑定原理梳理
简介 vue数据双向绑定主要是指:数据变化更新视图,视图变化更新数据. 实现方式:数据劫持 结合 发布者-订阅者 模式. 数据劫持通过 Object.defineProperty()方法. 对对象的劫 ...
- Maui 读取外部文件显示到Blazor中
Maui 读取外部文件显示到Blazor中 首先在maui blazor中无法直接读取外部文件显示 ,但是可以通过base64去显示 但是由于base64太长可能影响界面卡顿 这个时候我们可以使用bl ...