java集合
集合
集合类存放的都是对象的引用,而非对象本身,出于表达上的便利,我们称集合中的对象就是指集合中对象的引用(reference)。
什么是集合框架?
集合框架是不同数据结构的容器类在不断向上抽取的过程中所构成的一套容器体系,这些容器满足了在不同需求下数据存储的不同特性。
数组也能装多个元素,为什么还要使用集合框架?
由于数组长度和类型是固定的,所以光使用数组已经很难满足实际开发需求了,我们存储多个数据的容器往往是容积可变的,有时候存储的对象类型也会不同
2.知识剖析
集合框架
Java集合框架中常用的集合类有哪些?
1.List接口下:ArrayList,LinkedList
2.Set接口下:HashSet、TreeSet
3、Map接口下:HashMap、TreeMap
集合框架顶层(根)接口:Collection
collection是集合框架的顶层接口,集成了一些集合的共性方法;添加、删除、修改、查询、判断等
1.添加:boolean add(Object obj):添加元素;booleanaddAll(Collectioncoll):添加给定集合到当前集合
2.删除:boolean remove(object obj):删除元素;void clear();清空集合
3.判断:boolean contains(object obj):是否包含指定元素;booleanisEmpty():判断集合中是否有元素。
4.获取:int size():获取元素个数;Iterator iterator():取出元素的方式:迭代器。
5.其他:Object[] toArray():将集合转成数组。
根接口下的子接口及实现类
List(列表)接口:有序,元素都有索引(角标),元素可以重复
1、ArrayList:基于数组实现(长度可变),不同步,针对性查改的速度快
2、Vector:和ArrayList基本相同,但是是同步的,现已被弃用
3、LinkedList:基于双向链表实现,不同步,随机增删的速度很快
Set接口,无序,元素不可重复
1、HashSet:基于哈希表实现,不同步
2、TreeSet:基于二叉树实现,不同步,自然排序,定制排序
Map(成对元素)接口,key唯一,value随意
1、HashMap:哈希表结构;Key唯一;不同步;允许null作为键,值。hashCode()、equals()确定唯一
2、TreeMap:二叉树结构;Key唯一;可排序;不同步但高效;允许null作为键,null作为值。
3.常见问题
1、每个容器实现类的数据结构都有区别,为什么他们都能调用iterator()方法拿到属于自己的迭代器对象?
2、Set集合如何保证对象的唯一性
3、开发中通常都有这样一个共识,使用到Map集合的时候,如果没有对元素进行排序的需求,使用HashMap?
4.解决方案
1、因为Collection接口下所有实现类的内部类都实现了Iterator接口,并返回实现后的迭代器对象
2、在加入元素时,先用hash算法算出元素的hashCode,如果hashCode值不同,再调用元素的equals方法比较容器中是否有相同元素,如果返回false,则表明没有重复元素,将该元素的hashCode存入哈希表(数组结构)对应位置中,如果返回true,就不会存入该元素;如果出现hashCode值相同,equals返回false的情况,会发生hash冲突,集合的性能会降低。
3、使用hash表可以在知道key的情况下快速定位到对象的具体位置,查询的效率比数组更高。
5.编码实战
6.扩展思考
7.参考文献
https://blog.youkuaiyun.com/qiuych3/article/details/51334753
8.更多讨论
今天的分享就到这里啦,欢迎大家提问和探讨!
q:set集合为什么要复写hashcode和equals
a:set集合语速是不重复的,判断元素重复发,需要对比hashcode和equals。
q:集合和数组转换
a:java封装对数组和ArryList的相互转换api
q:集合map一些使用场景
a:map是键值对,可以根据键来查询对应值,遍历map使用iterator。