A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Monkey1992 中级黑马   /  2016-3-2 22:41  /  488 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Collection常用方法:(共性方法)
方法名              功能简述
Boolean add(E e)      添加元素
boolean addAll(Collection c)    添加一堆元素
void clear()       清空容器
boolean contains(Object o)      判断容器中是否存在o
boolean remove(Object o)       移除一个特定元素
boolean removeAll(Collection c)      移除一堆元素
boolean retainAll(Collection c)         取交集
boolean isEmpty()    容器是否为空
int size()   容器中元素数
Iterator iterator()    取元素


List:
List:有序的,允许重复元素存在的集合。常用的类有ArrayList和LinkedList和Vector.
List集合判断元素是否相同,使用的是元素的equals方法。无论是包含contains还是删除remove操作其方法底层都调用了equals方法。


ArrayList:(可变数组)。
底层使用的是数组结构。特点:查询速度快,但是增加删除比较慢。线程不同步。
空参构造时默认容量大小是10。如果后期元素已满的话,会自动增加50%的容量。

LinkedList:底层使用的是链表数据结构,特点:查询慢,增加删除比较快。
  特有方法:
  addFirst();
  addLast();
  offerFirst();在此列表的开头插入指定的元素。        
  offerLast();....

  getFirst();//不再建议使用
  getLast();//不再建议使用
  peekFirst() //获取但不移除此列表的第一个元素;如果此列表为空,则返回 null。jdk1.6开始
  peekLast();//获取但不移除此列表的最后一个元素;如果此列表为空,则返回null。jdk1.6开始

  removeFirst();//获取元素,并移除该元素
  removeLast();//这两个remove不建议使用,因为当LinkList为空时,他们会抛出NoSuchElementException 异常。
  pollFirst();// 获取并移除此列表的第一个元素;如果此列表为空,则返回 null。jdk1.6开始
pollLast();// 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。jdk1.6开始

Vector: 底层也是数组数据结构。Vector是线程同步的。增加删除都很慢,在jdk1.2之后被ArrayList取代了.并很少使用,它的带有elements关键字的这些方法一般都是其特有的方法。枚举是Vector特有的取出方式,其实枚举和迭代器是一样的。它和Iterator 接口的功能是重复的。但是Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口。

Set:
元素是无序的,元素不可以重复。
Set集合取元素方法只有一种:迭代器。
Set:常用子类:HashSet和treeSet

HashSet底层数据结构是哈希表。
HashSet是如何保证数据的唯一性的呢?
答:是通过元素的两个方法,hashCode和equals方法来完成的。
    如果元素的HashCode值相同,才会判断equals是否为true。
    如果元素的hashCode值不同,不会调用equals方法。

所以我们在编写自己定义的一个类时,一般还要覆写Object的hashCode和equals方法,以防后期我们会对类的对象进行比较时会用到。
另外,判断元素是否存在contains,以及删除remove等操作,依赖的判断标准仍然是元素的hashcode和equals方法。而ArrayList判断是否存在只根据equals方法来判断的。
TreeSet:
底层的数据结构是二叉树(也叫红黑树)。TreeSet是一个有序集合,TreeSet中的元素将按照升序排列,缺省是按照自然排序进行排列,意味着TreeSet中的元素要实现Comparable接口。或者有一个自定义的比较器。所以如果我们自己定义的一个类的对象要加入到TreeSet当中,那么这个类必须要实现Comparable接口。并覆写其中的compareTo方法。



Map:
将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。
Map和Set很像,其实Set集合底层就是使用了Map集合。

HashTable:底层是哈希表结构,不可以有null的key和null的value,该集合是线程同步的。Jdk1.0 效率低。
对用户来讲它是无序的。(如果说有序,只是散列的顺序,不是顺序排列。在输出时只会按散列的顺序。
散列表是不要求顺序操作的。)

HashMap:底层是哈希表结构,并允许使用null键和null值。该集合是不同步的。Jdk1.2 效率高,无序。
TreeMap:底层是二叉树数据结构,可以排序的Map集合, 线程不同步,可以用于给map集合中的键进行排序。



Map常用共性方法:
containsKey(key k) 是否包含某个key;
remove(key k) 移除某个键值,返回该键对应的值
get(Object key) 得到某个键的值,如果不存在,则返回null。
values();  返回map所有值集合。返回类型Collection。
put(key,value)://添加元素,如果出现添加相同的键的情况,那么后添加的值将会覆盖原有的键对应的值,并且put方法会返回被覆盖的值。

Map集合的两种取出方式:
1:keySet():将map中所有的键存入到set集合,因为set具备迭代器。
所以可以用迭代方式取出所有的键,再根据Map的get方法获取每一个键对应的值。

2: Set> entrySet : 首先将map集合中的“映射关系”存入到set集合中,这个关系的数据类型就是Map.Entry。
然后利用set集合的迭代器迭代出每个Map.Entry这样的“映射关系”数据类型。再利用Map.Entry提供的getKey()和getValue()方法得到map中的键和对应的值。

Map.Entry 结构简介:

其实Entry也是一个接口,它是Map接口中的一个内部接口。关系如下:

Interface  Map
{
Public static interface Entry
{
   Public abstract Object getKey();
   Public abstract Object getValue();
}
}

Class HashMap  implements  Map
{
   class  hahs implements Map.Entry
{
    Public Object  getKey( ){ }
    Public Object  getValue( ){ }
}
}



最后再总结一下:
List和Set区别?
List和Set都是接口。List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引来访问List中的元素,这类似于Java的数组。
他们各自有自己的实现类,有无顺序的实现类,也有有顺序的实现类。
最大的不同就是List是可以重复的。而Set中元素不能重复的。另外,List除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,
返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。
实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。实现Set接口的常用类有HashSet,TreeSet等等。

Comparable和Comparator区别?
要实现对一个引用对象进行排序,我们可以使用该对象本身
Comparable & Comparator 都是用来实现集合中元素的比较和排序功能所用到的。只是 Comparable 是在集合元素内部定义的方法实现的排序,可以称为自然顺序。Comparator 是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的compare方法或在集合内实现 Comparable 接口的compareTo方法。Comparator 是一个专用的比较器,当这个实现了compareble的对象的compareTo不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。程序则以专用的比较器comparator为基准来进行比较。
总结来说:
第一种方式:
    让元素自身具备比较性。只要让元素实现Comparable接口,覆盖compareTo方法即可。
第二种方式:
如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的,这时可以让集合自身具备比较性。可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数传递给TreeSet集合构造函数。

1 个回复

倒序浏览
总结的很全面,谢谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马