首页 > 编程语言 >Java开发中要避免的坑和一些代码优化技巧

Java开发中要避免的坑和一些代码优化技巧

时间:2023-02-27 11:56:08浏览次数:46  
标签:status map Java iterator list value 代码优化 中要 its

1:动态SQL遇到的坑,先看下面OGNL表达式的说明。

Any object can be used where a boolean is required. OGNL interprets objects as booleans like this:

  1. If the object is a Boolean, its value is extracted and returned;

  2. 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;

  3. If the object is a Character, its boolean value is true if and only if its char value is non-zero;

  4. 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个以上的表连接查询,那就需要选择交叉表作为基础表,交叉表就是那个被其他表引用的表。

 

标签:status,map,Java,iterator,list,value,代码优化,中要,its
From: https://www.cnblogs.com/scott1102/p/17159170.html

相关文章

  • 成都Java培训班多少钱,让我们具体了解
    成都Java培训有很多,不同机构价格也是不同的,这个价格并非是全国统一标准,所以,我们在了解的时候必然能看到有贵有便宜的,价格的浮动,根据机构的各项成本而定,比如师资团队、课程......
  • java-idea快捷输入05
    输入PSVM:publicstaticvoidmain(String[]args){} sout:publicclassHelloWord{publicstaticvoidmain(String[]args){System.out.println();......
  • Java日期工具类编写
    Java日期工具类编写将字符串转换为对应日期 Date date = simpleDateFormat.parse(string);  将日期转换为字符串String string = simpleDateFormat.format(date);......
  • JavaSE
    JavaSEJava基础篇1、解释下什么是面向对象?面向对像是一种基于面向过程的编程思想,是一种“万物皆是对象”的编程思想。任何物体都可以归为一类事物,而每个个体都是一类事......
  • 一个更适合Java初学者的轻量级开发工具:BlueJ
    Java是世界上最流行的编程语言之一,它被广泛用于从Web开发到移动应用的各种应用程序。大部分Java工程师主要是用IDEA、Eclipse为主,这两个开发工具由于有强大的能力,所以复杂......
  • java线程状态
    publicclassDemo{publicstaticvoidmain(String[]args){for(Thread.Statet:Thread.State.values()){System.out.prin......
  • java.lang.String cannot be convert to JSONObject
    java.lang.StringcannotbeconverttoJSONObject在对String转换时,使用了JSONObject,导入的包不能是org.json 应该去下载​​http://sourceforge.net/projects/json-lib......
  • 一文搞懂java日志框架
    发展历史总结标准接口实现产品JCLlog4j、julSlf4jlogbacklog4j-api(log4j2)log4j-core(log4j2)发展System.out最早最简单的打印方式,不可配置日......
  • java基础02
    强制类型转换强制转换(类型)变量名  高-----低自动转换   低-----高inti=128byteb=(byte)i//-128内存会出现溢出问题(高到低转换)doublec=i//128.0(自动......
  • java基础03
    变量类变量static PublicclassDemo08{staticdoublesalary=2500;//static从属于Demo08这个类 方便调用//属性:变量//实例变量从属于对象;如果不自动初始化 ,这......