Java优化集合代码的一些方法

    xiaoxiao2026-03-11  10

    我们平常在开发中都会用到很多的集合类,但是在使用的时候会有很多自己都不怎么注意的小习惯会影响一些效率,这次就介绍一下优化集合代码的一些小方法;

    分离循环中被重复调用的代码

    假设我们要循环一个数组,最简单的方法如下:

    for (String value : strings) { // Do something useful here } 当每次代码运行到这个循环时,如果 strings 变量是一个  Iterable  的话,代码将会自动创建一个 Iterator  的实例。如果使用的是  ArrayList  的话,虚拟机会自动在堆上为对象分配3个整数类型大小的内存。

    private class Itr implements Iterator<E> { int cursor; int lastRet = -1; int expectedModCount = modCount; // ...所以一般建议使用等价循环的方式

    for(int i=0;i<strings.length;i++){ }这里;i<strings.length每次都会去调用,并且每次都返回相同的数值,分离所有类型的代码对提升循环性能有积极的意义,因此可以改写成

    int count=strings.length; for(int i=0;i<count;i++){ }

    使用entrySet()

    当我们遍历一个键值对的Map时,最简单的方法如下

    for (K key : map.keySet()) { V value : map.get(key); }最高效的方法应该如下

    for (Entry<K, V> entry : map.entrySet()) { K key = entry.getKey(); V value = entry.getValue(); }在我们的集合中应该谨慎的使用Map,如果必须要使用的话最好使用entrySet() 去迭代!这样的话,我们要访问的就仅仅是Map.Entry的实例。

    使用Enum

    如果一个需要映射键值对的集合,在最开始的时候我们就知道了,里面的大小和要存储的数据,我们可以使用Enum来存储。

    为了更好的支持枚举类型,java.util中添加了两个新类:EnumMap和EnumSet。使用它们可以更高效的操作枚举类型。

    EnumMap是专门为枚举类型量身定做的Map实现。虽然使用其它的Map实现(如HashMap)也能完成枚举类型实例到值得映射,但是使用EnumMap会更加高效:它只能接收同一枚举类型的实例作为键值,并且由于枚举类型实例的数量相对固定并且有限,所以EnumMap使用数组来存放与枚举类型对应的值。这使得EnumMap的效率非常高。

    提示:EnumMap在内部使用枚举类型的ordinal()得到当前实例的声明次序,并使用这个次序维护枚举类型实例对应值在数组的位置。

    在增加访问速度的压力下,EnumMap 会获得比 HashMap 更加杰出的表现。原因在于 EnumMap 使用的堆内存比 HashMap 要少 一位(bit),而且 HashMap 要在每个键值上都要调用 hashCode() 方法和 equals() 方法。

    重写 hasCode()方法和equals()方法

    最简单的hasCode方法为

    @Override public int hashCode() { // [#1938] 与标准的QueryParts相比,这是一个更加高效的hashCode()实现 return id.hashCode(); }我们甚至不需要去重写其他属性,因为在一个表中,主键大都为唯一的。根据主键我们可以确定其唯一性。而且ID如果是一个字符串的话, 本身早就已经缓存了一个 hashCode() 值。

    但是这样做不太符合标准,我们来看看IDE给我们生成的方法

    @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((qcGuid == null) ? 0 : qcGuid.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ActQcDetailPO other = (ActQcDetailPO) obj; if (qcGuid == null) { if (other.qcGuid != null) return false; } else if (!qcGuid.equals(other.qcGuid)) return false; return true; }这里我的主键叫做qcGuid,表面叫做ActQcDetailPO;这里prime为31是因为31是第11位质数,1231,1237是第202,203位质数.Boolean的文档里写到:true的时候hasCode返回1231,false的时候返回1237,质数在进行Xor,乘法等运算的时候很少重复.;

    总结:好了,暂时就这些优化集合代码的一些方法,以后如果知道了,还会更新这篇文章的。

    转载请注明原文地址: https://ju.6miu.com/read-1307837.html
    最新回复(0)