Collection和collections的不区别:
Collection: 是集合框架中的一个顶层接口,它里面定义了单列集合的共性方法。它有两个常用子接口List、Set。
Collections: 是集合框架中的一个工具类。该类中的方法都是静态的。它提供的方法中有可以对List集合进行排序、二分查找等方法。
通常集合都是线程不安全的,因为要提高效率。如果要多线程使用这些集合,可以通过工具类中的同步方法,将这些线程不安
全的集合转换成安全的。
Collection集合包括List和Set集合
Collection
|---List :集合中元素是有序的,元素可以重复,该集合体系按索引进行操作。
|---ArrayList :底层是数组结构。查询速度快,但增删稍慢。线程不同步。-->可变长度数组,自动50%延长
|---LinkedList :底层是链表结构。查询稍慢, 但增删快。 线程不同步。-->可变长度数组,自动100%延长
|---Vector :底层是数组结构。线程同步,被ArrayList替代了,因为效率低。
|---Set :集合中元素是无序的(存入和取出的顺序不一定一致),元素不可重复,
|--HashSet :底层数据结构是哈希表,是线程不安全的,不同步。
(哈希表按哈希值进行存储,如果哈希值相等则判断元素是否相等,如果元素相等则哈希值进行顺延)
HashSet是如何保证元素唯一性的呢?
|--LinkedHashset
是通过元素的两个方法,hashCode和equals来完成。
如果元素的HashCode值相同,才会判断equals是否为true。
如果元素的hashCode值不同,不会调用equals。
注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashCode和equals方法。
Object的toString()方法其实调用的是:getClass().getName()+'@'+Integer.toHexString(hashCode());
|--TreeSet :可以对Set集合中的元素进行排序,
底层数据结构的二叉树。 保证元素唯一性的依据:compareTo方法return 0.
TreeSet排序的第一种方式:
让元素自身具备比较性。元素需要实现comparable接口,覆盖compareTo方法。
这种方式也成为元素的自然顺序,或者叫做默认顺序。
TreeSet的第二种排序方式:
当元素自身不具备比较性时,或者具备的比较性不是所需要的。
这时就需要让集合自身具备比较性。在集合初始化时,就有了比较方式。
实现comparator接口,compare()方法。
怎样取出set集合中的元素? 当然是通过调用iterator()使用迭代器(Iterator)
怎样取出List集合中的元素? List集合特有的迭代器。ListIterator是Iterator的子接口。
Map
Map集合的特点:该集合存储键值对,一对一对往里存,而且要保证键的唯一性。
Map
|--Hashtable:底层是哈希表数据结构,不可以存入null键,null值.该集合是同步的,JDK1.0出现的,效率低
|--HashMap:底层是哈希表数据结构。并允许使用null键和null值,该集合是不同步的,JDK1.2出现的,效率高
|--TreeMap:底层是二叉树数据结构。线程不同步。可以用于给Map集合中的键进行排序
1.HashMap: 底层是双列的哈希表,不存储重复元素,存储自定义对象时,必须覆盖HashCode和equals方法.此集合可以运行null键和null值.
2.TreeMap: 内部使用二叉树算法,可以对存入的元素进行自然顺序的排序
Map遍历集合: 1.Set<k> keySet:将map中所有的键存入到Set集合。因为set具备迭代器.
所有可以迭代方式取出所有的键。再根据get方法获取每一个键对应的值.
Map集合的取出原理:将map集合转换成set集合,通过迭代器取出.
2.Set<Map.Entry<k,v>> entrySet:将map集合中的映射关系存入到了set集合中, 而这个关系的数据类型就是Map.Entry
map→(entrySet,将map集合中的映射关系取出,这个关系就是Map.Entry类型)→Set
那么关系对象Map.Entry获取到后,就可以通过Map.Entry中的getKey和getValue方法获取关系中的键和值.
|