---------------------- android培训、java培训、期待与您交流! --------------------
Collection
├List 有序、元素可以重复,因为该集合体系有索引,在索引位置添加元素
│├ArrayList 底层的数据结构使用的是数组结构
│├LinkedList 底层使用的是链表数据结构
│└Vector 底层是数组结构,被ArrayList替代,Vector线程同步,elements枚举类型
│ └Stack
└Set 无序(存入取出的顺序不一致)、不可以重复,没有索引
└SortedSet
└TreeSet 可以对Set集合中的元素进行排序
└HashSet 底层数据结构是哈希表,HashSet是如何保证元素唯一性的呢?
是通过元素的两个方法,hashCode和equals来完成的,如果元素的HashCode值相同,才会判断equals是否为true,如果HashCode值不同,则不会调用equals方法。
HashSet判断是否相同依赖的就是hashCode()和equals()方法,区别于ArrayList,ArrayList用的只有equals方法
Map
├Hashtable
├HashMap
├SortedMap
└TreeMap
└WeakHashMap
List特有方法:
增:
add(index,element)
addAll(index.Collection)
删:
remove(index,element)
改:
set(index,element)
查:
get(index)
subList(from,to)
listInterator:Interator的子接口,功能比Interator多很多,是List特有的
LinkedList特有方法:
addFirst()
addLast()
getFirst()
getLast()//只是获取
removeFirst()
removeLast()//不光去,还会删除
Set:
HashSet:句结构式哈希表,线程是非同步的,保证元素是唯一性的原理:判断元素的
hashCde只是否相同,如果i相同,还会判断元素的equals方法是否为true
TreeSet:可以对Set集合中的顺序进行排序
TreeSet排序的第一种方式,让元素自身具备比较性,元素需要实现
comparable接口,覆盖compareTo方法
TreeSet排序的第二种方式,当元素不具备比较性,或者具备的比较性不是所
需要的时候,这时需要让容器自身具备比较性,定义了比较器,将比较器对
象作为参数传递给TreeSet集合的构造函数
HashSet:(个人理解:表中的元素的值是按照哈希表的值来判断两个值是不是相等)
HashSet 是哈希表实现。哈希表是一个特殊的数组,这个数组里存放的是链表(链表里存放的是符合条件的一组对象,条件是什么?下面会提到)。只要理解 HashSet 的 add 方法执行过程,就很容易理解 HashSet 了。
当调用了 HashSet 的 add 方法存放对象 obj , HashSet 会首先调用 obj 的 hasCode 方法得到该对象的哈希码, HashSet 会使用一个算法把它的哈希码转换成一个数组下标,该下标“标记”了 obj 的位置。如果这个位置上的链表中没有元素,那么就把 obj 对象添加到链表上。如果这个位置上的链表中已经有了元素,则遍历这个链表,调用 obj 的 equals 方法,判断 obj 是否和其中的某个元素重复,如果没有重复的元素,那么就将 obj 添加到链表上;如果有重复的元素,则不会讲 obj 对象存入 HashSet 中。
理解了 HashSet 的内部结构,我们再回头看看 equals 和 hashCode 方法。还记得那个约定吧?当我们重写了某个类的 equals 方法时,最好也重写该类的 hashCode 方法,并且应该遵守这样的约定:“如果两个对象不相等,那么它们的 hashCode 返回的整数不一定必须不等,但最好能为不相等的两个对象提供不同的 hashCode ,这样可以提高哈希表的性能。”为什么要有这样的约定?这样怎么就能提高哈希表性能了?我们用 HashSet 来作为例子分析一下(因为 HashSet 就是哈希表的实现)。如果我们写的某个类,重写了 equals 和 hashCode 方法,但写的很不好,就像约定中提到的那种情况,两个(或者多个)不相等的对象的 hashCode() 返回值相同。当我们往 HashSet 中添加这个类的对象时,HashSet 拿到 hashCode() 的返回值,分析哈希码,得到数组下标。但是由于对于不同的对象, hashCode 会有可能返回相同的哈希码,那么就会有可能,该数组下标下的链表中已经有了一个甚至多个元素。如果情况再糟糕一些,本应均匀分布在哈希表数组中的对象,分布在了几个链表中。最坏的情况是,所有对象的哈希码都相同,也就是说 hashCode 方法返回的是一个固定整数,那么哈希表就会变成了一个链表。还记得吗?链表的缺点是查询速度慢。那么 HashSet 的优势,查询速度快,已经不存在了。这就是所谓的降低了哈希表的性能。
---------------------- android培训、java培训、期待与您交流! ----------------------