您的位置:首页 > 编程语言 > Java开发

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仅能遍历,不能修改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: