集合学习完了,觉得思路还是比较重要的,花些时间自己总结了一下,现在感觉清晰多了。
集合总结
集合框架构造:
collection<interface>(iterator)
|-------------List(可重复,有顺序)
|-------ArrayList (有角标(数组结构),查询快,增删慢,线程不同步)
|-------LinkedList (链表结构,查询慢,增删快,线程不同步)
|-------Vector(线程同步,被ArrayList替代)
|-------------Set(不可重复,无顺序)
|-------TreeSet(自定义比较器,使元素具备比较功能)
|-------HashSet(哈希表结构,自定义重复用HashCode和equals方法.)
|----LinkedHashSet(存储元素有序)
|-------------Map<interface>(存储键值对,保证键的唯一性)
|-------HashTable<class>(哈希表结构,不可以存空值,线程同步效率低)
|-------TreeMap(底层二叉树,可以排序
|-------HashMap(哈希表结构,HashCode与equals定义元素唯一性,键值可以为空)
说明:
collection是接口,set,list是collection的子接口,arraylist,linkedlist,vector是实现了list接口的类。
与collection对立的是map,用于存储键值对,不允许有重复的key,但允许有重复的value。
Collection接口介绍:
Collection:集合的共性内容都在该接口中。
添加:add(obj);
删除:remove(obj);
判断:contains(obj);isEmpty();
个数:size();
清空:clear();
集合转成数组:toArray();
取出:Iterator iterator();
迭代器:是取出集合中元素的方式,该方式的具体取出方法定义是由子实现的。因为每一个子类集合数据结构不一样,
所以取出的具体实现也不同,但是都符合这个迭代器接口规则。因为每一个子类集合作为一个事物被描述,
而取出方式通过一个方法不足以描述,所以使用了对象,而该对象属于描述容器时内容的一个事物,
所以可以通过内部类来完成取出方式的描述,只要对外提供可以获取该内部类对象的方法即可。
该方法是:iterator();迭代器取代了枚举接口。因为后者的名称过长,不方便书写。
迭代器中常用的方法:hasNext(),next();
集合的作用:
当我们要对一组对象,或都数据进行统一的操作时,为了减少代码量的编写和实现逻辑的统一,这时我们就要以采用集合对象了.
选用子类对象:
首选把下边的子类对象分为三大类:
list:元素是有序的,元素可以重复,因为该集合体系有索引
set:元素是无序的(存入和取出的顺序不一定一致),不可以重复
map:该集合存储键值对,一对一往里存,而且要保证键的唯一性。
当明确了这三个要求后就可以把范围转到这三个接口的其中一个了,接下来我们再来看三个接口下的子类:
List:
ArrayList:底层的数据结构使用的是数组结构(查询快,增删慢,不同步)
LinkedList:底层使用的是链表结构(增删快,查询慢)
Vector:底层是数组数据结构(和ArrayList功能一样,是同步的)(使用时注意他有一个elements()返回个Enumeration对象此对象可以像iterator那样迭代输出元素)
Set:
HashSet:底层数据结构是哈希表(HashCode())线程非同步的
HashSet是如何保证元素唯一性,是通过元素的HashCode值相同,才会判断equals是否为true,如果元素的,hashcode值不同,不会调用equals()
TreeSet:可以对Set集合中的元素进行排序底层数据结构是二叉树,保证元素唯一性的依据:compareTo方法Comparable类
TreeSet排序的第一种方式,让元素自身具备比较性元素需要实现Comparable接口,覆盖compareTo方法
第二种方式:当元素自身不具备比较性时,或者具备的比较性不是所需要的这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式,
定义比较器,传给集合对象的构造器Comparator--?>compare()
建议使用比较器。
TreeSet集合是怎样保证元素唯一性的?
通过return 0,来保证元素唯一性。
另:如果需求是:保证元素唯一性,并有频繁的增删操作。该如何完成呢?
方法:定义一个LinkedList集合,定义一个功能专门取出LinkedList中的重复元素。
但相对麻烦,使用面向对象的思想,先找对象,没有,则自己创建对象。
在Set集合体系中有一个HashSet子类LinkedHashSet,在Set集合中融入了链表数据结构,即可解决该需求。
set和list的对比:
set检索元素效率低下,删除和插入效率高,插入和删除不会引起元素位置改变,无序所存对角唯一,不可以重复存放,
list和数组类似,list可以动态增长,查找元素效率高,插入删除元素效率低,因为会引起其他元素位置改变,有序可以重复存放。
Map:该集合存储键值对,一对一往里存,而且要保证键的唯一性。
Hashtable:底层是哈希表数据结构,不可以存入null键null值,(该集合是线程同步的-效率低)
HashMap:底层是哈希表数据结构,可以允许使用null键null值(该集合是不同步的-效率高)
TreeMap:底层是二叉树数据结构,线程不同步,可以用于给map集合中的键进行排序(排序)
集合使用技巧:
需要唯一吗?
需要:Set
需要制定顺序:
需要: TreeSet
不需要:HashSet
但是想要一个和存储一致的顺序(有序):LinkedHashSet
不需要:List
需要频繁增删吗?
需要:LinkedList
不需要:ArrayList
如何记录每一个容器的结构和所属体系呢?
看名字!
List
|--ArrayList
|--LinkedList
Set
|--HashSet
|--TreeSet
后缀名就是该集合所属的体系。
前缀名就是该集合的数据结构。
看到array:就要想到数组,就要想到查询快,有角标.
看到link:就要想到链表,就要想到增删快,就要想要 add get remove+frist last的方法
看到hash:就要想到哈希表,就要想到唯一性,就要想到元素需要覆盖hashcode方法和equals方法。
看到tree:就要想到二叉树,就要想要排序,就要想到两个接口Comparable,Comparator 。
而且通常这些常用的集合容器都是不同步的。
Collections (工具类)
Collections是针对集合类的一个帮助类。提供了一系列静态方法实现对各种集合的搜索、排序、线程完全化等操作。
相当于对Array进行类似操作的类——Arrays。
如,Collections.max(Collection coll); 取coll中最大的元素。
Collections.sort(List list); 对list中元素排序
HashSet通常优于TreeSet(插入、查找)。只有当需要产生一个经过排序的序列,才用TreeSet。
TreeSet存在的唯一理由:能够维护其内元素的排序状态。
HashMap用于快速查找。
当元素个数固定,用Array,因为Array效率是最高的。
Collection和Collections的区别?
Collection是集合框架的顶层接口,它里面定义了集合对象的共性方法。它下面两个常用的子类是:list set
Collections是集合框架的工具类,里面的方法都是静态的,是对集合操作的工具方法。
比如它提供了将非同步集合转成同步集合的方法,对list排序,对集合进行二分查找。
本文深入讲解Java集合框架的构成及特点,包括List、Set、Map等接口的不同实现类及其应用场景,帮助读者理解集合间的差异并选择合适的集合类型。
3296

被折叠的 条评论
为什么被折叠?



