黑马程序员-集合类继承树

原创 2012年03月24日 11:04:02

---------------------- 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培训、期待与您交流! ----------------------

相关文章推荐

黑马程序员_WPF(WPF认识,Sender,C#基础加强类继承,集合,Xaml,控件通用属性)

一.WPF认识 很多教程都是WinForm,但是Windows8平板电脑,Windows Phone手机开发都是使用微软的XAML技术,WPF也是一个采用XAML的类似于WinForm的技术,学习之...

黑马程序员--java基础复习继承之抽象类与接口

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 接着昨天的继承下半部分 抽象(abstract) 抽象方法:当多个类中出现相同功能,但是功能...

黑马程序员--java基础--类的继承与接口的实现

------- android培训、java培训、期待与您交流! ----------                                                      ...

黑马程序员_day07 面向对象(继承,抽象类,接口)

---------------------- android培训、java培训 期待与您交流! ---------------------- 一:继承。 /* 将学生和工人的共性描述提取出来,单...

黑马程序员_笔记_多线程(创建线程-继承Thread类)

进程:是一个正在执行中的程序。 每一个进程执行都有一个执行顺序。该顺序是一个执行路径,或者叫一个控制单元。 线程:就是进程中的一个独立的控制单元。 线程在控制着进程的执行。 一个进程中至少有一...

黑马程序员Java基础第五章-----类的继承 多态 接口

------http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- 一.类的特性之二 ...

黑马程序员----类的继承与多态性之“多态性”

----------------------  ASP.Net+Android+IO开发S 、  .Net培训、期待与您交流! ----------------------      ...

黑马程序员————java基础————继承与多态以及抽象类和接口

----------- android培训、java培训、java学习型技术博客、期待与您交流!------------ 什么是继承呢?         我们定义了很多类(猫和...

黑马程序员--继承、抽象类、接口

黑马程序员--继承、抽象类、接口
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:黑马程序员-集合类继承树
举报原因:
原因补充:

(最多只允许输入30个字)