integer数据对比

  对于Integer var = ? 在-128至127范围内的赋值,Integer对象是在IntegerCache.cache产生,会复用已有对象,这个区间内的Integer值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象,这是一个大坑,推荐使用equals方法进行判断。

Array的subList

  ArrayList的subList结果不可强转成ArrayList,否则会抛出ClassCastException异常,即java.util.RandomAccessSubList cannot be cast to java.util.ArrayList. 说明:subList 返回的是 ArrayList 的内部类 SubList,并不是 ArrayList ,而是 ArrayList 的一个视图,对于SubList子列表的所有操作最终会反映到原列表上。

List变Array

  使用toArray带参方法,入参分配的数组空间不够大时,toArray方法内部将重新分配内存空间,并返回新数组地址;如果数组元素个数大于实际所需,下标为[ list.size() ]的数组元素将被置为null,其它数组元素保持原值,因此最好将方法入参数组大小定义与集合元素个数一致。直接使用toArray无参方法存在问题,此方法返回值只能是Object[]类,若强转其它类型数组将出现ClassCastException错误。

  正例:

1 List<String> list = new ArrayList<String>(2);
2 list.add("guan");
3 list.add("bao");
4 String[] array = new String[list.size()];
5 array = list.toArray(array);

Array变List

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

1 String[] str = new String[] { "you", "wu" };
2 List list = Arrays.asList(str);

  第一种情况:list.add("yangguanbao"); 运行时异常。

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

泛型

  泛型通配符<? extends T>来接收返回的数据,此写法的泛型集合不能使用add方法,而<? super T>不能使用get方法,作为接口调用赋值时易出错。 说明:扩展说一下PECS(Producer Extends Consumer Super)原则:第一、频繁往外读取内容的,适合用<? extends T>。第二、经常往里插入的,适合用<? super T>。

Foreach

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

  正例:

1 Iterator<String> iterator = list.iterator();
2 while (iterator.hasNext()) {
3     String item = iterator.next();
4     if (删除元素的条件) {
5         iterator.remove();
6     }
7 }

  反例:

1 List<String> list = new ArrayList<String>();
2 list.add("1");
3 list.add("2");
4 for (String item : list) {
5     if ("1".equals(item)) {
6         list.remove(item);
7     }
8 }

排序

  在JDK7版本及以上,Comparator要考虑相等情况,不然Arrays.sort,Collections.sort会报IllegalArgumentException异常,下例中没有处理相等的情况,实际使用中可能会出现异常

1 new Comparator<Student>() {
2     @Override
3     public int compare(Student o1, Student o2) {
4         return o1.getId() > o2.getId() ? 1 : -1;
5     }
6 };

遍历Map

  使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。

Map可否存null

转载于:https://www.cnblogs.com/guanghe/p/10768058.html

Java集合中的细节相关推荐

  1. Java - Java集合中的安全失败Fail Safe机制 (CopyOnWriteArrayList)

    文章目录 Pre 概述 fail-safe的容器-CopyOnWriteArrayList add remove函数 例子 缺陷 使用场景 Pre Java - Java集合中的快速失败Fail Fa ...

  2. 三十九、Java集合中的HashSet和TreeSet

    @Author:Runsen @Date:2020/6/6 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...

  3. 如何将java集合中重复的元素取出来

    今天就给大家讲一下如何将java集合中重复的元素取出来 不多废话,直接代码 此处是对集合中的数字进行查找,其他类型照样适用! List<Integer> list = new ArrayL ...

  4. Java 集合框架分析:JAVA集合中的一些边边角角的知识

    相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...

  5. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  6. Java集合中contains方法的效率对比

    Java集合中contains方法的效率对比 Java集合List.Set中均有对集合中元素是否存在的判断方法contains(Object o):Map中有对key及value是否存在的判断方法co ...

  7. java集合中的泛型的使用

    -----------------------java集合中的泛型的使用------------------------ 我们在项目中使用集合基本99%都是在集合中存储同一种数据类型.既然我们在集合中 ...

  8. 高手不得不知的Java集合List的细节

    写在前面 作为Android开发者,Java集合可能是开发中最常使用的类之一了.但很多人可能跟我一样,对Java集合只停留在"使用"的层面上,而对其的实现.原理如何只是略知一二,所 ...

  9. 考考基础部分,谈谈Java集合中HashSet的原理及常用方法

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...

最新文章

  1. git 冲突覆盖_git pull冲突解决之强制覆盖
  2. 窗口分析函数19_Mysql查询窗口函数里第一个 最后一个 第N个元素的值的案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)
  3. 4 交换机-fanout(订阅发布模式)
  4. 线面要素类相互转换-原创
  5. tmux 上滚_实践中的tmux:回滚缓冲区
  6. MongoDB中MapReduce介绍与使用
  7. 值类型和引用类型及其区别!
  8. devexpress 创建窗口句柄时出错_MATLAB函数句柄
  9. JDK动态代理运行期生成的字节码文件class,获取反编译方法
  10. nginx rwrite及增加不记录特定状态日志nginx模块
  11. Leetcode 76.最小覆盖子串
  12. 解决升级到Android Studio 3 Beta版本编译异常
  13. 软件测试思想者 - 再识王阳明
  14. python输出26个大写字母怎么读_26个大写字母怎么读?
  15. Eclipse中Folder和SourceFolder
  16. css——font 样式和对照表 颜色格式和颜色渐变
  17. Centos 7 环境下将修改后的MAC地址永久保存
  18. HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill
  19. 朋友圈被公司“无偿征用”,该怎么办?
  20. windows 8 新登陆方式(图片密码、Pin码)

热门文章

  1. Linux环境变量总结
  2. animate css3 应用的借鉴,一个同事写的JS
  3. python 核心编程第5章(习题)
  4. C# 小闹钟 v3.0
  5. 【Top1】Tudou.com首页网页设计的制作方法
  6. 64位进程调用32位dll的解决方法
  7. Python第一次周考(0402)
  8. 三星为什么要卖芯片?手机干不过华为小米,半导体好挣钱!
  9. Django——认证系统(Day72)
  10. VMware下配置固定ip,于本机进行通信。