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()方法