千锋教育-做有情怀、有良心、有品质的IT职业教育机构

位置:首页 > 行业动态

上海java培训:Java网页版 开发手册 – 集合处理

时间:2017-12-21 16:52:52  |  来源:千锋教育上海校区  |  作者:千锋  

  上海千锋教育上海JAVA培训影响力培训机构之一,本为是上海千锋小编整理的Java网页版开发手册之集合处理,如果对java开发感兴趣的同学,可以点击下载千锋java视频教程,下载地址:http://video.mobiletrain.org/java/。千锋java视频教程由千锋数十位java讲师呕心沥血录制的精品教程,java入门到精通,这一套视频足矣。

  正文开始:

  1. 【强制】关于 hashCode 和 equals 的处理,遵循如下规则:

  1) 只要重写 equals ,就必须重写 hashCode 。

  2) 因为 Set 存储的是不重复的对象,依据 hashCode 和 equals 进行判断,所以 Set 存储的对象必须重写这两个方法。

  3) 如果自定义对象做为 Map 的键,那么必须重写 hashCode 和 equals 。

  说明: String 重写了 hashCode 和 equals 方法,所以我们可以非常愉快地使用 String 对象作为 key 来使用。

  2. 【强制】 ArrayList 的 subList 结果不可强转成 ArrayList ,否则会抛出 ClassCastException

  异常: java . util . RandomAccessSubList cannot be cast to java . util . ArrayList ;

  说明: subList 返回的是 ArrayList 的内部类 SubList ,并不是 ArrayList ,而是ArrayList 的一个视图,对于 SubList 子列表的所有操作终会反映到原列表上。

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

  4. 【强制】使用集合转数组的方法,必须使用集合的 toArray(T[] array) ,传入的是类型完全一样的数组,大小就是 list . size() 。

  说明:使用 toArray 带参方法,入参分配的数组空间不够大时, toArray 方法内部将重新分配内存空间,并返回新数组地址 ; 如果数组元素大于实际所需,下标为 [ list . size() ] 的数组元素将被置为 null ,其它数组元素保持原值,因此好将方法入参数组大小定义与集合元素个数一致。

  正例:

  List list = new ArrayList(2);

  list.add(“guan”);

  list.add(“bao”);

  String[] array = new String[list.size()];

  array = list.toArray(array);

  反例:直接使用 toArray 无参方法存在问题,此方法返回值只能是 Object[] 类,若强转其它类型数组将出现 ClassCastException 错误。

  5. 【强制】使用工具类 Arrays . asList() 把数组转换成集合时,不能使用其修改集合相关的方法,它的 add / remove / clear 方法会抛出 UnsupportedOperationException 异常。

  说明: asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。 Arrays . asList体现的是适配器模式,只是转换接口,后台的数据仍是数组。

  String[] str = new String[] { “a”, “b” };

  List list = Arrays.asList(str);

  种情况: list.add(“c”); 运行时异常。

  第二种情况: str[0] = “gujin”; 那么 list.get(0) 也会随之修改。

  6. 【强制】泛型通配符来接收返回的数据,此写法的泛型集合不能使用 add 方法,而 不能使用 get 方法,做为接口调用赋值时易出错。

  说明:扩展说一下 PECS(Producer Extends Consumer Super) 原则:1)频繁往外读取内容的,适合用上界 Extends 。2)经常往里插入的,适合用下界 Super 。

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

  正例:

  Iterator it = a.iterator();

  while (it.hasNext()) {

  String temp = it.next();

  if (删除元素的条件) {

  it.remove();

  }

  }

  反例:

  List a = new ArrayList();

  a.add(“1″);

  a.add(“2″);

  for (String temp : a) {

  if (“1″.equals(temp)) {

  a.remove(temp);

  }

  }

  说明:以上代码的执行结果肯定会出乎大家的意料,那么试一下把“1”换成“2”,会是同样的结果吗?

  8. 【强制】 在 JDK 7 版本及以上, 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 比较结果相同。

  反例:下例中没有处理相等的情况,实际使用中可能会出现异常:

  new Comparator() {

  @Override

  public int compare(Student o1, Student o2) {

  return o1.getId() > o2.getId() ? 1 : -1;

  }

  };

  9. 【推荐】集合初始化时,指定集合初始值大小。

  说明: HashMap 使用 HashMap(int initialCapacity) 初始化,

  正例: initialCapacity = (需要存储的元素个数 / 负载因子) + 1。注意负载因子(即loaderfactor)默认为 0.75, 如果暂时无法确定初始值大小,请设置为 16。

  反例: HashMap 需要放置 1024 个元素,由于没有设置容量初始大小,随着元素不断增加,容量 7 次被迫扩大, resize 需要重建 hash 表,严重影响性能。

  10. 【推荐】使用 entrySet 遍历 Map 类集合 KV ,而不是 keySet 方式进行遍历。

  说明: keySet 其实是遍历了 2 次,一次是转为 Iterator 对象,另一次是从 hashMap 中取出key 所对应的 value 。而 entrySet 只是遍历了一次就把 key 和 value 都放到了 entry 中,效率高。如果是 JDK 8,使用 Mapforeach 方法。

  正例: values() 返回的是 V 值集合,是一个 list 集合对象 ;keySet() 返回的是 K 值集合,是一个 Set 集合对象 ;entrySet() 返回的是 K – V 值组合集合。

  11. 【推荐】高度注意 Map 类集合 K / V 能不能存储 null 值的情况,如下表格:集合类 集合类 Key Value Super 说明 说明

  Hashtable 不允许为 null 不允许为 null Dictionary 线程安全

  ConcurrentHashMap 不允许为 null 不允许为 null AbstractMap 分段锁技术

  TreeMap 不允许为 null 允许为 null AbstractMap 线程不安全

  HashMap 允许为 null 允许为 null AbstractMap 线程不安全

  反例: 由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储 null 值时会抛出 NPE 异常。

  12. 【参考】合理利用好集合的有序性 (sort) 和稳定性 (order) ,避免集合的无序性 (unsort) 和不稳定性 (unorder) 带来的负面影响。

  说明:有序性是指遍历的结果是按某种比较规则依次排列的。稳定性指集合每次遍历的元素次序是一定的。如: ArrayList 是 order / unsort;HashMap 是 unorder / unsort;TreeSet 是order / sort 。

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

上一篇:选择好的上海VR培训机构,这家很靠谱
下一篇:千锋上海培训五个月打造Python精英人才

课程咨询

  • 北京天丰利校区(总部):北京市海淀区宝盛北里西区28号天丰利商城4层
    北京沙河校区:北京市昌平区沙阳路18号北京科技职业技术广场服务楼2层、南区服务楼2层
    咨询电话:400-654-7778 010-82790226/7-801
    面授课程:Android培训、HTML5培训、UI交互设计培训、PHP培训、JavaEE培训、大数据开发培
                     训、VR/AR混合现实培训、iOS培训、好程序员
  • 深圳西部硅谷校区:深圳市宝安区宝安大道5010号深圳西部硅谷A区B座605-619
    深圳大学城校区:深圳市南山区留仙大道1201号大学城创客小镇16栋2楼、3楼
    咨询电话:0755-33582485-801(硅谷校区)0755-86660670-801(大学城校区)
    面授课程:Android培训、HTML5培训、UI交互设计培训、PHP培训、JavaEE培训、iOS培训
  • 上海地址:上海市宝山区同济支路199号智慧七立方3号楼2-4层
    咨询电话:400-627-7899 021-56166283/56166279
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训、好程序员
  • 郑州地址:郑州市金水区纬五路21号河南教育综合楼(经纬中学楼)6/7/8层
    咨询电话:0371-55191750 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训
  • 广州地址:广州市天河区元岗路310号智汇park创意园E座5层
    咨询电话:020-22119207 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 大连地址:辽宁省大连市甘井子区软件园路2号东软信息B8座2层
    咨询电话:0411-39026086 400-654-7778
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 武汉地址:武汉市江夏区藏龙岛杨桥湖大道15号拓创大厦15楼
    咨询电话:027-81772047
    面授课程:Android课程培训、HTML5课程培训、JavaEE培训、iOS课程培训
  • 成都地址:成都市武侯区科华北路62号力宝大厦N(北楼)18楼
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、JavaEE培训、iOS课程培训
  • 校区地址:西安市雁塔区高新六路52号立人科技C座西区4楼
    咨询电话:029-85260160 029-85261030 029-85260960
    面授课程:Java课程培训、Android课程培训、HTML5课程培训、JavaEE培训
  • 杭州地址:浙江省杭州市江干区九堡旺田书画城A座4层
    咨询电话:0571-86893632 010-82790226-801
    面授课程:Android课程培训、HTML5课程培训、iOS课程培训
  • 青岛校区地址:青岛市市南区金坛路17号青岛职业技术南校区实训楼A4层
    咨询电话:0532-80910752/3 010-82790226-801
    面授课程:Android课程培训、HTML5课程培训、UI交互设计培训、iOS课程培训
  • 了解千锋动态
    关注千锋教育服务号

  • 扫码关注千锋互联
    身边的移动开发导师