Collection常用方法:(共性方法)
方法名
Boolean add(E e)
boolean addAll(Collection c)
void clear()
boolean contains(Object 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:底层使用的是链表数据结构,特点:查询慢,增加删除比较快。
pollLast();// 获取并移除此列表的最后一个元素;如果此列表为空,则返回 null。jdk1.6开始
Vector: 底层也是数组数据结构。Vector是线程同步的。增加删除都很慢,在jdk1.2之后被ArrayList取代了.并很少使用,它的带有elements关键字的这些方法一般都是其特有的方法。枚举是Vector特有的取出方式,其实枚举和迭代器是一样的。它和Iterator 接口的功能是重复的。但是Iterator 接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用 Iterator 接口。
Set:
元素是无序的,元素不可以重复。
Set集合取元素方法只有一种:迭代器。
Set:常用子类:HashSet和treeSet
HashSet底层数据结构是哈希表。
HashSet是如何保证数据的唯一性的呢?
答:是通过元素的两个方法,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();
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接口中的一个内部接口。关系如下:
{ Public static interface Entry { } } Class HashMap { { } } |
最后再总结一下:
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区别?
要实现对一个引用对象进行排序,我们可以使用该对象本身
总结来说:
第一种方式:
第二种方式:
如果元素自身不具备比较性,或者元素自身具备的比较性,不是所需要的,这时可以让集合自身具备比较性。可以定义一个类实现Comparator接口,覆盖compare方法。将该Comparator接口子类对象作为实际参数传递给TreeSet集合构造函数。