面试准备:(集合框架)(Set&&List&&Map)

面试准备:(集合框架)(Set&&List&&Map)

set list 都属于collection的子接口(collection为顶层接口) Map 不属于collection接口

Set接口:  (元素无序,不重复)

HashSet:

(底层:哈希表)

(不同步,线程不安全)

(集合元素可以是null,但是只能放入一个null,因为元素不重复)

如何实现不重复:

通过元素的hashcode和equals来完成,

如果元素的hashCode值相同,才会判断equals是否为true

如果元素的hashc值不同,不会调用equals。

备注:

如果要一个对象放入HashSet中,重写该对象对应类的equals方法,也应该重写HashCode()方法.

(如果不重写的话,会导致这个类不能和集合类结合在一起工作,比如HashMap,HashSet和Hashtable)

 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的hashcode和equals方法。

LinkedHashSet:

根据HashCode()方法来决定元素的存储位置

迭代访问Set中全部元素性能比HashSet好

插入性能比HashSet差。

TreeSet:

(底层:二叉树)

TreeSet是SortedSet接口的唯一实现类,TreeSet可以确保集合元素处于排序状态

判断两个对象不相等的方式:

(两个对象通过equals方法返回false,或者通过CompareTo方法比较没有返回0(保持唯一性的方法))

自然排序:

自然排序使用要排序元素的CompareTo(Object obj)方法来比较元素之间大小关系,然后将元素按照升序排列。

Java提供了一个Comparable接口,该接口里定义了一个compareTo(Object obj)方法,该方法返回一个整数值,实现了该接口的对象就可以比较大小。

obj1.compareTo(obj2)方法

如果返回0,则说明被比较的两个对象相等,

如果返回一个正数,则表明obj1大于obj2,

如果是 负数,则表明obj1小于obj2。

如果我们将两个对象的equals方法总是返回true,则这两个对象的compareTo方法返回应该返回0
 

定制排序:

(比较器:

 * 当元素自身不具备比较性,或者具备的比较性不是所需要的。
 * 这时需要让容器自身具备比较性。
 * 定义了比较器,将比较器对象作为参数传递给TreeSet集合的构造函数。
 * 定义一个类,实现Comparator接口,覆盖compare方法。

自然排序是根据集合元素的大小,以升序排列,如果要定制排序,应该使用Comparator接口,实现 int compare(T o1,T o2)方法

 

List接口:

(元素有序,可重复,可以为null的集合(称之为序列))

ArrayList:(底层:数组)

                 长度可以改变的数组,可以对元素进行随机访问

插入和删除速度慢

LinkedList:(底层:链表数据结构)

插入和删除速度快,访问速度慢

Vector:(底层:数组)(支持线程的同步)

访问速度比ArrayList慢

补充:ListIterator(list特有的迭代器)提供了对List的双向遍历的方法

备注:

 * Collection“
 *          |--List:元素有序
 *                |元素可重复(因为该集合体系有索引)
 *          |--ArrayList:底层的数据结构使用的是数组结构。
 * 
 *               特点:查询速度很快,但是增删稍慢。
 *          
 *               安全性:线程不同步,线程不安全。
 * 
 *               長度:默認的,默认为10。
 * 
 *               扩容:添加元素,默认扩容百分之50延长。
 * 
 *          |--LinkList:底层的数据结构使用的是链表数据结构。
 * 
 *               特点:查询速度稍慢,但是增删很快。
 * 
 *          |--Vector:底层的数据结构使用的是数组结构。
 *   
 *              特点:JDK1.0出现,ArrayLixt:JDK1.2出现,这货太老
 * 
 *              安全性:线程同步,线程安全,被ArrayLixt替代。
 *              
 *              長度:默認的,默认为10。
 *
 *              扩容:添加元素,默认扩容百分之百延长,比较浪费空间。
 * 
 *               |--Set :元素无序 
 *                      |元素不可重复
 * 
 * List:因为List集合中的元素都带角标,所以能增删改查
 * 特有方法:凡是可以操作角标的方法都是该体系特有的方法
 * 
 * 增:
 * add(index,element)
 * addAll(index,Collection)
 * 
 * 删:
 * remoce(index)
 * 
 * 改:
 * set(index,element)
 * 
 * 查:
 * get(index);
 * subList(from,to);
 * listIterator();
 * 
 * List集合特有的迭代器:ListIterator是Iterator的子接口
 * 
 * 在迭代时,不可以通过集合对象的方法操作集合中的元素
 * 因为会发生ConcurrentModificationException并发异常。
 * 
 * 所以,在迭代器时,只能用迭代器的方法操作元素。
 可是Iterator方法是有限的。只能对元素进行判断,取出,删除的操作。
 * 如果想要其他的操作如添加,修改等,
 * 
 * 就需要使用其子接口:ListIterator
 * 该接口只能通过List集合的ListIterator方法获取

Map接口:(不继承collection接口)

HashTable:(底层:哈希表(非null用作键或值))

为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法。

HashMap:(基于散列表的实现

LinkedHashMap: (类似于HashMap,但是迭代遍历它时,取得“键值对”的顺序是其插入次序

TreeMap:(二叉树数据结构的实现)

查看“键”或“键值对”时,它们会被排序(次序由Comparabel或Comparator决定)

得到的结果是被排序的

 * Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。
 * 
 * 1,添加。
 * put(K key, V value)
 * putAll(Map<? extends K,? extends V> m)
 * 
 * 2,删除。
 * clear()
 * remove(Object key)
 * 
 * 3,判断。
 * 判断是否包含该值或者该元素:
 * containsValue(Object value)
 * containsKey(Object key)
 * 判断是否有元素
 * isEmpty()
 * 
 * 4,获取。
 * get(Object key)
 * size()
 * values()
 * 
 * entrySet()
 * keySet()
 * 
 * Map
 *      |--Hashtable:底层是哈希表数据结构,
 * 不同点:
 *      1:不可以存入null键null值。
 *      2:该集合是线程同步的。
 *      3:jdk1.0.效率低。
 * 
 *      |--HashMap:底层是哈希表数据结构,
 * 不同点:
 *      1:允许使用 null 值和 null 键
 *      2:该集合是不同步的。
 *      3:将hashtable替代,jdk1.2.效率高。
 * 
 *      |--TreeMap:底层是二叉树数据结构。
 * 特点:
 *      1:线程不同步。
 *      2:可以用于给map集合中的键进行排序。
 *
 * 和Set很像。
 * 其实大家,Set底层就是使用了Map集合。

备注:

迭代器(Iterator)

提供一种方法访问一个容器(container)对象中各个元素,而又不需暴露该对象的内部细节。
对于遍历一个容器中所有的元素,Iterator模式是首选的方式
Collection定义了Iterator<E> iterator()方法,子类都各自实现了该方法,我们直接调用即可
Map中虽没有定义,我们可以利用map.entrySet()的iterator()方法