阿里巴巴Java开发手册之集合处理

  1. 关于hashCode和equals的处理,遵循如下规则:
    只要重写equals,就必须重写hashCode。
    因为Set存储的是不重复的对象,依据hashCode和equals进行判断,所以Set存储的对象必须重写这两个方法。
    如果自定义的对象作为Map的键,那么必须重写hashCode和equals。

  2. ArrayList的subList结果不可强转成ArrayList,否者会抛出ClassCastException异常。subList的用法:https://blog.csdn.net/qq_37745636/article/details/100555732

  3. 在subList场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生ConcurrentModificationException异常。

  4. 使用集合转数组的方法,必须使用集合的toArray,传入的是类型完全一样的数组,大小就是list.size();直接使用toArray无参方法存在问题。此方法返回值只能是Object类

    List list = new ArrayList();
    list.add(“guan”);
    list.add(“bao”);
    String[] array = new String[list.size()];
    array = list.toArray(array);
    for (String str : array) {
    System.out.println(str);
    }

  5. 在使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的add/remove/clear方法会抛出UnsupportedOperationException异常,asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法。Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。

  6. 泛型通配符<? extends T>用来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,因为其作为接口调用赋值时易出错。第一,频繁往外读取内容的,适用<? extends T>;第二,经常往里插入的,适合用<? super T>。

  7. 不要在foreach循环里进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

    正解:
    public static void main(String[] args) {
    List list = new ArrayList<>();
    list.add(“a”);
    list.add(“b”);
    list.add(“c”);
    Iterator iterator = list.iterator();
    while(iterator.hasNext()) {
    String item = iterator.next();
    if(“a”.equals(item)) {
    iterator.remove();
    }
    }
    for (String string : list) {
    System.out.println(string);
    }
    }

  8. 在JDK7及其以上版本中,Comparator要满足如下三个条件,不然Arrays.sort,Collections.sort会报IllegalArgumentException异常。三个条件如下。
    1)x,y的比较结果和y,x的比较结果相反
    2)x>y,y>z,则x>z
    3)x=y,则x,z比较结果和y,z比较结果相同。

  9. 在集合初始化时,指定集合初始值大小。如果无法确定初始值大小,请设置为16

  10. . 使用entrySet遍历Map类集合K/V,而不是用keySet方式遍历

  11. 利用Set元素唯一的特性,可以快速的对一个集合进行去重复操作,避免使用List的contains方法进行遍历、对比、去重操作。

List<String> list = new ArrayList<>();
		
list.add("a");
list.add("b");
list.add("c");
list.add("a");

Set<String> set = new HashSet<>();
set.addAll(list);
for (String string : set) {
	System.out.println(string);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值