代码优化小技巧

1. 定义配置文件信息

有时候我们为了统一管理会把一些变量放到 yml 配置文件中;而不是到处设置“魔数”,一旦那天需要修改,只需要修改配置文件即可,不需要满项目去搜索替换;

  • 例如

 

 用 @ConfigurationProperties 代替 @Value

使用方法

定义对应字段的实体

 

 使用时注入这个bean

 2. 用@RequiredArgsConstructor代替@Autowired

我们都知道注入一个 bean 有三种方式哦(set 注入构造器注入注解注入),Spring 推荐我们使用构造器的方式注入 Bean

我们来看看上段代码编译完之后的样子

 

 @RequiredArgsConstructor 注解由lombok提供

3.代码模块化

阿里巴巴 Java 开发手册中说到每个方法的代码不要超过 50 行(我没记错的话),在实际的开发中我们要善于拆分自己的接口或方法, 做到一个方法只处理一种逻辑, 说不定以后某个功能就用到了, 拿来即用。 

4. 抛异常而不是返回

在写业务代码的时候,经常会根据不同的结果返回不同的信息,尽量减少返回,会显得代码比较乱

反例

 正例

5. 减少不必要的db

尽可能的减少对数据库的查询

 举例子

删除一个服务(已下架或未上架的才能删除),之前有看别人写的代码,会先根据id查询该记录,然后做一些判断

反例

 正例

6. 不要返回 null

避免调用方法时,造成不必要的空指针

反例

 正例

7. if else

不要太多了if else if,可以试试策略模式代替

8. 减少controller业务代码

业务代码尽量放到service层进行处理,后期维护起来也好操作而且美观

反例

 

 正例

9. 利用好IDEA

目前为止市面上的企业基本都用idea作为开发工具了吧

举一个小例子

IDEA会对我们的代码进行判断,提出合理的建议

例如:

 它推荐我们用lanbda的形式代替,点击replace

10. 阅读源码

一定要养成阅读源码的好习惯包括优秀的开源项目GitHub上stars:>1000, 会从中学好好多知识包括其对代码的设计思想以及高级API,面试加分(好多面试官习惯问源码相关的知识)

11. 设计模式

23种设计模式,要尝试代码中运用设计模式思想,写出的代码即规范又美观还高大上。

12. 拥抱新知识

像我们这种工作年限少的程序员,我觉得要多学习自己认知之外的知识,不能每天crud,有机会就多用用有点难度的知识,没有机会(项目较传统),可以自己下班多些相关demo练习

13. 基础问题

Map遍历

 optional 判空

 递归

大数据量的递归时,避免在递归方法里new对象,可以试试把对象当作方法参数进行传递使用

注释

类 接口方法 注解 较复杂的方法 注释都要写而且要写清楚, 有时候写注释不是给别人看的 而是给自己看的

14. 判断元素是否存在

hashSet 而不是 list,list 判断一个元素是否存在的代码

 由此可见其复杂度为On,而hashSet底层采用hashMap作为数据结构进行存储,元素都放到map的key(即链表中)

复制代码
        List<Long> searchAttrIds = attrService.selectSearchAttrIds(attrIds);
        //转为Set,使用set的contains进行匹配性能更好
        Set<Long> idSet = new HashSet<>(searchAttrIds);
        List<SkuEsModel.Attrs> attrsList = baseAttrs.stream().filter(item -> {
            return idSet.contains(item.getAttrId());
        }).map(item -> {
            SkuEsModel.Attrs attrs1 = new SkuEsModel.Attrs();
            BeanUtils.copyProperties(item, attrs1);
            return attrs1;
        }).collect(Collectors.toList());
复制代码

 由此可见其复杂度为O1。

15.乘法和除法使用移位操作

例如:

for (val = 0; val < 100000; val += 5)
{
 a = val * 8;
 b = val / 2;
}

用移位操作可以极大地提高性能,因为在计算机底层,对位的操作是最方便、最快的,因此建议修改为:

 
for (val = 0; val < 100000; val += 5)
{
 a = val << 3;
 b = val >> 1;
}
  • 左移运算也相当于做乘法运算,乘积因子为 2^k。例如,我们执行149 << 4,相当于执行了 149*16 = 2384。
  • 右移运算也相当于做除法运算,被除数为 2^k。例如,我们执行149 >> 4,相当于执行了 149/16 = 9。

移位操作虽然快,但是可能会使代码不太好理解,因此最好加上相应的注释。

16.循环内不要不断创建对象引用

例如:

for (int i = 1; i <= count; i++)
{
 Object obj = new Object();
}

这种做法会导致内存中有count份Object对象引用存在,count很大的话,就耗费内存了,建议为改为:

Object obj = null;
for (int i = 0; i <= count; i++) { 
 obj = new Object(); 
}

这样的话,内存中只有一份Object对象引用,每次new Object()的时候,Object对象引用指向不同的Object罢了,但是内存中只有一份,这样就大大节省了内存空间了。

17.基于效率和类型检查的考虑,应该尽可能使用array,无法确定数组大小时才使用ArrayList

18.尽量使用HashMap、ArrayList、StringBuilder,除非线程安全需要,否则不推荐使用Hashtable、Vector、StringBuffer,后三者由于使用同步机制而导致了性能开销

19.不要将数组声明为public static final

因为这毫无意义,这样只是定义了引用为static final,数组的内容还是可以随意改变的,将数组声明为public更是一个安全漏洞,这意味着这个数组可以被外部类所改变。

20.尽量在合适的场合使用单例

使用单例可以减轻加载的负担、缩短加载的时间、提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面:

  • 控制资源的使用,通过线程同步来控制资源的并发访问

  • 控制实例的产生,以达到节约资源的目的

  • 控制数据的共享,在不建立直接关联的条件下,让多个不相关的进程或线程之间实现通信

 21.使用最有效率的方式去遍历Map

遍历Map的方式有很多,通常场景下我们需要的是遍历Map中的Key和Value,那么推荐使用的、效率最高的方式是:

复制代码
public static void main(String[] args)
{
 HashMap<String, String> hm = new HashMap<String, String>();
 hm.put("111", "222");
 
 Set<Map.Entry<String, String>> entrySet = hm.entrySet();
 Iterator<Map.Entry<String, String>> iter = entrySet.iterator(); 
 
 while (iter.hasNext()){
  Map.Entry<String, String> entry = iter.next();
  System.out.println(entry.getKey() + "\t" + entry.getValue());
 }
}
复制代码

如果你只是想遍历一下这个Map的key值,那用”Set keySet = hm.keySet();”会比较合适一些

22.字符串变量和字符串常量equals的时候将字符串常量写在前面

这是一个比较常见的小技巧了,如果有以下代码:

String str = "123";
if (str.equals("123")) {...}

// 建议修改为:String str = "123";
if ("123".equals(str))
{
 ...
}

这么做主要是可以避免空指针异常

posted @   佳沃  阅读(27)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示