JAVA中集合框架基础解析
2015-12-24 23:26
239 查看
【集合框架】
接口Map和Collection在层次结构没有任何亲缘关系,它们是截然不同的。Collection 下有list,queue,set。
【List】
1、关于List中的retainAll去交集的方法
2、集合跟数组一样,里面存储的都是地址。
3、List迭代器中有一个ListIterator,方法很全面。因为Iterator只能删除,不能增、修改。
ArrayList 底层是数组结构,特点:查询快,增删慢。数组初始10,按照(旧容量*3)/2+1。线程不同步
vetor 底层是数组结构,线程同步初始10,增加100% 。线程同步
LinkedList 底层使用的链表数据结构,特点相反。线程不安全
注意:List list = new ArrayList(); 10-16-25-38 List list = new ArrayList(4); 4-7-11-17-26
ArrayList内部机制实际上使用的Object数组,当容量不够的时候就创建更大的数组将老数组拷贝过去。JVM会自动进行垃圾收集 老数组,也OK了。
LinkedList不安全处理方案:LinkedList全部换成ConcurrentLinkedQueue或者
List<String> linkedList = Collections.synchronizedList(new LinkedList<String>())
对于不同的情况区分对待,即便在处理线程问题时,也会因为底层数据结构,设计实现的不同,导致性能有较大差异。在保证线程安全时,对于性能测试分析,可参看源码。
4、HashSet 底层的数据结构是哈希表。无序,不重复。线程是非同步的。
HashSet是如何保证元素唯一性?是通过元素的两个方法:hashCode和equals来完成。
如果元素的hashcode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
5、TreeSet。可以对Set集合中的元素进行排序(自然顺序即ascii) 元素实现比较器,集合实现比较器
因为TreeSet默认会为对象进行自然排序(对象没有继承Comparable),如果直接往TreeSet里面添加多个自定义对象,那么 TreeSet不知道如何排序,会报错。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法return 0。与hashcode无关,它走的是二叉树,通过比较得出元素是否相等,相等的话就不能存了。
当元素自身不具备比较时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。自定义比较器中,如果比较两个元素相等,就是return 0 那么第二个元素也无法存进去
当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法。
6、Map
HashTable: 底层是哈希表结构,不可以存入Null键和Null值。线程同步
HashMap: 底层是哈希表数据结构,允许使用Null键和Null值,不同步。替代前者
TreeMap: 底层是二叉树数据结构。不同步。可以用于给map中的key排序
注意:HashMap存元素时,key一样,后者覆盖前者
TreeMap存放元素时,原理跟TreeSet一样,会按着key的自然排序进行。
Collection <String> coll = map.values();
Map集合的两种取值方式
Set<K> keySet:将map中所有的键存入Set集合然后迭代。
Set<Map.Entry<k,v>> entrySet:将map集合的映射关系存入到set集合中。而这个关系的
数据类型就是Map.Entry
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部借口。
interface Map
{
public static interface Entry
{
public abstract Object getKey();
public abstract Object getValue();
}
}
7、Collections:集合工具类。
Collections.sort(List); -- 自然排序
Collections.sort(List, new MyComparator()); -- 自定义比较器排序
Collections.binarySearch() -- 存入的元素必须要有比较性
Collections.reverseOrder(Comparator<T> cmp) 返回一个比较器,它强行逆转指定比较器的顺序。
8、Arrays:用于操作数组的工具类。里面都是静态方法。
Arrays.asList 数组变集合 Collection.toArray 集合变数组。这些方法参考API
9、可变参数。public void show(int... arr) ——> public void show(int[] arr) show(1,2,3)
其实就是一种数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。
隐式将这些参数封装成了数组。
使用时注意:可变参数一定要定义在参数列表的最后面
10、迭代器:
高级for循环,对集合进行遍历,只能获取集合元素,但是不能对集合进行操作
迭代器处理遍历,还可以进行remove集合元素的动作
如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作
Iterator it = al.iterator()
while(it.hasNext())
it.next();
取完对象后,it还在内存中。这个引用指向对象,引用在,对象也在。
用完了,这个迭代器还在内存中。
for(Iterator it = al.iterator();it.hasNext();)
it.next();
这个用完之后,it就释放了。
1.Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
接口Map和Collection在层次结构没有任何亲缘关系,它们是截然不同的。Collection 下有list,queue,set。
【List】
1、关于List中的retainAll去交集的方法
2、集合跟数组一样,里面存储的都是地址。
3、List迭代器中有一个ListIterator,方法很全面。因为Iterator只能删除,不能增、修改。
ArrayList 底层是数组结构,特点:查询快,增删慢。数组初始10,按照(旧容量*3)/2+1。线程不同步
vetor 底层是数组结构,线程同步初始10,增加100% 。线程同步
LinkedList 底层使用的链表数据结构,特点相反。线程不安全
注意:List list = new ArrayList(); 10-16-25-38 List list = new ArrayList(4); 4-7-11-17-26
ArrayList内部机制实际上使用的Object数组,当容量不够的时候就创建更大的数组将老数组拷贝过去。JVM会自动进行垃圾收集 老数组,也OK了。
LinkedList不安全处理方案:LinkedList全部换成ConcurrentLinkedQueue或者
List<String> linkedList = Collections.synchronizedList(new LinkedList<String>())
对于不同的情况区分对待,即便在处理线程问题时,也会因为底层数据结构,设计实现的不同,导致性能有较大差异。在保证线程安全时,对于性能测试分析,可参看源码。
4、HashSet 底层的数据结构是哈希表。无序,不重复。线程是非同步的。
HashSet是如何保证元素唯一性?是通过元素的两个方法:hashCode和equals来完成。
如果元素的hashcode值相同,才会判断equals是否为true。
如果元素的hashcode值不同,不会调用equals
对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法
5、TreeSet。可以对Set集合中的元素进行排序(自然顺序即ascii) 元素实现比较器,集合实现比较器
因为TreeSet默认会为对象进行自然排序(对象没有继承Comparable),如果直接往TreeSet里面添加多个自定义对象,那么 TreeSet不知道如何排序,会报错。
底层数据结构是二叉树。
保证元素唯一性的依据:compareTo方法return 0。与hashcode无关,它走的是二叉树,通过比较得出元素是否相等,相等的话就不能存了。
当元素自身不具备比较时,或者具备的比较性不是所需要的。这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。自定义比较器中,如果比较两个元素相等,就是return 0 那么第二个元素也无法存进去
当两种排序都存在时,以比较器为主。定义一个类,实现Comparator接口,覆盖compare方法。
6、Map
HashTable: 底层是哈希表结构,不可以存入Null键和Null值。线程同步
HashMap: 底层是哈希表数据结构,允许使用Null键和Null值,不同步。替代前者
TreeMap: 底层是二叉树数据结构。不同步。可以用于给map中的key排序
注意:HashMap存元素时,key一样,后者覆盖前者
TreeMap存放元素时,原理跟TreeSet一样,会按着key的自然排序进行。
Collection <String> coll = map.values();
Map集合的两种取值方式
Set<K> keySet:将map中所有的键存入Set集合然后迭代。
Set<Map.Entry<k,v>> entrySet:将map集合的映射关系存入到set集合中。而这个关系的
数据类型就是Map.Entry
Map.Entry 其实Entry也是一个接口,它是Map接口中的一个内部借口。
interface Map
{
public static interface Entry
{
public abstract Object getKey();
public abstract Object getValue();
}
}
7、Collections:集合工具类。
Collections.sort(List); -- 自然排序
Collections.sort(List, new MyComparator()); -- 自定义比较器排序
Collections.binarySearch() -- 存入的元素必须要有比较性
Collections.reverseOrder(Comparator<T> cmp) 返回一个比较器,它强行逆转指定比较器的顺序。
8、Arrays:用于操作数组的工具类。里面都是静态方法。
Arrays.asList 数组变集合 Collection.toArray 集合变数组。这些方法参考API
9、可变参数。public void show(int... arr) ——> public void show(int[] arr) show(1,2,3)
其实就是一种数组参数的简写形式。不用每一次都手动的建立数组对象。只要将要操作的元素作为参数传递即可。
隐式将这些参数封装成了数组。
使用时注意:可变参数一定要定义在参数列表的最后面
10、迭代器:
高级for循环,对集合进行遍历,只能获取集合元素,但是不能对集合进行操作
迭代器处理遍历,还可以进行remove集合元素的动作
如果是用ListIterator,还可以在遍历过程中对集合进行增删改查的动作
Iterator it = al.iterator()
while(it.hasNext())
it.next();
取完对象后,it还在内存中。这个引用指向对象,引用在,对象也在。
用完了,这个迭代器还在内存中。
for(Iterator it = al.iterator();it.hasNext();)
it.next();
这个用完之后,it就释放了。
1.Iterator可以应用于所有的集合,Set、List和Map和这些集合的子类型。而ListIterator只能用于List及其子类型。
2.ListIterator有add方法,可以向List中添加对象,而Iterator不能。
3.ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator不可以。
4.ListIterator可以定位当前索引的位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
5.都可实现删除操作,但是ListIterator可以实现对象的修改,set()方法可以实现。Iterator仅能遍历,不能修改。
相关文章推荐
- java 应用程序及java安装1603问题
- java创建线程的两种方式
- Java学习笔记: 线程
- eclipse常用快捷键总结
- Java中异常的细节
- Java并发框架Executor
- java zipoutputstream 的使用
- Java数字图像处理基础知识
- Java快速排序原理理解
- 模拟收音机播放音乐
- Java [Leetcode 169]Majority Element
- java enum(枚举)使用详解 + 总结
- struts2
- Java Unicode 编码互转
- Java API —— 异常
- 基于Spring Boot构建的Spring MVC快速入门
- Intellij idea 配置JDK
- Java NIO1:I/O模型概述
- java线程池使用
- 从头认识java-14.4 Java提供的数组的实用功能(2)