Java集合中的细节
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集合中的细节相关推荐
- Java - Java集合中的安全失败Fail Safe机制 (CopyOnWriteArrayList)
文章目录 Pre 概述 fail-safe的容器-CopyOnWriteArrayList add remove函数 例子 缺陷 使用场景 Pre Java - Java集合中的快速失败Fail Fa ...
- 三十九、Java集合中的HashSet和TreeSet
@Author:Runsen @Date:2020/6/6 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- 如何将java集合中重复的元素取出来
今天就给大家讲一下如何将java集合中重复的元素取出来 不多废话,直接代码 此处是对集合中的数字进行查找,其他类型照样适用! List<Integer> list = new ArrayL ...
- Java 集合框架分析:JAVA集合中的一些边边角角的知识
相关文章: Java 集合框架分析:Set http://blog.csdn.net/youyou1543724847/article/details/52733723 Java 集合框架分析:Lin ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- Java集合中contains方法的效率对比
Java集合中contains方法的效率对比 Java集合List.Set中均有对集合中元素是否存在的判断方法contains(Object o):Map中有对key及value是否存在的判断方法co ...
- java集合中的泛型的使用
-----------------------java集合中的泛型的使用------------------------ 我们在项目中使用集合基本99%都是在集合中存储同一种数据类型.既然我们在集合中 ...
- 高手不得不知的Java集合List的细节
写在前面 作为Android开发者,Java集合可能是开发中最常使用的类之一了.但很多人可能跟我一样,对Java集合只停留在"使用"的层面上,而对其的实现.原理如何只是略知一二,所 ...
- 考考基础部分,谈谈Java集合中HashSet的原理及常用方法
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:工匠初心 cnblogs.com/LiaHon/p/1125 ...
最新文章
- git 冲突覆盖_git pull冲突解决之强制覆盖
- 窗口分析函数19_Mysql查询窗口函数里第一个 最后一个 第N个元素的值的案例详解(FIRST_VALUE LAST_VALUE NVH_VALUE)
- 4 交换机-fanout(订阅发布模式)
- 线面要素类相互转换-原创
- tmux 上滚_实践中的tmux:回滚缓冲区
- MongoDB中MapReduce介绍与使用
- 值类型和引用类型及其区别!
- devexpress 创建窗口句柄时出错_MATLAB函数句柄
- JDK动态代理运行期生成的字节码文件class,获取反编译方法
- nginx rwrite及增加不记录特定状态日志nginx模块
- Leetcode 76.最小覆盖子串
- 解决升级到Android Studio 3 Beta版本编译异常
- 软件测试思想者 - 再识王阳明
- python输出26个大写字母怎么读_26个大写字母怎么读?
- Eclipse中Folder和SourceFolder
- css——font 样式和对照表 颜色格式和颜色渐变
- Centos 7 环境下将修改后的MAC地址永久保存
- HDU 4069 Squiggly Sudoku Dancing-Links(DLX)+Floodfill
- 朋友圈被公司“无偿征用”,该怎么办?
- windows 8 新登陆方式(图片密码、Pin码)